fez-lisp 1.6.84 → 1.6.85

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/check.js +25 -23
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.84",
5
+ "version": "1.6.85",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -652,31 +652,29 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
652
652
  const rec = resolveGetterRec(rem, env)
653
653
  if (!rec) return true
654
654
  const [times, level, type, types] = resolveGetterRec(rem, env)
655
- const isUnknown = types.at(-1) === UNKNOWN
655
+ const isUnknown =
656
+ types.at(-1) === UNKNOWN || types.at(-1) === COLLECTION
656
657
  if (!isUnknown && times >= level)
657
658
  throw new RangeError(
658
659
  `(${caller}) is trying to access nested structure at level (${level}) which is deeper than it's (${
659
660
  times - 1
660
661
  }) levels at (${stringifyArgs(exp)}) (check #1003)`
661
662
  )
662
- if (times === level - 1) {
663
+ if (times === level - 1)
663
664
  setPropToType(env[name][STATS], prop, {
664
- [TYPE_PROP]: types.length
665
- ? [
666
- type,
667
- new SubType([
668
- types.at(-1) === COLLECTION ? UNKNOWN : types.at(-1)
669
- ])
670
- ]
671
- : [UNKNOWN]
665
+ [TYPE_PROP]:
666
+ types.length && !isUnknown
667
+ ? [type, new SubType([types.at(-1)])]
668
+ : types.at(-1) === COLLECTION
669
+ ? [COLLECTION]
670
+ : [UNKNOWN]
672
671
  })
673
- } else {
672
+ else
674
673
  setPropToType(env[name][STATS], prop, {
675
674
  [TYPE_PROP]: types.length
676
675
  ? [COLLECTION, new SubType(types.slice(times))]
677
676
  : [UNKNOWN]
678
677
  })
679
- }
680
678
  return true
681
679
  }
682
680
  if (
@@ -704,11 +702,10 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
704
702
  setPropToReturn(env[name][STATS], prop, {
705
703
  [RETURNS]: [f, new SubType(r)]
706
704
  })
707
- } else if (rightSub.has(APPLY)) {
705
+ } else if (rightSub.has(APPLY))
708
706
  // TODOD: abstractions go here but what can we do with them
709
707
  // perhaps show the signature?
710
708
  setPropToAbstraction(env[name][STATS], prop)
711
- }
712
709
  }
713
710
  break
714
711
  case WORD:
@@ -739,11 +736,10 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
739
736
  setPropToType(env[name][STATS], prop, {
740
737
  [TYPE_PROP]: [f, new SubType(r)]
741
738
  })
742
- } else if (rightSub.has(APPLY)) {
739
+ } else if (rightSub.has(APPLY))
743
740
  // TODOD: abstractions go here but what can we do with them
744
741
  // perhaps show the signature?
745
742
  setPropToAbstraction(env[name][STATS], prop)
746
- }
747
743
  }
748
744
  }
749
745
  break
@@ -874,6 +870,8 @@ const resolveSetter = (first, rest, env, stack) => {
874
870
  // )
875
871
  }
876
872
  }
873
+ const countLevels = (arr, lvl = -1) =>
874
+ Array.isArray(arr[0]) ? countLevels(arr[0], ++lvl) : lvl
877
875
  const initArrayTypeRec = ({ rem, env }) =>
878
876
  rem.slice(1).map((x) => {
879
877
  if (isLeaf(x))
@@ -906,14 +904,15 @@ const initArrayTypeRec = ({ rem, env }) =>
906
904
  })
907
905
  const initArrayType = ({ rem, env }) => {
908
906
  const ret = initArrayTypeRec({ rem, env })
909
- const known = ret.find((x) => x[0] !== ANY && x[0] !== UNKNOWN)
910
- const isCollection = ret.length && ret[0] && ret[0][0] === COLLECTION
907
+ const flat = ret.flat(Infinity).filter((x) => !isSubType(x))
908
+ const subTypes = ret.flat(Infinity).filter((x) => isSubType(x))
909
+ const known = flat.find((x) => x !== ANY && x !== UNKNOWN)
910
+ const isCollection = ret.length && Array.isArray(ret[0])
911
911
  if (
912
912
  known &&
913
913
  ret.length &&
914
- (Array.isArray(known[0])
915
- ? !ret.some((x) => known[0][0] !== x[0][0])
916
- : !ret.some((x) => known[0] !== x[0]))
914
+ !flat.some((x) => known !== x) &&
915
+ !subTypes.some((x) => subTypes[0].types[0] !== x.types[0])
917
916
  ) {
918
917
  if (Array.isArray(ret[0][0])) {
919
918
  let head = ret[0][0]
@@ -934,7 +933,7 @@ const initArrayType = ({ rem, env }) => {
934
933
  [RETURNS]: [
935
934
  COLLECTION,
936
935
  isCollection
937
- ? new SubType(isSubType(sub) ? [COLLECTION, ...sub] : [COLLECTION])
936
+ ? new SubType(isSubType(sub) ? [...sub] : [COLLECTION])
938
937
  : new SubType(isSubType(sub) ? [...sub] : [main])
939
938
  ]
940
939
  }
@@ -944,7 +943,10 @@ const initArrayType = ({ rem, env }) => {
944
943
  [RETURNS]: [
945
944
  COLLECTION,
946
945
  isCollection
947
- ? new SubType([COLLECTION, UNKNOWN])
946
+ ? new SubType([
947
+ ...Array.from({ length: countLevels(ret) }).fill(COLLECTION),
948
+ UNKNOWN
949
+ ])
948
950
  : new SubType([UNKNOWN])
949
951
  ]
950
952
  }