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.
- package/package.json +1 -1
- package/src/check.js +58 -11
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -17,7 +17,7 @@ import {
|
|
17
17
|
VALUE,
|
18
18
|
WORD
|
19
19
|
} from './keywords.js'
|
20
|
-
import { isLeaf
|
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
|
-
|
627
|
-
|
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
|
645
|
-
|
646
|
-
|
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
|
}
|