fez-lisp 1.6.64 → 1.6.66

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.6.64",
5
+ "version": "1.6.66",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -72,7 +72,6 @@ export const identity = (name) => [
72
72
  ]
73
73
  export const typeSetDefaultFunction = (Types, name, env, exp) =>
74
74
  Types.set(withScope(name, env), () => formatType(name, env))
75
-
76
75
  const returnType = (rest) => {
77
76
  const body = rest.at(-1)
78
77
  const rem = hasBlock(body) ? body.at(-1) : body
@@ -218,6 +217,12 @@ export const setReturnToTypeRef = (stats, value) => {
218
217
  )
219
218
  }
220
219
  export const setStats = (a, b) => (a[STATS] = b[STATS])
220
+ export const cloneStats = (name, x) => ({
221
+ [STATS]: {
222
+ ...x[STATS],
223
+ [SIGNATURE]: name
224
+ }
225
+ })
221
226
  export const setStatsRef = (a, b) => (a[STATS] = b[STATS])
222
227
  export const setTypeToReturnRef = (stats, value) => {
223
228
  // To prevent getters overwritting the array subtype
@@ -607,11 +612,24 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
607
612
  break
608
613
  }
609
614
  }
610
- const resolveGetter = ({ rem, prop, name, env }) => {
615
+ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
611
616
  const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
612
617
  if (!env[array[VALUE]] || !env[name]) return true
613
618
  switch (array[TYPE]) {
614
619
  case APPLY:
620
+ if (
621
+ getReturn(env[array[VALUE]][STATS]) === UNKNOWN ||
622
+ getReturn(env[array[VALUE]][STATS]) === ANY
623
+ )
624
+ return true
625
+ if (getReturn(env[array[VALUE]][STATS]) !== COLLECTION)
626
+ throw new TypeError(
627
+ `Incorrect type of argument (${0}) for (${caller}). Expected (${formatSubType(
628
+ getTypes(env[caller][STATS][ARGUMENTS][0][STATS])
629
+ )}) but got (${formatSubType(
630
+ getReturns(env[array[VALUE]][STATS])
631
+ )}) (${stringifyArgs(exp)}) (check #1001)`
632
+ )
615
633
  if (hasSubReturn(env[array[VALUE]][STATS])) {
616
634
  const rightSub = getSubReturn(env[array[VALUE]][STATS])
617
635
  const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
@@ -629,6 +647,19 @@ const resolveGetter = ({ rem, prop, name, env }) => {
629
647
  break
630
648
  case WORD:
631
649
  {
650
+ if (
651
+ getType(env[array[VALUE]][STATS]) === UNKNOWN ||
652
+ getType(env[array[VALUE]][STATS]) === ANY
653
+ )
654
+ return true
655
+ if (getType(env[array[VALUE]][STATS]) !== COLLECTION)
656
+ throw new TypeError(
657
+ `Incorrect type of argument (${0}) for (${caller}). Expected (${formatSubType(
658
+ getTypes(env[caller][STATS][ARGUMENTS][0][STATS])
659
+ )}) but got (${formatSubType(
660
+ getType(env[array[VALUE]][STATS])
661
+ )}) (${stringifyArgs(exp)}) (check #1002)`
662
+ )
632
663
  if (hasSubType(env[array[VALUE]][STATS])) {
633
664
  const rightSub = getSubType(env[array[VALUE]][STATS])
634
665
  const isAtom =
@@ -687,11 +718,17 @@ const resolveSetter = (first, rest, env, stack) => {
687
718
  case WORD:
688
719
  if (env[right[VALUE]]) {
689
720
  if (hasSubType(env[right[VALUE]][STATS])) {
690
- if (currentSubType.has(UNKNOWN))
691
- current[STATS][TYPE_PROP][1] = new SubType([
692
- ...getSubType(env[right[VALUE]][STATS])
693
- ])
694
- else if (!equalSubTypes(current[STATS], env[right[VALUE]][STATS]))
721
+ if (currentSubType.has(UNKNOWN)) {
722
+ if (env[right[VALUE]][STATS][TYPE_PROP][0] === COLLECTION) {
723
+ current[STATS][TYPE_PROP][1] = new SubType([
724
+ COLLECTION,
725
+ ...getSubType(env[right[VALUE]][STATS]).types
726
+ ])
727
+ } else
728
+ current[STATS][TYPE_PROP][1] = new SubType(
729
+ getSubType(env[right[VALUE]][STATS]).types
730
+ )
731
+ } else if (!equalSubTypes(current[STATS], env[right[VALUE]][STATS]))
695
732
  throw new TypeError(
696
733
  `Incorrect array type at (${
697
734
  first[VALUE]
@@ -701,9 +738,9 @@ const resolveSetter = (first, rest, env, stack) => {
701
738
  getTypes(env[right[VALUE]][STATS])
702
739
  )}) (${stringifyArgs([first, rest])}) (check #198)`
703
740
  )
704
- current[STATS][TYPE_PROP][1] = new SubType(
705
- getSubType(env[right[VALUE]][STATS])
706
- )
741
+ // current[STATS][TYPE_PROP][1] = new SubType(
742
+ // getSubType(env[right[VALUE]][STATS])
743
+ // )
707
744
  } else
708
745
  retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
709
746
  resolveSetter(first, rest, env, stack)
@@ -722,11 +759,17 @@ const resolveSetter = (first, rest, env, stack) => {
722
759
  break
723
760
  }
724
761
  if (hasSubReturn(env[right[VALUE]][STATS])) {
725
- if (currentSubType.has(UNKNOWN))
726
- current[STATS][TYPE_PROP][1] = new SubType([
727
- ...getSubReturn(env[right[VALUE]][STATS])
728
- ])
729
- else if (
762
+ if (currentSubType.has(UNKNOWN)) {
763
+ if (env[right[VALUE]][STATS][RETURNS][0] === COLLECTION) {
764
+ current[STATS][TYPE_PROP][1] = new SubType([
765
+ COLLECTION,
766
+ ...getSubReturn(env[right[VALUE]][STATS]).types
767
+ ])
768
+ } else
769
+ current[STATS][TYPE_PROP][1] = new SubType(
770
+ getSubReturn(env[right[VALUE]][STATS]).types
771
+ )
772
+ } else if (
730
773
  !equalSubTypesWithSubReturn(
731
774
  current[STATS],
732
775
  env[right[VALUE]][STATS]
@@ -741,9 +784,9 @@ const resolveSetter = (first, rest, env, stack) => {
741
784
  getReturns(env[right[VALUE]][STATS])
742
785
  )}) (${stringifyArgs([first, rest])}) (check #198)`
743
786
  )
744
- current[STATS][TYPE_PROP][1] = new SubType([
745
- ...getSubReturn(env[right[VALUE]][STATS])
746
- ])
787
+ // current[STATS][TYPE_PROP][1] = new SubType([
788
+ // ...getSubReturn(env[right[VALUE]][STATS])
789
+ // ])
747
790
  }
748
791
  // else
749
792
  // retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
@@ -753,6 +796,7 @@ const resolveSetter = (first, rest, env, stack) => {
753
796
  break
754
797
  }
755
798
  setTypeToCollection(current[STATS])
799
+
756
800
  // // Retry setting the sub-type if infered it out later
757
801
  // if (!hasSubType(current[STATS]) || getSubType(current[STATS]).has(UNKNOWN))
758
802
  // retry(current[STATS], [first[VALUE], rest], stack, () =>
@@ -852,7 +896,7 @@ const resolveReturnType = ({
852
896
  default:
853
897
  {
854
898
  if (GET_ARRAY_INFERENCE_SET.has(returns[VALUE]))
855
- resolveGetter({ rem, prop, name, env })
899
+ resolveGetter({ rem, prop, name, env, caller: returns[VALUE], exp })
856
900
  checkPredicateNameDeep(name, exp, exp.slice(1), returns)
857
901
  // TODO: DRY
858
902
  const index = env[name][STATS][ARGUMENTS]
@@ -1421,7 +1465,6 @@ export const typeCheck = (
1421
1465
  check(rightHand, env, scope)
1422
1466
  }
1423
1467
  typeSet(Types, name, env, exp)
1424
- // Types.set(withScope(name, env), () => formatType(name, env))
1425
1468
  break
1426
1469
  case KEYWORDS.ANONYMOUS_FUNCTION:
1427
1470
  {