fez-lisp 1.2.50 → 1.2.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +0 -10
- package/src/interpreter.js +0 -31
- package/src/keywords.js +1 -2
- package/src/utils.js +69 -23
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -313,16 +313,6 @@ const compile = (tree, Drill) => {
|
|
313
313
|
Drill
|
314
314
|
)}:${Arguments.length === 3 ? compile(Arguments[2], Drill) : 0});`
|
315
315
|
}
|
316
|
-
case KEYWORDS.CONDITION: {
|
317
|
-
let out = '('
|
318
|
-
for (let i = 0; i < Arguments.length; i += 2)
|
319
|
-
out += `${compile(Arguments[i], Drill)}?${compile(
|
320
|
-
Arguments[i + 1],
|
321
|
-
Drill
|
322
|
-
)}:`
|
323
|
-
out += '0);'
|
324
|
-
return out
|
325
|
-
}
|
326
316
|
case KEYWORDS.THROW: {
|
327
317
|
Drill.Helpers.add('__error')
|
328
318
|
return `__error(${compile(Arguments[0], Drill)})`
|
package/src/interpreter.js
CHANGED
@@ -171,37 +171,6 @@ export const keywords = {
|
|
171
171
|
? evaluate(args[2], env)
|
172
172
|
: 0
|
173
173
|
},
|
174
|
-
[KEYWORDS.CONDITION]: (args, env) => {
|
175
|
-
if (args.length < 2)
|
176
|
-
throw new RangeError(
|
177
|
-
`Invalid number of arguments for (${
|
178
|
-
KEYWORDS.CONDITION
|
179
|
-
}), expected (> 2 required) but got ${args.length} (${
|
180
|
-
KEYWORDS.CONDITION
|
181
|
-
} ${stringifyArgs(args)})`
|
182
|
-
)
|
183
|
-
if (args.length % 2 !== 0)
|
184
|
-
throw new RangeError(
|
185
|
-
`Invalid number of arguments for (${
|
186
|
-
KEYWORDS.CONDITION
|
187
|
-
}), expected even number of arguments but got ${args.length} (${
|
188
|
-
KEYWORDS.CONDITION
|
189
|
-
} ${stringifyArgs(args)})`
|
190
|
-
)
|
191
|
-
for (let i = 0; i < args.length; i += 2) {
|
192
|
-
const condition = evaluate(args[i], env)
|
193
|
-
if (condition !== FALSE && condition !== TRUE)
|
194
|
-
throw new TypeError(
|
195
|
-
`Condition of (${
|
196
|
-
KEYWORDS.CONDITION
|
197
|
-
}) must be ${TRUE} or ${FALSE} but got (${
|
198
|
-
KEYWORDS.CONDITION
|
199
|
-
} ${stringifyArgs(args)})`
|
200
|
-
)
|
201
|
-
if (condition) return evaluate(args[i + 1], env)
|
202
|
-
}
|
203
|
-
return 0
|
204
|
-
},
|
205
174
|
[KEYWORDS.ARRAY_TYPE]: (args, env) => {
|
206
175
|
return args.length ? args.map((x) => evaluate(x, env)) : []
|
207
176
|
},
|
package/src/keywords.js
CHANGED
@@ -15,7 +15,7 @@ export const SUGGAR = {
|
|
15
15
|
LIST_TYPE: 'list',
|
16
16
|
POWER: '**',
|
17
17
|
INTEGER_DEVISION: '//',
|
18
|
-
|
18
|
+
CONDITION: 'cond',
|
19
19
|
RECURSION: 'recursive',
|
20
20
|
CACHE: 'memoized'
|
21
21
|
}
|
@@ -42,7 +42,6 @@ export const KEYWORDS = {
|
|
42
42
|
BLOCK: 'do',
|
43
43
|
ANONYMOUS_FUNCTION: 'lambda',
|
44
44
|
IF: 'if',
|
45
|
-
CONDITION: 'cond',
|
46
45
|
NOT: 'not',
|
47
46
|
EQUAL: '=',
|
48
47
|
LESS_THAN: '<',
|
package/src/utils.js
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
import std from '../lib/baked/std.js'
|
2
2
|
import { comp } from './compiler.js'
|
3
|
-
import {
|
3
|
+
import {
|
4
|
+
APPLY,
|
5
|
+
ATOM,
|
6
|
+
FALSE,
|
7
|
+
KEYWORDS,
|
8
|
+
SUGGAR,
|
9
|
+
TRUE,
|
10
|
+
TYPE,
|
11
|
+
VALUE,
|
12
|
+
WORD
|
13
|
+
} from './keywords.js'
|
4
14
|
import { evaluate, run } from './evaluator.js'
|
5
15
|
import { AST, isLeaf, LISP } from './parser.js'
|
6
16
|
export const logError = (error) =>
|
@@ -385,8 +395,8 @@ export const deSuggar = (ast) => {
|
|
385
395
|
prev[TYPE] === APPLY &&
|
386
396
|
prev[VALUE] !== KEYWORDS.ANONYMOUS_FUNCTION)
|
387
397
|
) {
|
388
|
-
exp[0][
|
389
|
-
exp[0][
|
398
|
+
exp[0][VALUE] = KEYWORDS.CALL_FUNCTION
|
399
|
+
exp[0][TYPE] = APPLY
|
390
400
|
exp.length = 1
|
391
401
|
exp[1] = [
|
392
402
|
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
@@ -437,15 +447,46 @@ export const deSuggar = (ast) => {
|
|
437
447
|
deSuggar(exp)
|
438
448
|
}
|
439
449
|
break
|
450
|
+
case SUGGAR.CONDITION:
|
451
|
+
{
|
452
|
+
if (rest.length < 2)
|
453
|
+
throw new RangeError(
|
454
|
+
`Invalid number of arguments for (${
|
455
|
+
SUGGAR.CONDITION
|
456
|
+
}), expected (> 2 required) but got ${rest.length} (${
|
457
|
+
SUGGAR.CONDITION
|
458
|
+
} ${stringifyArgs(rest)})`
|
459
|
+
)
|
460
|
+
if (rest.length % 2 !== 0)
|
461
|
+
throw new RangeError(
|
462
|
+
`Invalid number of arguments for (${
|
463
|
+
SUGGAR.CONDITION
|
464
|
+
}), expected even number of arguments but got ${
|
465
|
+
rest.length
|
466
|
+
} (${SUGGAR.CONDITION} ${stringifyArgs(rest)})`
|
467
|
+
)
|
468
|
+
exp.length = 0
|
469
|
+
let temp = exp
|
470
|
+
for (let i = 0; i < rest.length; i += 2) {
|
471
|
+
if (i === rest.length - 2) {
|
472
|
+
temp.push([APPLY, KEYWORDS.IF], rest[i], rest.at(-1))
|
473
|
+
} else {
|
474
|
+
temp.push([APPLY, KEYWORDS.IF], rest[i], rest[i + 1], [])
|
475
|
+
temp = temp.at(-1)
|
476
|
+
}
|
477
|
+
}
|
478
|
+
deSuggar(exp)
|
479
|
+
}
|
480
|
+
break
|
440
481
|
case SUGGAR.LIST_TYPE:
|
441
482
|
{
|
442
483
|
exp.length = 0
|
443
484
|
let temp = exp
|
444
485
|
for (const item of rest) {
|
445
|
-
temp.push([
|
486
|
+
temp.push([APPLY, KEYWORDS.ARRAY_TYPE], item, [])
|
446
487
|
temp = temp.at(-1)
|
447
488
|
}
|
448
|
-
temp.push([
|
489
|
+
temp.push([APPLY, KEYWORDS.ARRAY_TYPE])
|
449
490
|
deSuggar(exp)
|
450
491
|
}
|
451
492
|
break
|
@@ -465,7 +506,7 @@ export const deSuggar = (ast) => {
|
|
465
506
|
exp.length = 1
|
466
507
|
exp[0] = [APPLY, KEYWORDS.BITWISE_OR]
|
467
508
|
exp.push([[APPLY, KEYWORDS.DIVISION], ...rest])
|
468
|
-
exp.push([ATOM,
|
509
|
+
exp.push([ATOM, FALSE])
|
469
510
|
}
|
470
511
|
}
|
471
512
|
break
|
@@ -479,23 +520,28 @@ export const deSuggar = (ast) => {
|
|
479
520
|
SUGGAR.POWER
|
480
521
|
} ${stringifyArgs(rest)})`
|
481
522
|
)
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
) {
|
523
|
+
const isExponentAtom = exp[1][TYPE] === ATOM
|
524
|
+
const isPowerAtom = exp[2][TYPE] === ATOM
|
525
|
+
const isExponentWord = exp[1][TYPE] === WORD
|
526
|
+
if ((isExponentWord || isExponentAtom) && isPowerAtom) {
|
486
527
|
exp[0][VALUE] = KEYWORDS.MULTIPLICATION
|
487
528
|
const exponent = exp[1]
|
488
529
|
const power = exp[2][VALUE]
|
489
530
|
exp.length = 1
|
490
|
-
|
491
|
-
.
|
492
|
-
|
493
|
-
|
531
|
+
if (isExponentAtom) {
|
532
|
+
exp.push(exponent, [ATOM, exponent[VALUE] ** (power - 1)])
|
533
|
+
} else if (isExponentWord) {
|
534
|
+
exp.push(
|
535
|
+
...Array.from({ length: power })
|
536
|
+
.fill(0)
|
537
|
+
.map(() => [exponent[TYPE], exponent[VALUE]])
|
538
|
+
)
|
539
|
+
}
|
494
540
|
} else
|
495
541
|
throw new TypeError(
|
496
|
-
`
|
542
|
+
`Second Arguments of (${
|
497
543
|
SUGGAR.POWER
|
498
|
-
}), must be (
|
544
|
+
}), must be (atom) (hint use math:power instead) (${
|
499
545
|
SUGGAR.POWER
|
500
546
|
} ${stringifyArgs(rest)})`
|
501
547
|
)
|
@@ -503,15 +549,15 @@ export const deSuggar = (ast) => {
|
|
503
549
|
break
|
504
550
|
case KEYWORDS.MULTIPLICATION:
|
505
551
|
if (!rest.length) {
|
506
|
-
exp[0][
|
507
|
-
exp[0][
|
552
|
+
exp[0][TYPE] = ATOM
|
553
|
+
exp[0][VALUE] = TRUE
|
508
554
|
}
|
509
555
|
break
|
510
556
|
case KEYWORDS.ADDITION:
|
511
557
|
case KEYWORDS.DIVISION:
|
512
558
|
if (!rest.length) {
|
513
|
-
exp[0][
|
514
|
-
exp[0][
|
559
|
+
exp[0][TYPE] = ATOM
|
560
|
+
exp[0][VALUE] = FALSE
|
515
561
|
}
|
516
562
|
break
|
517
563
|
case SUGGAR.UNLESS:
|
@@ -524,9 +570,9 @@ export const deSuggar = (ast) => {
|
|
524
570
|
SUGGAR.UNLESS
|
525
571
|
} ${stringifyArgs(rest)})`
|
526
572
|
)
|
527
|
-
exp[0][
|
573
|
+
exp[0][VALUE] = KEYWORDS.IF
|
528
574
|
const temp = exp[2]
|
529
|
-
exp[2] = exp[3] ?? [ATOM,
|
575
|
+
exp[2] = exp[3] ?? [ATOM, FALSE]
|
530
576
|
exp[3] = temp
|
531
577
|
}
|
532
578
|
deSuggar(exp)
|
@@ -543,7 +589,7 @@ export const deSuggar = (ast) => {
|
|
543
589
|
exp[0][1]
|
544
590
|
} ${stringifyArgs(rest)})`
|
545
591
|
)
|
546
|
-
exp[0][
|
592
|
+
exp[0][VALUE] = KEYWORDS.NOT
|
547
593
|
exp[1] = [[APPLY, KEYWORDS.EQUAL], exp[1], exp[2]]
|
548
594
|
exp.length = 2
|
549
595
|
deSuggar(exp)
|