fez-lisp 1.6.67 → 1.6.69
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 +69 -7
- package/src/macros.js +25 -0
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -612,11 +612,63 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
|
|
612
612
|
break
|
613
613
|
}
|
614
614
|
}
|
615
|
+
const resolveGetterRec = ([head, tail], env, times = 0) => {
|
616
|
+
if (GET_ARRAY_INFERENCE_SET.has(head[VALUE])) {
|
617
|
+
return resolveGetterRec(tail, env, ++times)
|
618
|
+
} else {
|
619
|
+
switch (head) {
|
620
|
+
case APPLY:
|
621
|
+
break
|
622
|
+
case WORD:
|
623
|
+
{
|
624
|
+
if (env[tail][STATS][TYPE_PROP][0] === UNKNOWN) return
|
625
|
+
const types = env[tail][STATS][TYPE_PROP][1].types
|
626
|
+
const sub = types.at(-1)
|
627
|
+
const type =
|
628
|
+
sub === ATOM || sub === NUMBER || sub === BOOLEAN
|
629
|
+
? ATOM
|
630
|
+
: sub === APPLY
|
631
|
+
? APPLY
|
632
|
+
: COLLECTION
|
633
|
+
const len = types.length ? types.length + 1 : times + 1
|
634
|
+
return [times, len, type, types]
|
635
|
+
}
|
636
|
+
break
|
637
|
+
}
|
638
|
+
}
|
639
|
+
}
|
615
640
|
const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
616
641
|
const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
|
617
642
|
if (!env[array[VALUE]] || !env[name]) return true
|
618
643
|
switch (array[TYPE]) {
|
619
644
|
case APPLY:
|
645
|
+
// TODO: figure out recursively what is the inner type of all nested getters
|
646
|
+
if (GET_ARRAY_INFERENCE_SET.has(array[VALUE])) {
|
647
|
+
const rec = resolveGetterRec(rem, env)
|
648
|
+
if (!rec) return true
|
649
|
+
const [times, level, type, types] = resolveGetterRec(rem, env)
|
650
|
+
if (times >= level)
|
651
|
+
throw new RangeError(
|
652
|
+
`(${caller}) is trying to access nested structure at level (${level}) which is deeper than it's (${times}) levels at (${stringifyArgs(
|
653
|
+
exp
|
654
|
+
)}) (check #1003)`
|
655
|
+
)
|
656
|
+
if (times === level - 1) {
|
657
|
+
setPropToType(env[name][STATS], prop, {
|
658
|
+
[TYPE_PROP]: types.length
|
659
|
+
? [type, new SubType([types.at(-1)])]
|
660
|
+
: [UNKNOWN]
|
661
|
+
})
|
662
|
+
} else {
|
663
|
+
setPropToType(env[name][STATS], prop, {
|
664
|
+
[TYPE_PROP]: types.length
|
665
|
+
? [COLLECTION, new SubType(types.slice(times))]
|
666
|
+
: [UNKNOWN]
|
667
|
+
})
|
668
|
+
}
|
669
|
+
return true
|
670
|
+
}
|
671
|
+
|
620
672
|
if (
|
621
673
|
getReturn(env[array[VALUE]][STATS]) === UNKNOWN ||
|
622
674
|
getReturn(env[array[VALUE]][STATS]) === ANY
|
@@ -642,8 +694,12 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
|
642
694
|
setPropToReturn(env[name][STATS], prop, {
|
643
695
|
[RETURNS]: [f, new SubType(r)]
|
644
696
|
})
|
645
|
-
} else
|
646
|
-
|
697
|
+
} else if (rightSub.has(APPLY)) {
|
698
|
+
// TODOD: abstractions go here but what can we do with them
|
699
|
+
// perhaps show the signature?
|
700
|
+
setPropToAbstraction(env[name][STATS], prop)
|
701
|
+
}
|
702
|
+
}
|
647
703
|
break
|
648
704
|
case WORD:
|
649
705
|
{
|
@@ -673,8 +729,12 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
|
673
729
|
setPropToType(env[name][STATS], prop, {
|
674
730
|
[TYPE_PROP]: [f, new SubType(r)]
|
675
731
|
})
|
676
|
-
} else
|
677
|
-
|
732
|
+
} else if (rightSub.has(APPLY)) {
|
733
|
+
// TODOD: abstractions go here but what can we do with them
|
734
|
+
// perhaps show the signature?
|
735
|
+
setPropToAbstraction(env[name][STATS], prop)
|
736
|
+
}
|
737
|
+
}
|
678
738
|
}
|
679
739
|
break
|
680
740
|
}
|
@@ -835,11 +895,13 @@ const initArrayType = ({ rem, env }) => {
|
|
835
895
|
ret[0].length = 0
|
836
896
|
const subT = new SubType([COLLECTION])
|
837
897
|
ret[0].push(COLLECTION, subT)
|
838
|
-
while (head && !isSubType(head[1])) {
|
839
|
-
subT.
|
898
|
+
while (Array.isArray(head) && !isSubType(head[1])) {
|
899
|
+
if (head[0] === APPLY) subT.types.push(APPLY)
|
900
|
+
else subT.add(COLLECTION)
|
840
901
|
head = head[0]
|
841
902
|
}
|
842
|
-
if (head && head[1].types.length)
|
903
|
+
if (Array.isArray(head) && head[1].types.length)
|
904
|
+
subT.add(head[1].types[0])
|
843
905
|
}
|
844
906
|
const [main, sub] = ret[0]
|
845
907
|
if (isSubType(sub) && sub.types.at(-1) === COLLECTION) sub.types.pop()
|
package/src/macros.js
CHANGED
@@ -114,10 +114,35 @@ export const deSuggarAst = (ast, scope) => {
|
|
114
114
|
// }
|
115
115
|
// }
|
116
116
|
// break
|
117
|
+
case PLACEHOLDER:
|
118
|
+
{
|
119
|
+
exp.length = 0
|
120
|
+
rest.reverse()
|
121
|
+
let temp = exp
|
122
|
+
for (let i = 0; i < rest.length; i += 1) {
|
123
|
+
if (i < rest.length - 1) {
|
124
|
+
temp.push([APPLY, SUGGAR.GET_ARRAY], [], rest[i])
|
125
|
+
temp = temp.at(-2)
|
126
|
+
} else temp.push(...rest[i])
|
127
|
+
}
|
128
|
+
deSuggarAst(exp, scope)
|
129
|
+
}
|
130
|
+
break
|
117
131
|
case KEYWORDS.GET_ARRAY:
|
118
132
|
if (rest.length === 1) {
|
119
133
|
exp[0][VALUE] = 'math:var-get'
|
120
134
|
// exp.push([ATOM, 0])
|
135
|
+
} else if (rest.length > 2) {
|
136
|
+
exp.length = 0
|
137
|
+
rest.reverse()
|
138
|
+
let temp = exp
|
139
|
+
for (let i = 0; i < rest.length; i += 1) {
|
140
|
+
if (i < rest.length - 1) {
|
141
|
+
temp.push([APPLY, SUGGAR.GET_ARRAY], [], rest[i])
|
142
|
+
temp = temp.at(-2)
|
143
|
+
} else temp.push(...rest[i])
|
144
|
+
}
|
145
|
+
deSuggarAst(exp, scope)
|
121
146
|
}
|
122
147
|
break
|
123
148
|
case SUGGAR.INCREMENT:
|