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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.4.12",
5
+ "version": "1.4.13",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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
- // 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
- } else {
224
- const name = lispToJavaScriptVariableName(n)
225
- Drill.Variables.add(name)
226
- return `${name}=${comp(tail[1], Drill)};`
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 { AST, isLeaf } from './parser.js'
1
+ import { isLeaf } from './parser.js'
2
2
  import {
3
- EXPONENTIATION,
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(...EXPONENTIATION)
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 = exp.at(-1)
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, KEYWORDS.CALL_FUNCTION],
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
- const last = exp.at(-1)
507
- if (
508
- !isLeaf(last) &&
509
- Array.isArray(last) &&
510
- last[0] &&
511
- last[0][TYPE] === APPLY &&
512
- last[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
513
- ) {
514
- const name = exp[1][VALUE]
515
- const prefix = name.split(':')[0]
516
- if (prefix === OPTIMIZATIONS.RECURSION) {
517
- const args = last.slice(1, -1)
518
- const newName = `*${performance
519
- .now()
520
- .toString()
521
- .replace('.', 0)}*`
522
- deepTransform(
523
- (leaf) =>
524
- Array.isArray(leaf) &&
525
- leaf[0] &&
526
- leaf[0][TYPE] === APPLY &&
527
- leaf[0][VALUE] === name,
528
- (leaf) => {
529
- const copy = [...leaf]
530
- leaf.length = 0
531
- copy[0][VALUE] = newName
532
- leaf.push(
533
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
534
- copy
535
- )
536
- },
537
- last
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.ANONYMOUS_FUNCTION],
528
+ [APPLY, KEYWORDS.BLOCK],
543
529
  [
544
- [APPLY, KEYWORDS.BLOCK],
545
- [
546
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
547
- [WORD, newName],
548
- last
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.CALL_FUNCTION],
552
- [WORD, newName],
538
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
539
+ [WORD, '*fn*'],
553
540
  [
554
541
  [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
555
- [WORD, '*fn*'],
542
+ ...args,
556
543
  [
557
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
558
- ...args,
544
+ [APPLY, KEYWORDS.BLOCK],
559
545
  [
560
- [APPLY, KEYWORDS.BLOCK],
546
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
547
+ [WORD, '*res*'],
561
548
  [
562
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
563
- [WORD, '*res*'],
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.CREATE_ARRAY],
566
- [[APPLY, '*fn*'], ...args]
558
+ [APPLY, KEYWORDS.GET_ARRAY],
559
+ [WORD, '*res*'],
560
+ [ATOM, 0]
567
561
  ]
568
562
  ],
569
563
  [
570
- [APPLY, KEYWORDS.LOOP],
564
+ [APPLY, KEYWORDS.SET_ARRAY],
565
+ [WORD, '*res*'],
566
+ [ATOM, 0],
571
567
  [
572
- [APPLY, KEYWORDS.IS_LAMBDA],
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
- deSuggarAst(exp[exp.length - 1])
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, KEYWORDS.CALL_FUNCTION],
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