fez-lisp 1.5.51 → 1.5.52

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.5.51",
5
+ "version": "1.5.52",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -415,7 +415,7 @@ export const typeCheck = (ast) => {
415
415
  [UNKNOWN, PLACEHOLDER],
416
416
  [UNKNOWN, PLACEHOLDER]
417
417
  ],
418
- [RETURNS]: [ATOM]
418
+ [RETURNS]: [UNKNOWN]
419
419
  }
420
420
  },
421
421
  [KEYWORDS.NOT]: {
@@ -587,7 +587,16 @@ export const typeCheck = (ast) => {
587
587
  const re = rem.slice(2)
588
588
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
589
589
  env[name][STATS][prop][0] = ATOM
590
- } else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
590
+ if (
591
+ getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
592
+ getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
593
+ )
594
+ env[name][STATS][RETURNS] = [ATOM, PREDICATE]
595
+ } else if (
596
+ !isLeaf(re[0]) &&
597
+ env[re[0][0][VALUE]] &&
598
+ env[re[0][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
599
+ ) {
591
600
  env[name][STATS][prop] =
592
601
  env[re[0][0][VALUE]][STATS][RETURNS]
593
602
  if (
@@ -603,11 +612,36 @@ export const typeCheck = (ast) => {
603
612
  }
604
613
  }
605
614
  // env[name][STATS] = env[re[0][0][VALUE]][STATS]
615
+ } else if (
616
+ !isLeaf(re[1]) &&
617
+ env[re[1][0][VALUE]] &&
618
+ env[re[1][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
619
+ ) {
620
+ env[name][STATS][prop] =
621
+ env[re[1][0][VALUE]][STATS][RETURNS]
622
+ if (
623
+ re[1][0][TYPE] === APPLY &&
624
+ !name.startsWith(OPTIMIZED_PREFIX)
625
+ ) {
626
+ switch (re[1][0][VALUE]) {
627
+ case KEYWORDS.ANONYMOUS_FUNCTION:
628
+ env[name][STATS][RETURNS] = [UNKNOWN]
629
+ env[name][STATS][ARGS_COUNT] =
630
+ re[1].length - 2
631
+ break
632
+ }
633
+ }
634
+ // env[name][STATS] = env[re[0][0][VALUE]][STATS]
606
635
  } else if (env[re[0][VALUE]]) {
607
636
  env[name][STATS][prop][0] =
608
637
  env[re[0][VALUE]][STATS][TYPE_PROP][0]
609
638
  env[name][STATS][RETURNS][1] =
610
639
  env[re[0][VALUE]][STATS][RETURNS][1]
640
+ } else if (env[re[1][VALUE]]) {
641
+ env[name][STATS][prop][1] =
642
+ env[re[1][VALUE]][STATS][TYPE_PROP][0]
643
+ env[name][STATS][RETURNS][1] =
644
+ env[re[1][VALUE]][STATS][RETURNS][1]
611
645
  } else env[name][STATS][prop] = [UNKNOWN]
612
646
  }
613
647
  break
@@ -924,7 +958,6 @@ export const typeCheck = (ast) => {
924
958
  const alternative = isLeaf(re[1])
925
959
  ? copy[re[1][VALUE]]
926
960
  : copy[re[1][0][VALUE]]
927
-
928
961
  // todo check if condition matches alternative
929
962
  if (
930
963
  concequent &&
package/src/macros.js CHANGED
@@ -11,6 +11,7 @@ import {
11
11
  KEYWORDS,
12
12
  PLACEHOLDER,
13
13
  PREDICATE_SUFFIX,
14
+ STATIC_TYPES,
14
15
  TRUE,
15
16
  TYPE,
16
17
  VALUE,
@@ -529,7 +530,7 @@ export const deSuggarAst = (ast, scope) => {
529
530
  )
530
531
  }
531
532
  const args = last.slice(1, -1)
532
- const newName = `${OPTIMIZED_PREFIX}*${performance
533
+ const newName = `${OPTIMIZED_PREFIX}${name}::*${performance
533
534
  .now()
534
535
  .toString()
535
536
  .replace('.', 0)}*`
@@ -549,76 +550,79 @@ export const deSuggarAst = (ast, scope) => {
549
550
  )
550
551
 
551
552
  exp[exp.length - 1] = [
552
- [APPLY, KEYWORDS.CALL_FUNCTION],
553
+ [APPLY, STATIC_TYPES.UNKNOWN],
553
554
  [
554
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
555
+ [APPLY, KEYWORDS.CALL_FUNCTION],
555
556
  [
556
- [APPLY, KEYWORDS.BLOCK],
557
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
557
558
  [
558
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
559
- [WORD, newName],
560
- last
561
- ],
562
- args.length < 5
563
- ? [
564
- [
565
- APPLY,
566
- `optimization:tail-calls-${args.length}`
567
- ],
568
- [WORD, newName]
569
- ]
570
- : [
571
- [APPLY, KEYWORDS.CALL_FUNCTION],
572
- [WORD, newName],
573
- [
574
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
575
- [WORD, '*fn*'],
559
+ [APPLY, KEYWORDS.BLOCK],
560
+ [
561
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
562
+ [WORD, newName],
563
+ last
564
+ ],
565
+ args.length < 5
566
+ ? [
567
+ [
568
+ APPLY,
569
+ `optimization:tail-calls-${args.length}`
570
+ ],
571
+ [WORD, newName]
572
+ ]
573
+ : [
574
+ [APPLY, KEYWORDS.CALL_FUNCTION],
575
+ [WORD, newName],
576
576
  [
577
577
  [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
578
- ...args,
578
+ [WORD, '*fn*'],
579
579
  [
580
- [APPLY, KEYWORDS.BLOCK],
581
- [
582
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
583
- [WORD, '*res*'],
584
- [
585
- [APPLY, KEYWORDS.CREATE_ARRAY],
586
- [[APPLY, '*fn*'], ...args]
587
- ]
588
- ],
580
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
581
+ ...args,
589
582
  [
590
- [APPLY, KEYWORDS.LOOP],
583
+ [APPLY, KEYWORDS.BLOCK],
591
584
  [
592
- [APPLY, KEYWORDS.IS_LAMBDA],
585
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
586
+ [WORD, '*res*'],
593
587
  [
594
- [APPLY, KEYWORDS.GET_ARRAY],
595
- [WORD, '*res*'],
596
- [ATOM, 0]
588
+ [APPLY, KEYWORDS.CREATE_ARRAY],
589
+ [[APPLY, '*fn*'], ...args]
597
590
  ]
598
591
  ],
599
592
  [
600
- [APPLY, KEYWORDS.SET_ARRAY],
601
- [WORD, '*res*'],
602
- [ATOM, 0],
593
+ [APPLY, KEYWORDS.LOOP],
603
594
  [
604
- [APPLY, KEYWORDS.CALL_FUNCTION],
595
+ [APPLY, KEYWORDS.IS_LAMBDA],
605
596
  [
606
597
  [APPLY, KEYWORDS.GET_ARRAY],
607
598
  [WORD, '*res*'],
608
599
  [ATOM, 0]
609
600
  ]
601
+ ],
602
+ [
603
+ [APPLY, KEYWORDS.SET_ARRAY],
604
+ [WORD, '*res*'],
605
+ [ATOM, 0],
606
+ [
607
+ [APPLY, KEYWORDS.CALL_FUNCTION],
608
+ [
609
+ [APPLY, KEYWORDS.GET_ARRAY],
610
+ [WORD, '*res*'],
611
+ [ATOM, 0]
612
+ ]
613
+ ]
610
614
  ]
615
+ ],
616
+ [
617
+ [APPLY, KEYWORDS.GET_ARRAY],
618
+ [WORD, '*res*'],
619
+ [ATOM, 0]
611
620
  ]
612
- ],
613
- [
614
- [APPLY, KEYWORDS.GET_ARRAY],
615
- [WORD, '*res*'],
616
- [ATOM, 0]
617
621
  ]
618
622
  ]
619
623
  ]
620
624
  ]
621
- ]
625
+ ]
622
626
  ]
623
627
  ]
624
628
  ]
@@ -630,7 +634,7 @@ export const deSuggarAst = (ast, scope) => {
630
634
  )
631
635
  }
632
636
  const args = last.slice(1, -1)
633
- const newName = `${OPTIMIZED_PREFIX}*${performance
637
+ const newName = `${OPTIMIZED_PREFIX}${name}::*${performance
634
638
  .now()
635
639
  .toString()
636
640
  .replace('.', 0)}*`
@@ -647,55 +651,61 @@ export const deSuggarAst = (ast, scope) => {
647
651
  const keyName = newName + ':key'
648
652
 
649
653
  exp[exp.length - 1] = [
650
- [APPLY, KEYWORDS.CALL_FUNCTION],
654
+ [APPLY, STATIC_TYPES.UNKNOWN],
651
655
  [
652
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
656
+ [APPLY, KEYWORDS.CALL_FUNCTION],
653
657
  [
654
- [APPLY, KEYWORDS.BLOCK],
655
- [
656
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
657
- [WORD, memoName],
658
- [[APPLY, 'new:map64']]
659
- ],
658
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
660
659
  [
661
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
662
- [WORD, newName],
660
+ [APPLY, KEYWORDS.BLOCK],
661
+ [
662
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
663
+ [WORD, memoName],
664
+ [[APPLY, 'new:map64']]
665
+ ],
663
666
  [
664
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
665
- ...args,
667
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
668
+ [WORD, newName],
666
669
  [
667
- [APPLY, KEYWORDS.BLOCK],
670
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
671
+ ...args,
668
672
  [
669
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
670
- [WORD, keyName],
673
+ [APPLY, KEYWORDS.BLOCK],
671
674
  [
672
- [APPLY, 'from:string-or-number->key'],
673
- [[APPLY, KEYWORDS.CREATE_ARRAY], ...args]
674
- ]
675
- ],
676
- [
677
- [APPLY, KEYWORDS.IF],
678
- [
679
- [APPLY, 'map:exists?'],
680
- [WORD, memoName],
681
- [WORD, keyName]
682
- ],
683
- [
684
- [APPLY, 'map:get'],
685
- [WORD, memoName],
686
- [WORD, keyName]
675
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
676
+ [WORD, keyName],
677
+ [
678
+ [APPLY, 'from:string-or-number->key'],
679
+ [
680
+ [APPLY, KEYWORDS.CREATE_ARRAY],
681
+ ...args
682
+ ]
683
+ ]
687
684
  ],
688
685
  [
689
- [APPLY, 'map:set-and-get!'],
690
- [WORD, memoName],
691
- [WORD, keyName],
692
- last.at(-1)
686
+ [APPLY, KEYWORDS.IF],
687
+ [
688
+ [APPLY, 'map:exists?'],
689
+ [WORD, memoName],
690
+ [WORD, keyName]
691
+ ],
692
+ [
693
+ [APPLY, 'map:get'],
694
+ [WORD, memoName],
695
+ [WORD, keyName]
696
+ ],
697
+ [
698
+ [APPLY, 'map:set-and-get!'],
699
+ [WORD, memoName],
700
+ [WORD, keyName],
701
+ last.at(-1)
702
+ ]
693
703
  ]
694
704
  ]
695
705
  ]
696
- ]
697
- ],
698
- [WORD, newName]
706
+ ],
707
+ [WORD, newName]
708
+ ]
699
709
  ]
700
710
  ]
701
711
  ]