fez-lisp 1.4.12 → 1.4.14
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 +2 -2
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +24 -25
- package/src/macros.js +153 -102
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -177,7 +177,7 @@ const comp = (tree, Drill) => {
|
|
177
177
|
}
|
178
178
|
case KEYWORDS.DEFINE_VARIABLE: {
|
179
179
|
const n = tail[0][VALUE]
|
180
|
-
const prefix = n.split(':')[0]
|
180
|
+
// const prefix = n.split(':')[0]
|
181
181
|
// if (prefix === OPTIMIZATIONS.RECURSION) {
|
182
182
|
// const name = lispToJavaScriptVariableName(n)
|
183
183
|
// const newName = `${OPTIMIZATIONS.RECURSION}_${performance
|
@@ -201,30 +201,29 @@ const comp = (tree, Drill) => {
|
|
201
201
|
// )})=>{${vars}return ${evaluatedBody.toString().trim()}})));`
|
202
202
|
// } else
|
203
203
|
|
204
|
-
if (prefix === OPTIMIZATIONS.CACHE) {
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
}
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
}
|
204
|
+
// if (prefix === OPTIMIZATIONS.CACHE) {
|
205
|
+
// // memoization here
|
206
|
+
// const name = lispToJavaScriptVariableName(n)
|
207
|
+
// const newName = name.substring(OPTIMIZATIONS.CACHE.length + 1)
|
208
|
+
// Drill.Variables.add(name)
|
209
|
+
// const functionArgs = tail.at(-1).slice(1)
|
210
|
+
// const body = functionArgs.pop()
|
211
|
+
// deepRename(n, newName, body)
|
212
|
+
// const FunctionDrill = { Variables: new Set(), Helpers: Drill.Helpers }
|
213
|
+
// const evaluatedBody = comp(body, FunctionDrill)
|
214
|
+
// const vars = FunctionDrill.Variables.size
|
215
|
+
// ? `var ${[...FunctionDrill.Variables].join(',')};`
|
216
|
+
// : ''
|
217
|
+
// return `(${name}=function(){var __${newName}_map = new Map();var ${newName}=(function(${parseArgs(
|
218
|
+
// functionArgs,
|
219
|
+
// Drill
|
220
|
+
// )}){${vars};var __key=[...arguments].join(',');if(__${newName}_map.has(__key)){return __${newName}_map.get(__key)}else{var __res = ${evaluatedBody
|
221
|
+
// .toString()
|
222
|
+
// .trim()};__${newName}_map.set(__key, __res);return __res}});return ${newName}(...arguments)});`
|
223
|
+
// }
|
224
|
+
const name = lispToJavaScriptVariableName(n)
|
225
|
+
Drill.Variables.add(name)
|
226
|
+
return `${name}=${comp(tail[1], Drill)};`
|
228
227
|
}
|
229
228
|
case KEYWORDS.IS_ATOM:
|
230
229
|
Drill.Helpers.add('atom_predicate')
|
package/src/macros.js
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
import {
|
1
|
+
import { isLeaf } from './parser.js'
|
2
2
|
import {
|
3
|
-
|
3
|
+
EXPONENTIATION_RAW,
|
4
4
|
INTEGER_DIVISION,
|
5
|
-
NOT_EQUAL
|
6
|
-
SLICE
|
5
|
+
NOT_EQUAL
|
7
6
|
} from '../lib/baked/macros.js'
|
8
7
|
import {
|
9
8
|
APPLY,
|
@@ -66,7 +65,7 @@ export const deSuggarAst = (ast, scope) => {
|
|
66
65
|
break
|
67
66
|
case SUGGAR.POWER:
|
68
67
|
exp.length = 0
|
69
|
-
exp.push(...
|
68
|
+
exp.push(...EXPONENTIATION_RAW)
|
70
69
|
break
|
71
70
|
case SUGGAR.INTEGER_DEVISION:
|
72
71
|
exp.length = 0
|
@@ -227,23 +226,13 @@ export const deSuggarAst = (ast, scope) => {
|
|
227
226
|
const exponent = exp[1]
|
228
227
|
const power = exp[2]
|
229
228
|
exp.length = 0
|
230
|
-
exp.push(
|
231
|
-
[0, KEYWORDS.CALL_FUNCTION],
|
232
|
-
exponent,
|
233
|
-
power,
|
234
|
-
EXPONENTIATION
|
235
|
-
)
|
229
|
+
exp.push([APPLY, 'math:power'], exponent, power)
|
236
230
|
}
|
237
231
|
} else {
|
238
232
|
const exponent = exp[1]
|
239
233
|
const power = exp[2]
|
240
234
|
exp.length = 0
|
241
|
-
exp.push(
|
242
|
-
[0, KEYWORDS.CALL_FUNCTION],
|
243
|
-
exponent,
|
244
|
-
power,
|
245
|
-
EXPONENTIATION
|
246
|
-
)
|
235
|
+
exp.push([APPLY, 'math:power'], exponent, power)
|
247
236
|
}
|
248
237
|
deSuggarAst(exp, scope)
|
249
238
|
}
|
@@ -406,9 +395,10 @@ export const deSuggarAst = (ast, scope) => {
|
|
406
395
|
break
|
407
396
|
case KEYWORDS.DEFINE_VARIABLE:
|
408
397
|
{
|
398
|
+
const last = exp.at(-1)
|
409
399
|
if (!isLeaf(exp[1]) && exp[1][0][TYPE] === APPLY) {
|
410
400
|
const left = exp[1].slice(1)
|
411
|
-
const right =
|
401
|
+
const right = last
|
412
402
|
let newScope
|
413
403
|
if (exp[1][0][VALUE] === SUGGAR.CREATE_LIST) {
|
414
404
|
const lastLeft = left.pop()
|
@@ -491,10 +481,9 @@ export const deSuggarAst = (ast, scope) => {
|
|
491
481
|
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
492
482
|
lastLeft,
|
493
483
|
[
|
494
|
-
[APPLY,
|
484
|
+
[APPLY, 'array:drop'],
|
495
485
|
right,
|
496
|
-
[ATOM, indexes.at(-1)[0] + 1]
|
497
|
-
SLICE
|
486
|
+
[ATOM, indexes.at(-1)[0] + 1]
|
498
487
|
]
|
499
488
|
])
|
500
489
|
}
|
@@ -502,99 +491,93 @@ export const deSuggarAst = (ast, scope) => {
|
|
502
491
|
exp.iron = true
|
503
492
|
exp.push(newScope)
|
504
493
|
deSuggarAst(scope)
|
505
|
-
} else
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
)
|
514
|
-
|
515
|
-
const
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
)
|
539
|
-
exp[exp.length - 1] = [
|
540
|
-
[APPLY, KEYWORDS.CALL_FUNCTION],
|
494
|
+
} else if (
|
495
|
+
!isLeaf(last) &&
|
496
|
+
Array.isArray(last) &&
|
497
|
+
last[0] &&
|
498
|
+
last[0][TYPE] === APPLY &&
|
499
|
+
last[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
|
500
|
+
) {
|
501
|
+
const name = exp[1][VALUE]
|
502
|
+
const prefix = name.split(':')[0]
|
503
|
+
if (prefix === OPTIMIZATIONS.RECURSION) {
|
504
|
+
const args = last.slice(1, -1)
|
505
|
+
const newName = `*${performance
|
506
|
+
.now()
|
507
|
+
.toString()
|
508
|
+
.replace('.', 0)}*`
|
509
|
+
deepTransform(
|
510
|
+
(leaf) =>
|
511
|
+
Array.isArray(leaf) &&
|
512
|
+
leaf[0] &&
|
513
|
+
leaf[0][TYPE] === APPLY &&
|
514
|
+
leaf[0][VALUE] === name,
|
515
|
+
(leaf) => {
|
516
|
+
const copy = [...leaf]
|
517
|
+
leaf.length = 0
|
518
|
+
copy[0][VALUE] = newName
|
519
|
+
leaf.push([APPLY, KEYWORDS.ANONYMOUS_FUNCTION], copy)
|
520
|
+
},
|
521
|
+
last
|
522
|
+
)
|
523
|
+
exp[exp.length - 1] = [
|
524
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
525
|
+
[
|
526
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
541
527
|
[
|
542
|
-
[APPLY, KEYWORDS.
|
528
|
+
[APPLY, KEYWORDS.BLOCK],
|
543
529
|
[
|
544
|
-
[APPLY, KEYWORDS.
|
545
|
-
[
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
],
|
530
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
531
|
+
[WORD, newName],
|
532
|
+
last
|
533
|
+
],
|
534
|
+
[
|
535
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
536
|
+
[WORD, newName],
|
550
537
|
[
|
551
|
-
[APPLY, KEYWORDS.
|
552
|
-
[WORD,
|
538
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
539
|
+
[WORD, '*fn*'],
|
553
540
|
[
|
554
541
|
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
555
|
-
|
542
|
+
...args,
|
556
543
|
[
|
557
|
-
[APPLY, KEYWORDS.
|
558
|
-
...args,
|
544
|
+
[APPLY, KEYWORDS.BLOCK],
|
559
545
|
[
|
560
|
-
[APPLY, KEYWORDS.
|
546
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
547
|
+
[WORD, '*res*'],
|
561
548
|
[
|
562
|
-
[APPLY, KEYWORDS.
|
563
|
-
[
|
549
|
+
[APPLY, KEYWORDS.CREATE_ARRAY],
|
550
|
+
[[APPLY, '*fn*'], ...args]
|
551
|
+
]
|
552
|
+
],
|
553
|
+
[
|
554
|
+
[APPLY, KEYWORDS.LOOP],
|
555
|
+
[
|
556
|
+
[APPLY, KEYWORDS.IS_LAMBDA],
|
564
557
|
[
|
565
|
-
[APPLY, KEYWORDS.
|
566
|
-
[
|
558
|
+
[APPLY, KEYWORDS.GET_ARRAY],
|
559
|
+
[WORD, '*res*'],
|
560
|
+
[ATOM, 0]
|
567
561
|
]
|
568
562
|
],
|
569
563
|
[
|
570
|
-
[APPLY, KEYWORDS.
|
564
|
+
[APPLY, KEYWORDS.SET_ARRAY],
|
565
|
+
[WORD, '*res*'],
|
566
|
+
[ATOM, 0],
|
571
567
|
[
|
572
|
-
[APPLY, KEYWORDS.
|
568
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
573
569
|
[
|
574
570
|
[APPLY, KEYWORDS.GET_ARRAY],
|
575
571
|
[WORD, '*res*'],
|
576
572
|
[ATOM, 0]
|
577
573
|
]
|
578
|
-
],
|
579
|
-
[
|
580
|
-
[APPLY, KEYWORDS.SET_ARRAY],
|
581
|
-
[WORD, '*res*'],
|
582
|
-
[ATOM, 0],
|
583
|
-
[
|
584
|
-
[APPLY, KEYWORDS.CALL_FUNCTION],
|
585
|
-
[
|
586
|
-
[APPLY, KEYWORDS.GET_ARRAY],
|
587
|
-
[WORD, '*res*'],
|
588
|
-
[ATOM, 0]
|
589
|
-
]
|
590
|
-
]
|
591
574
|
]
|
592
|
-
],
|
593
|
-
[
|
594
|
-
[APPLY, KEYWORDS.GET_ARRAY],
|
595
|
-
[WORD, '*res*'],
|
596
|
-
[ATOM, 0]
|
597
575
|
]
|
576
|
+
],
|
577
|
+
[
|
578
|
+
[APPLY, KEYWORDS.GET_ARRAY],
|
579
|
+
[WORD, '*res*'],
|
580
|
+
[ATOM, 0]
|
598
581
|
]
|
599
582
|
]
|
600
583
|
]
|
@@ -602,8 +585,80 @@ export const deSuggarAst = (ast, scope) => {
|
|
602
585
|
]
|
603
586
|
]
|
604
587
|
]
|
605
|
-
|
606
|
-
|
588
|
+
]
|
589
|
+
deSuggarAst(exp[exp.length - 1])
|
590
|
+
} else if (prefix === OPTIMIZATIONS.CACHE) {
|
591
|
+
// TODO: Make this
|
592
|
+
const args = last.slice(1, -1)
|
593
|
+
const newName = `*${performance
|
594
|
+
.now()
|
595
|
+
.toString()
|
596
|
+
.replace('.', 0)}*`
|
597
|
+
deepTransform(
|
598
|
+
(leaf) =>
|
599
|
+
Array.isArray(leaf) &&
|
600
|
+
leaf[0] &&
|
601
|
+
leaf[0][TYPE] === APPLY &&
|
602
|
+
leaf[0][VALUE] === name,
|
603
|
+
(leaf) => (leaf[0][VALUE] = newName),
|
604
|
+
last
|
605
|
+
)
|
606
|
+
const memoName = newName + ':memo'
|
607
|
+
const keyName = newName + ':key'
|
608
|
+
|
609
|
+
exp[exp.length - 1] = [
|
610
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
611
|
+
[
|
612
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
613
|
+
[
|
614
|
+
[APPLY, KEYWORDS.BLOCK],
|
615
|
+
[
|
616
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
617
|
+
[WORD, memoName],
|
618
|
+
[[APPLY, 'new:map64']]
|
619
|
+
],
|
620
|
+
[
|
621
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
622
|
+
[WORD, newName],
|
623
|
+
[
|
624
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
625
|
+
...args,
|
626
|
+
[
|
627
|
+
[APPLY, KEYWORDS.BLOCK],
|
628
|
+
[
|
629
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
630
|
+
[WORD, keyName],
|
631
|
+
[
|
632
|
+
[APPLY, 'from:string-or-number->key'],
|
633
|
+
[[APPLY, KEYWORDS.CREATE_ARRAY], ...args]
|
634
|
+
]
|
635
|
+
],
|
636
|
+
[
|
637
|
+
[APPLY, KEYWORDS.IF],
|
638
|
+
[
|
639
|
+
[APPLY, 'map:exists?'],
|
640
|
+
[WORD, memoName],
|
641
|
+
[WORD, keyName]
|
642
|
+
],
|
643
|
+
[
|
644
|
+
[APPLY, 'map:get'],
|
645
|
+
[WORD, memoName],
|
646
|
+
[WORD, keyName]
|
647
|
+
],
|
648
|
+
[
|
649
|
+
[APPLY, 'map:set-and-get!'],
|
650
|
+
[WORD, memoName],
|
651
|
+
[WORD, keyName],
|
652
|
+
last.at(-1)
|
653
|
+
]
|
654
|
+
]
|
655
|
+
]
|
656
|
+
]
|
657
|
+
],
|
658
|
+
[WORD, newName]
|
659
|
+
]
|
660
|
+
]
|
661
|
+
]
|
607
662
|
}
|
608
663
|
}
|
609
664
|
}
|
@@ -623,12 +678,10 @@ export const deSuggarAst = (ast, scope) => {
|
|
623
678
|
const left = exp[i].slice(1)
|
624
679
|
const right = [WORD, `_arg${i}`]
|
625
680
|
const lastLeft = left.pop()
|
626
|
-
|
627
681
|
const vars = left
|
628
682
|
const indexes = vars
|
629
683
|
.map((x, i) => [x, i])
|
630
684
|
.filter((x) => x[0][VALUE] !== PLACEHOLDER)
|
631
|
-
|
632
685
|
newBlock.push(
|
633
686
|
...indexes.map(([name, n]) => {
|
634
687
|
let wrap = right
|
@@ -661,7 +714,6 @@ export const deSuggarAst = (ast, scope) => {
|
|
661
714
|
wrap
|
662
715
|
])
|
663
716
|
}
|
664
|
-
|
665
717
|
left[0][TYPE] = WORD
|
666
718
|
exp[i] = right
|
667
719
|
exp[i].length = 2
|
@@ -688,10 +740,9 @@ export const deSuggarAst = (ast, scope) => {
|
|
688
740
|
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
689
741
|
lastLeft,
|
690
742
|
[
|
691
|
-
[APPLY,
|
743
|
+
[APPLY, 'array:drop'],
|
692
744
|
right,
|
693
|
-
[ATOM, indexes.at(-1)[0] + 1]
|
694
|
-
SLICE
|
745
|
+
[ATOM, indexes.at(-1)[0] + 1]
|
695
746
|
]
|
696
747
|
])
|
697
748
|
exp[i] = right
|