fez-lisp 1.3.0 → 1.3.1
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/lib/baked/macros.js +144 -0
- package/package.json +1 -1
- package/src/compiler.js +2 -18
- package/src/interpreter.js +24 -34
- package/src/utils.js +19 -163
@@ -0,0 +1,144 @@
|
|
1
|
+
export const EXPONENTIATION = [
|
2
|
+
[0, 'lambda'],
|
3
|
+
[1, 'base'],
|
4
|
+
[1, 'exp'],
|
5
|
+
[
|
6
|
+
[0, 'do'],
|
7
|
+
[
|
8
|
+
[0, 'let'],
|
9
|
+
[1, 'power'],
|
10
|
+
[
|
11
|
+
[0, 'lambda'],
|
12
|
+
[1, 'base'],
|
13
|
+
[1, 'exp'],
|
14
|
+
[
|
15
|
+
[0, 'if'],
|
16
|
+
[
|
17
|
+
[0, '<'],
|
18
|
+
[1, 'exp'],
|
19
|
+
[2, 0]
|
20
|
+
],
|
21
|
+
[
|
22
|
+
[0, 'if'],
|
23
|
+
[
|
24
|
+
[0, '='],
|
25
|
+
[1, 'base'],
|
26
|
+
[2, 0]
|
27
|
+
],
|
28
|
+
[
|
29
|
+
[0, 'throw'],
|
30
|
+
[
|
31
|
+
[0, 'array'],
|
32
|
+
[2, 66],
|
33
|
+
[2, 97],
|
34
|
+
[2, 115],
|
35
|
+
[2, 101],
|
36
|
+
[2, 32],
|
37
|
+
[2, 99],
|
38
|
+
[2, 97],
|
39
|
+
[2, 110],
|
40
|
+
[2, 39],
|
41
|
+
[2, 116],
|
42
|
+
[2, 32],
|
43
|
+
[2, 98],
|
44
|
+
[2, 101],
|
45
|
+
[2, 32],
|
46
|
+
[2, 48],
|
47
|
+
[2, 32],
|
48
|
+
[2, 105],
|
49
|
+
[2, 102],
|
50
|
+
[2, 32],
|
51
|
+
[2, 101],
|
52
|
+
[2, 120],
|
53
|
+
[2, 112],
|
54
|
+
[2, 111],
|
55
|
+
[2, 110],
|
56
|
+
[2, 101],
|
57
|
+
[2, 110],
|
58
|
+
[2, 116],
|
59
|
+
[2, 32],
|
60
|
+
[2, 105],
|
61
|
+
[2, 115],
|
62
|
+
[2, 32],
|
63
|
+
[2, 60],
|
64
|
+
[2, 32],
|
65
|
+
[2, 48]
|
66
|
+
]
|
67
|
+
],
|
68
|
+
[
|
69
|
+
[0, '/'],
|
70
|
+
[
|
71
|
+
[0, '*'],
|
72
|
+
[1, 'base'],
|
73
|
+
[
|
74
|
+
[0, 'power'],
|
75
|
+
[1, 'base'],
|
76
|
+
[
|
77
|
+
[0, '-'],
|
78
|
+
[
|
79
|
+
[0, '*'],
|
80
|
+
[1, 'exp'],
|
81
|
+
[2, -1]
|
82
|
+
],
|
83
|
+
[2, 1]
|
84
|
+
]
|
85
|
+
]
|
86
|
+
]
|
87
|
+
]
|
88
|
+
],
|
89
|
+
[
|
90
|
+
[0, 'if'],
|
91
|
+
[
|
92
|
+
[0, '='],
|
93
|
+
[1, 'exp'],
|
94
|
+
[2, 0]
|
95
|
+
],
|
96
|
+
[2, 1],
|
97
|
+
[
|
98
|
+
[0, 'if'],
|
99
|
+
[
|
100
|
+
[0, '='],
|
101
|
+
[1, 'exp'],
|
102
|
+
[2, 1]
|
103
|
+
],
|
104
|
+
[1, 'base'],
|
105
|
+
[
|
106
|
+
[0, 'if'],
|
107
|
+
[[2, 1]],
|
108
|
+
[
|
109
|
+
[0, '*'],
|
110
|
+
[1, 'base'],
|
111
|
+
[
|
112
|
+
[0, 'power'],
|
113
|
+
[1, 'base'],
|
114
|
+
[
|
115
|
+
[0, '-'],
|
116
|
+
[1, 'exp'],
|
117
|
+
[2, 1]
|
118
|
+
]
|
119
|
+
]
|
120
|
+
]
|
121
|
+
]
|
122
|
+
]
|
123
|
+
]
|
124
|
+
]
|
125
|
+
]
|
126
|
+
],
|
127
|
+
[
|
128
|
+
[0, 'power'],
|
129
|
+
[1, 'base'],
|
130
|
+
[1, 'exp']
|
131
|
+
]
|
132
|
+
]
|
133
|
+
]
|
134
|
+
export const FLOOR = [
|
135
|
+
[
|
136
|
+
[0, 'lambda'],
|
137
|
+
[1, 'n'],
|
138
|
+
[
|
139
|
+
[0, '|'],
|
140
|
+
[1, 'n'],
|
141
|
+
[2, 0]
|
142
|
+
]
|
143
|
+
]
|
144
|
+
]
|
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -86,24 +86,8 @@ const Helpers = {
|
|
86
86
|
__lt: '__lt=(a,b)=>+(a<b)',
|
87
87
|
array: 'array=(...args)=>args',
|
88
88
|
not: 'not=(a)=>+!a',
|
89
|
-
and: `and=(
|
90
|
-
|
91
|
-
for(let i=0; i<args.length-1;++i){
|
92
|
-
circuit=args[i]
|
93
|
-
if(circuit) continue
|
94
|
-
else return 0
|
95
|
-
}
|
96
|
-
return args.at(-1) ? 1 : 0
|
97
|
-
}`,
|
98
|
-
or: `or=(...args)=>{
|
99
|
-
let circuit;
|
100
|
-
for(let i=0;i<args.length-1;++i) {
|
101
|
-
circuit = args[i]
|
102
|
-
if(circuit) return 1
|
103
|
-
else continue
|
104
|
-
}
|
105
|
-
return args.at(-1) ? 1 : 0
|
106
|
-
}`,
|
89
|
+
and: `and=(a, b)=>+(a&&b)`,
|
90
|
+
or: `or=(a, b)=>+(a||b)`,
|
107
91
|
log_effect: `log_effect=(msg)=>{console.log(msg);return msg}`,
|
108
92
|
log_char_effect: `log_char_effect=(msg)=>{console.log(String.fromCharCode(msg));return msg}`,
|
109
93
|
log_string_effect: `log_string_effect=(msg)=>{console.log(msg.map(x=>String.fromCharCode(x)).join(''));return msg}`,
|
package/src/interpreter.js
CHANGED
@@ -432,28 +432,22 @@ export const keywords = {
|
|
432
432
|
KEYWORDS.AND
|
433
433
|
} ${stringifyArgs(args)})`
|
434
434
|
)
|
435
|
-
|
436
|
-
|
437
|
-
circuit = evaluate(args[i], env)
|
438
|
-
if (circuit !== FALSE && circuit !== TRUE)
|
439
|
-
throw new TypeError(
|
440
|
-
`Condition of (${
|
441
|
-
KEYWORDS.AND
|
442
|
-
}) must be ${TRUE} or ${FALSE} but got (${
|
443
|
-
KEYWORDS.AND
|
444
|
-
} ${stringifyArgs(args)})`
|
445
|
-
)
|
446
|
-
if (circuit) continue
|
447
|
-
else return 0
|
448
|
-
}
|
449
|
-
const end = evaluate(args.at(-1), env)
|
450
|
-
if (end !== FALSE && end !== TRUE)
|
435
|
+
const a = evaluate(args[0], env)
|
436
|
+
if (a !== FALSE && a !== TRUE)
|
451
437
|
throw new TypeError(
|
452
|
-
`Condition of (${KEYWORDS.
|
453
|
-
KEYWORDS.
|
438
|
+
`Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
|
439
|
+
KEYWORDS.OR
|
454
440
|
} ${stringifyArgs(args)})`
|
455
441
|
)
|
456
|
-
return
|
442
|
+
if (!a) return 0
|
443
|
+
const b = evaluate(args[1], env)
|
444
|
+
if (b !== FALSE && b !== TRUE)
|
445
|
+
throw new TypeError(
|
446
|
+
`Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
|
447
|
+
KEYWORDS.OR
|
448
|
+
} ${stringifyArgs(args)})`
|
449
|
+
)
|
450
|
+
return b
|
457
451
|
},
|
458
452
|
[KEYWORDS.OR]: (args, env) => {
|
459
453
|
if (args.length !== 2)
|
@@ -462,26 +456,22 @@ export const keywords = {
|
|
462
456
|
KEYWORDS.OR
|
463
457
|
} ${stringifyArgs(args)})`
|
464
458
|
)
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
else continue
|
476
|
-
}
|
477
|
-
const end = evaluate(args.at(-1), env)
|
478
|
-
if (end !== FALSE && end !== TRUE)
|
459
|
+
const a = evaluate(args[0], env)
|
460
|
+
if (a !== FALSE && a !== TRUE)
|
461
|
+
throw new TypeError(
|
462
|
+
`Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
|
463
|
+
KEYWORDS.OR
|
464
|
+
} ${stringifyArgs(args)})`
|
465
|
+
)
|
466
|
+
if (a) return 1
|
467
|
+
const b = evaluate(args[1], env)
|
468
|
+
if (b !== FALSE && b !== TRUE)
|
479
469
|
throw new TypeError(
|
480
470
|
`Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
|
481
471
|
KEYWORDS.OR
|
482
472
|
} ${stringifyArgs(args)})`
|
483
473
|
)
|
484
|
-
return
|
474
|
+
return b
|
485
475
|
},
|
486
476
|
[KEYWORDS.CALL_FUNCTION]: (args, env) => {
|
487
477
|
if (!args.length)
|
package/src/utils.js
CHANGED
@@ -13,6 +13,7 @@ import {
|
|
13
13
|
} from './keywords.js'
|
14
14
|
import { evaluate, run } from './evaluator.js'
|
15
15
|
import { AST, isLeaf, LISP } from './parser.js'
|
16
|
+
import { EXPONENTIATION, FLOOR } from '../lib/baked/macros.js'
|
16
17
|
export const logError = (error) =>
|
17
18
|
console.log('\x1b[31m', `\n${error}\n`, '\x1b[0m')
|
18
19
|
export const logSuccess = (output) => console.log(output, '\x1b[0m')
|
@@ -362,139 +363,7 @@ export const js = (source, deps) => {
|
|
362
363
|
])
|
363
364
|
return `${top}${program}`
|
364
365
|
}
|
365
|
-
|
366
|
-
[0, 'lambda'],
|
367
|
-
[1, 'base'],
|
368
|
-
[1, 'exp'],
|
369
|
-
[
|
370
|
-
[0, 'do'],
|
371
|
-
[
|
372
|
-
[0, 'let'],
|
373
|
-
[1, 'power'],
|
374
|
-
[
|
375
|
-
[0, 'lambda'],
|
376
|
-
[1, 'base'],
|
377
|
-
[1, 'exp'],
|
378
|
-
[
|
379
|
-
[0, 'if'],
|
380
|
-
[
|
381
|
-
[0, '<'],
|
382
|
-
[1, 'exp'],
|
383
|
-
[2, 0]
|
384
|
-
],
|
385
|
-
[
|
386
|
-
[0, 'if'],
|
387
|
-
[
|
388
|
-
[0, '='],
|
389
|
-
[1, 'base'],
|
390
|
-
[2, 0]
|
391
|
-
],
|
392
|
-
[
|
393
|
-
[0, 'throw'],
|
394
|
-
[
|
395
|
-
[0, 'array'],
|
396
|
-
[2, 66],
|
397
|
-
[2, 97],
|
398
|
-
[2, 115],
|
399
|
-
[2, 101],
|
400
|
-
[2, 32],
|
401
|
-
[2, 99],
|
402
|
-
[2, 97],
|
403
|
-
[2, 110],
|
404
|
-
[2, 39],
|
405
|
-
[2, 116],
|
406
|
-
[2, 32],
|
407
|
-
[2, 98],
|
408
|
-
[2, 101],
|
409
|
-
[2, 32],
|
410
|
-
[2, 48],
|
411
|
-
[2, 32],
|
412
|
-
[2, 105],
|
413
|
-
[2, 102],
|
414
|
-
[2, 32],
|
415
|
-
[2, 101],
|
416
|
-
[2, 120],
|
417
|
-
[2, 112],
|
418
|
-
[2, 111],
|
419
|
-
[2, 110],
|
420
|
-
[2, 101],
|
421
|
-
[2, 110],
|
422
|
-
[2, 116],
|
423
|
-
[2, 32],
|
424
|
-
[2, 105],
|
425
|
-
[2, 115],
|
426
|
-
[2, 32],
|
427
|
-
[2, 60],
|
428
|
-
[2, 32],
|
429
|
-
[2, 48]
|
430
|
-
]
|
431
|
-
],
|
432
|
-
[
|
433
|
-
[0, '/'],
|
434
|
-
[
|
435
|
-
[0, '*'],
|
436
|
-
[1, 'base'],
|
437
|
-
[
|
438
|
-
[0, 'power'],
|
439
|
-
[1, 'base'],
|
440
|
-
[
|
441
|
-
[0, '-'],
|
442
|
-
[
|
443
|
-
[0, '*'],
|
444
|
-
[1, 'exp'],
|
445
|
-
[2, -1]
|
446
|
-
],
|
447
|
-
[2, 1]
|
448
|
-
]
|
449
|
-
]
|
450
|
-
]
|
451
|
-
]
|
452
|
-
],
|
453
|
-
[
|
454
|
-
[0, 'if'],
|
455
|
-
[
|
456
|
-
[0, '='],
|
457
|
-
[1, 'exp'],
|
458
|
-
[2, 0]
|
459
|
-
],
|
460
|
-
[2, 1],
|
461
|
-
[
|
462
|
-
[0, 'if'],
|
463
|
-
[
|
464
|
-
[0, '='],
|
465
|
-
[1, 'exp'],
|
466
|
-
[2, 1]
|
467
|
-
],
|
468
|
-
[1, 'base'],
|
469
|
-
[
|
470
|
-
[0, 'if'],
|
471
|
-
[[2, 1]],
|
472
|
-
[
|
473
|
-
[0, '*'],
|
474
|
-
[1, 'base'],
|
475
|
-
[
|
476
|
-
[0, 'power'],
|
477
|
-
[1, 'base'],
|
478
|
-
[
|
479
|
-
[0, '-'],
|
480
|
-
[1, 'exp'],
|
481
|
-
[2, 1]
|
482
|
-
]
|
483
|
-
]
|
484
|
-
]
|
485
|
-
]
|
486
|
-
]
|
487
|
-
]
|
488
|
-
]
|
489
|
-
]
|
490
|
-
],
|
491
|
-
[
|
492
|
-
[0, 'power'],
|
493
|
-
[1, 'base'],
|
494
|
-
[1, 'exp']
|
495
|
-
]
|
496
|
-
]
|
497
|
-
]
|
366
|
+
|
498
367
|
export const deSuggar = (ast) => {
|
499
368
|
if (ast.length === 0) throw new SyntaxError(`No expressions to evaluate`)
|
500
369
|
// for (const node of ast)
|
@@ -514,22 +383,7 @@ export const deSuggar = (ast) => {
|
|
514
383
|
break
|
515
384
|
case SUGGAR.INTEGER_DEVISION:
|
516
385
|
exp.length = 0
|
517
|
-
exp.push(
|
518
|
-
...[
|
519
|
-
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
520
|
-
[WORD, 'a'],
|
521
|
-
[WORD, 'b'],
|
522
|
-
[
|
523
|
-
[APPLY, KEYWORDS.BITWISE_OR],
|
524
|
-
[
|
525
|
-
[APPLY, KEYWORDS.DIVISION],
|
526
|
-
[WORD, 'a'],
|
527
|
-
[WORD, 'b']
|
528
|
-
],
|
529
|
-
[ATOM, 0]
|
530
|
-
]
|
531
|
-
]
|
532
|
-
)
|
386
|
+
exp.push(...FLOOR)
|
533
387
|
break
|
534
388
|
}
|
535
389
|
}
|
@@ -638,17 +492,10 @@ export const deSuggar = (ast) => {
|
|
638
492
|
SUGGAR.INTEGER_DEVISION
|
639
493
|
} ${stringifyArgs(rest)})`
|
640
494
|
)
|
641
|
-
else if (rest.some((x) => x[TYPE] === APPLY))
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
}), must be (or atom word) (hint use (math:floor (${
|
646
|
-
KEYWORDS.DIVISION
|
647
|
-
} a b)) instead) (${
|
648
|
-
SUGGAR.INTEGER_DEVISION
|
649
|
-
} ${stringifyArgs(rest)})`
|
650
|
-
)
|
651
|
-
else {
|
495
|
+
else if (rest.some((x) => x[TYPE] === APPLY)) {
|
496
|
+
exp.length = 0
|
497
|
+
exp.push([0, KEYWORDS.CALL_FUNCTION], FLOOR, ...rest)
|
498
|
+
} else {
|
652
499
|
exp.length = 1
|
653
500
|
exp[0] = [APPLY, KEYWORDS.BITWISE_OR]
|
654
501
|
exp.push([[APPLY, KEYWORDS.DIVISION], ...rest])
|
@@ -680,13 +527,23 @@ export const deSuggar = (ast) => {
|
|
680
527
|
const exponent = exp[1]
|
681
528
|
const power = exp[2]
|
682
529
|
exp.length = 0
|
683
|
-
exp.push(
|
530
|
+
exp.push(
|
531
|
+
[0, KEYWORDS.CALL_FUNCTION],
|
532
|
+
EXPONENTIATION,
|
533
|
+
exponent,
|
534
|
+
power
|
535
|
+
)
|
684
536
|
}
|
685
537
|
} else {
|
686
538
|
const exponent = exp[1]
|
687
539
|
const power = exp[2]
|
688
540
|
exp.length = 0
|
689
|
-
exp.push(
|
541
|
+
exp.push(
|
542
|
+
[0, KEYWORDS.CALL_FUNCTION],
|
543
|
+
EXPONENTIATION,
|
544
|
+
exponent,
|
545
|
+
power
|
546
|
+
)
|
690
547
|
}
|
691
548
|
deSuggar(exp)
|
692
549
|
}
|
@@ -798,7 +655,6 @@ export const deSuggar = (ast) => {
|
|
798
655
|
}
|
799
656
|
deSuggar(exp)
|
800
657
|
break
|
801
|
-
|
802
658
|
case SUGGAR.NOT_EQUAL_1:
|
803
659
|
case SUGGAR.NOT_EQUAL_2:
|
804
660
|
{
|