fez-lisp 1.5.147 → 1.5.148

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 +58 -11
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.147",
5
+ "version": "1.5.148",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  VALUE,
18
18
  WORD
19
19
  } from './keywords.js'
20
- import { isLeaf, LISP } from './parser.js'
20
+ import { isLeaf } from './parser.js'
21
21
  import {
22
22
  SPECIAL_FORM_TYPES,
23
23
  toTypeNames,
@@ -612,20 +612,48 @@ const resolveSetter = (first, rest, env, stack) => {
612
612
  const name = rest[0][VALUE]
613
613
  const current = env[name]
614
614
  const right = isLeaf(rest.at(-1)) ? rest.at(-1) : rest.at(-1)[0]
615
+ const currentSubType = hasSubType(current[STATS])
616
+ ? getSubType(current[STATS])
617
+ : new Set([UNKNOWN])
615
618
  switch (right[TYPE]) {
616
619
  case ATOM:
620
+ if (!currentSubType.has(UNKNOWN) && !currentSubType.has(NUMBER))
621
+ throw new TypeError(
622
+ `Incorrect array type at (${
623
+ first[VALUE]
624
+ }). ${name} is (${formatSubType(
625
+ getTypes(current[STATS])
626
+ )}) but insertion is (${formatSubType([
627
+ ATOM,
628
+ NUMBER_SUBTYPE()
629
+ ])}) (${stringifyArgs([first, rest])}) (check #199)`
630
+ )
617
631
  current[STATS][TYPE_PROP][1] = NUMBER_SUBTYPE()
618
632
  break
619
633
  case WORD:
620
634
  if (env[right[VALUE]]) {
621
- if (hasSubType(env[right[VALUE]][STATS]))
635
+ if (hasSubType(env[right[VALUE]][STATS])) {
636
+ if (currentSubType.has(UNKNOWN))
637
+ current[STATS][TYPE_PROP][1] = new Set([
638
+ ...getSubType(env[right[VALUE]][STATS])
639
+ ])
640
+ else if (!equalSubTypes(current[STATS], env[right[VALUE]][STATS]))
641
+ throw new TypeError(
642
+ `Incorrect array type at (${
643
+ first[VALUE]
644
+ }). ${name} is (${formatSubType(
645
+ getTypes(current[STATS])
646
+ )}) but insertion is (${formatSubType(
647
+ getTypes(env[right[VALUE]][STATS])
648
+ )}) (${stringifyArgs([first, rest])}) (check #198)`
649
+ )
622
650
  current[STATS][TYPE_PROP][1] = new Set(
623
651
  getSubType(env[right[VALUE]][STATS])
624
652
  )
625
- else
626
- current[STATS][TYPE_PROP][1] = new Set([
627
- getType(env[right[VALUE]][STATS])
628
- ])
653
+ } else
654
+ retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
655
+ resolveSetter(first, rest, env, stack)
656
+ )
629
657
  }
630
658
  break
631
659
  case APPLY:
@@ -637,14 +665,33 @@ const resolveSetter = (first, rest, env, stack) => {
637
665
  })[RETURNS][1]
638
666
  break
639
667
  }
640
- if (hasSubReturn(env[right[VALUE]][STATS]))
668
+ if (hasSubReturn(env[right[VALUE]][STATS])) {
669
+ if (currentSubType.has(UNKNOWN))
670
+ current[STATS][TYPE_PROP][1] = new Set([
671
+ ...getSubReturn(env[right[VALUE]][STATS])
672
+ ])
673
+ else if (
674
+ !equalSubTypesWithSubReturn(
675
+ current[STATS],
676
+ env[right[VALUE]][STATS]
677
+ )
678
+ )
679
+ throw new TypeError(
680
+ `Incorrect array type at (${
681
+ first[VALUE]
682
+ }). ${name} is (${formatSubType(
683
+ getTypes(current[STATS])
684
+ )}) but insertion is (${formatSubType(
685
+ getReturns(env[right[VALUE]][STATS])
686
+ )}) (${stringifyArgs([first, rest])}) (check #198)`
687
+ )
641
688
  current[STATS][TYPE_PROP][1] = new Set([
642
689
  ...getSubReturn(env[right[VALUE]][STATS])
643
690
  ])
644
- else if (!isUnknownReturn(env[right[VALUE]][STATS]))
645
- current[STATS][TYPE_PROP][1] = new Set([
646
- getReturn(env[right[VALUE]][STATS])
647
- ])
691
+ } else
692
+ retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
693
+ resolveSetter(first, rest, env, stack)
694
+ )
648
695
  }
649
696
  break
650
697
  }