fez-lisp 1.6.65 → 1.6.67

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 +43 -4
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.65",
5
+ "version": "1.6.67",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -612,11 +612,24 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
612
612
  break
613
613
  }
614
614
  }
615
- const resolveGetter = ({ rem, prop, name, env }) => {
615
+ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
616
616
  const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
617
617
  if (!env[array[VALUE]] || !env[name]) return true
618
618
  switch (array[TYPE]) {
619
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
+ )
620
633
  if (hasSubReturn(env[array[VALUE]][STATS])) {
621
634
  const rightSub = getSubReturn(env[array[VALUE]][STATS])
622
635
  const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
@@ -634,6 +647,19 @@ const resolveGetter = ({ rem, prop, name, env }) => {
634
647
  break
635
648
  case WORD:
636
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
+ )
637
663
  if (hasSubType(env[array[VALUE]][STATS])) {
638
664
  const rightSub = getSubType(env[array[VALUE]][STATS])
639
665
  const isAtom =
@@ -802,6 +828,7 @@ const initArrayTypeRec = ({ rem, env }) => {
802
828
  const initArrayType = ({ rem, env }) => {
803
829
  const ret = initArrayTypeRec({ rem, env })
804
830
  const known = ret.find((x) => x[0] !== ANY && x[0] !== UNKNOWN)
831
+ const isCollection = ret.length && ret[0] && ret[0][0] === COLLECTION
805
832
  if (known && ret.length) {
806
833
  if (Array.isArray(ret[0][0])) {
807
834
  let head = ret[0][0]
@@ -818,12 +845,24 @@ const initArrayType = ({ rem, env }) => {
818
845
  if (isSubType(sub) && sub.types.at(-1) === COLLECTION) sub.types.pop()
819
846
  return {
820
847
  [TYPE_PROP]: [APPLY],
821
- [RETURNS]: [COLLECTION, new SubType(isSubType(sub) ? [...sub] : [main])]
848
+ [RETURNS]: [
849
+ COLLECTION,
850
+ isCollection
851
+ ? new SubType(
852
+ isSubType(sub) ? [COLLECTION, ...sub] : [COLLECTION, main]
853
+ )
854
+ : new SubType(isSubType(sub) ? [...sub] : [main])
855
+ ]
822
856
  }
823
857
  } else
824
858
  return {
825
859
  [TYPE_PROP]: [APPLY],
826
- [RETURNS]: [COLLECTION, new SubType([UNKNOWN])]
860
+ [RETURNS]: [
861
+ COLLECTION,
862
+ isCollection
863
+ ? new SubType([COLLECTION, UNKNOWN])
864
+ : new SubType([UNKNOWN])
865
+ ]
827
866
  }
828
867
  }
829
868
  const resolveReturnType = ({
@@ -870,7 +909,7 @@ const resolveReturnType = ({
870
909
  default:
871
910
  {
872
911
  if (GET_ARRAY_INFERENCE_SET.has(returns[VALUE]))
873
- resolveGetter({ rem, prop, name, env })
912
+ resolveGetter({ rem, prop, name, env, caller: returns[VALUE], exp })
874
913
  checkPredicateNameDeep(name, exp, exp.slice(1), returns)
875
914
  // TODO: DRY
876
915
  const index = env[name][STATS][ARGUMENTS]