fez-lisp 1.6.53 → 1.6.55
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/README.md +6 -0
- package/lib/baked/std-T.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +60 -0
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -599,6 +599,56 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
|
|
599
599
|
break
|
600
600
|
}
|
601
601
|
}
|
602
|
+
const resolveGetter = ({ rem, prop, name, env }) => {
|
603
|
+
const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
|
604
|
+
if (!env[array[VALUE]] || !env[name]) return true
|
605
|
+
|
606
|
+
switch (array[TYPE]) {
|
607
|
+
case APPLY:
|
608
|
+
if (hasSubType(env[array[VALUE]][STATS])) {
|
609
|
+
const rightSub = getSubReturn(env[array[VALUE]][STATS])
|
610
|
+
const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
|
611
|
+
const isCollection = rightSub.has(COLLECTION)
|
612
|
+
if (isAtom && !isCollection) {
|
613
|
+
setPropToAtom(env[name][STATS], prop)
|
614
|
+
setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
|
615
|
+
} else if (!isAtom && isCollection) {
|
616
|
+
setPropToReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
|
617
|
+
// TODO: handle this nested array overwrite better
|
618
|
+
if (getSubReturn(env[array[VALUE]][STATS]).has(COLLECTION))
|
619
|
+
setPropToSubReturn(env[name][STATS], prop, {
|
620
|
+
[RETURNS]: [COLLECTION, UNKNOWN_SUBTYPE()]
|
621
|
+
})
|
622
|
+
} else return false
|
623
|
+
} else return false
|
624
|
+
break
|
625
|
+
case WORD:
|
626
|
+
{
|
627
|
+
if (hasSubType(env[array[VALUE]][STATS])) {
|
628
|
+
const rightSub = getSubType(env[array[VALUE]][STATS])
|
629
|
+
const isAtom =
|
630
|
+
rightSub.has(ATOM) || rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
|
631
|
+
const isCollection = rightSub.has(COLLECTION)
|
632
|
+
if (isAtom && !isCollection) {
|
633
|
+
setPropToAtom(env[name][STATS], prop)
|
634
|
+
setPropToSubType(env[name][STATS], prop, env[array[VALUE]][STATS])
|
635
|
+
} else if (!isAtom && isCollection) {
|
636
|
+
setPropToType(env[name][STATS], prop, {
|
637
|
+
[TYPE_PROP]: [
|
638
|
+
env[array[VALUE]][STATS][TYPE_PROP][1].types[0],
|
639
|
+
new SubType(
|
640
|
+
env[array[VALUE]][STATS][TYPE_PROP][1].types.slice(1)
|
641
|
+
)
|
642
|
+
]
|
643
|
+
})
|
644
|
+
} else return false
|
645
|
+
} else return false
|
646
|
+
}
|
647
|
+
break
|
648
|
+
}
|
649
|
+
return true
|
650
|
+
}
|
651
|
+
|
602
652
|
const resolveSetter = (first, rest, env, stack) => {
|
603
653
|
if (
|
604
654
|
getSuffix(first[VALUE]) === MUTATION_SUFFIX &&
|
@@ -798,6 +848,8 @@ const resolveReturnType = ({
|
|
798
848
|
break
|
799
849
|
default:
|
800
850
|
{
|
851
|
+
if (returns[VALUE] === 'array:get')
|
852
|
+
resolveGetter({ rem, prop, name, env })
|
801
853
|
// if (
|
802
854
|
// !GETTERS_SET.has(name) &&
|
803
855
|
// GETTERS_SET.has(returns[VALUE]) &&
|
@@ -1483,6 +1535,14 @@ export const typeCheck = (
|
|
1483
1535
|
// Setters are just like DEFINE_VARIABLE as they are essentially the Var case for Collections
|
1484
1536
|
// So they MUST happen before Judgement
|
1485
1537
|
resolveSetter(first, rest, env, stack)
|
1538
|
+
if (first[VALUE] === 'array:get-infer' && first[TYPE] === APPLY) {
|
1539
|
+
resolveGetter({
|
1540
|
+
rem: rest[0],
|
1541
|
+
prop: TYPE_PROP,
|
1542
|
+
name: rest[0],
|
1543
|
+
env
|
1544
|
+
})
|
1545
|
+
}
|
1486
1546
|
// end of Var ---------------
|
1487
1547
|
// Judgement
|
1488
1548
|
const judge = () => {
|