fez-lisp 1.4.12 → 1.4.13
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 +150 -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,77 @@ 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
|
+
[[APPLY, KEYWORDS.CREATE_ARRAY], ...args]
|
632
|
+
],
|
633
|
+
[
|
634
|
+
[APPLY, KEYWORDS.IF],
|
635
|
+
[
|
636
|
+
[APPLY, 'map:has?'],
|
637
|
+
[WORD, memoName],
|
638
|
+
[WORD, keyName]
|
639
|
+
],
|
640
|
+
[
|
641
|
+
[APPLY, 'map:get'],
|
642
|
+
[WORD, memoName],
|
643
|
+
[WORD, keyName]
|
644
|
+
],
|
645
|
+
[
|
646
|
+
[APPLY, 'map:set-and-get!'],
|
647
|
+
[WORD, memoName],
|
648
|
+
[WORD, keyName],
|
649
|
+
last.at(-1)
|
650
|
+
]
|
651
|
+
]
|
652
|
+
]
|
653
|
+
]
|
654
|
+
],
|
655
|
+
[WORD, newName]
|
656
|
+
]
|
657
|
+
]
|
658
|
+
]
|
607
659
|
}
|
608
660
|
}
|
609
661
|
}
|
@@ -623,12 +675,10 @@ export const deSuggarAst = (ast, scope) => {
|
|
623
675
|
const left = exp[i].slice(1)
|
624
676
|
const right = [WORD, `_arg${i}`]
|
625
677
|
const lastLeft = left.pop()
|
626
|
-
|
627
678
|
const vars = left
|
628
679
|
const indexes = vars
|
629
680
|
.map((x, i) => [x, i])
|
630
681
|
.filter((x) => x[0][VALUE] !== PLACEHOLDER)
|
631
|
-
|
632
682
|
newBlock.push(
|
633
683
|
...indexes.map(([name, n]) => {
|
634
684
|
let wrap = right
|
@@ -661,7 +711,6 @@ export const deSuggarAst = (ast, scope) => {
|
|
661
711
|
wrap
|
662
712
|
])
|
663
713
|
}
|
664
|
-
|
665
714
|
left[0][TYPE] = WORD
|
666
715
|
exp[i] = right
|
667
716
|
exp[i].length = 2
|
@@ -688,10 +737,9 @@ export const deSuggarAst = (ast, scope) => {
|
|
688
737
|
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
689
738
|
lastLeft,
|
690
739
|
[
|
691
|
-
[APPLY,
|
740
|
+
[APPLY, 'array:drop'],
|
692
741
|
right,
|
693
|
-
[ATOM, indexes.at(-1)[0] + 1]
|
694
|
-
SLICE
|
742
|
+
[ATOM, indexes.at(-1)[0] + 1]
|
695
743
|
]
|
696
744
|
])
|
697
745
|
exp[i] = right
|