fez-lisp 1.5.179 → 1.5.181
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/lib/baked/std-T.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +70 -9
- package/src/types.js +10 -2
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -45,7 +45,8 @@ import {
|
|
45
45
|
BOOLEAN,
|
46
46
|
IS_ARGUMENT,
|
47
47
|
NUMBER,
|
48
|
-
NUMBER_SUBTYPE
|
48
|
+
NUMBER_SUBTYPE,
|
49
|
+
UNKNOWN_SUBTYPE
|
49
50
|
} from './types.js'
|
50
51
|
import {
|
51
52
|
Brr,
|
@@ -161,6 +162,7 @@ export const setProp = (stats, prop, value) => {
|
|
161
162
|
return (
|
162
163
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
163
164
|
value[prop][0] !== UNKNOWN &&
|
165
|
+
value[prop][0] !== ANY &&
|
164
166
|
((stats[prop][0] = value[prop][0]),
|
165
167
|
value[prop][1] && (stats[prop][1] = value[prop][1]))
|
166
168
|
)
|
@@ -169,6 +171,7 @@ export const setPropToReturn = (stats, prop, value) => {
|
|
169
171
|
return (
|
170
172
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
171
173
|
value[RETURNS][0] !== UNKNOWN &&
|
174
|
+
value[RETURNS][0] !== ANY &&
|
172
175
|
((stats[prop][0] = value[RETURNS][0]),
|
173
176
|
value[RETURNS][1] && (stats[prop][1] = value[RETURNS][1]))
|
174
177
|
)
|
@@ -178,6 +181,7 @@ export const setPropToReturnRef = (stats, prop, value) => {
|
|
178
181
|
stats[prop] &&
|
179
182
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
180
183
|
value[RETURNS][0] !== UNKNOWN &&
|
184
|
+
value[RETURNS][0] !== ANY &&
|
181
185
|
(stats[prop] = value[RETURNS])
|
182
186
|
)
|
183
187
|
}
|
@@ -185,6 +189,7 @@ export const setPropToType = (stats, prop, value) => {
|
|
185
189
|
return (
|
186
190
|
stats[prop] &&
|
187
191
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
192
|
+
value[TYPE_PROP][0] !== ANY &&
|
188
193
|
((stats[prop][0] = value[TYPE_PROP][0]),
|
189
194
|
value[TYPE_PROP][1] && (stats[prop][1] = value[TYPE_PROP][1]))
|
190
195
|
)
|
@@ -726,7 +731,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
|
|
726
731
|
setPropToAtom(env[name][STATS], prop)
|
727
732
|
setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
|
728
733
|
} else if (!isAtom && isCollection) {
|
729
|
-
setPropToReturn(env[name][STATS], env[array[VALUE]][STATS])
|
734
|
+
setPropToReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
|
735
|
+
// TODO: handle this nested array overwrite better
|
736
|
+
if (getSubReturn(env[array[VALUE]][STATS]).has(COLLECTION))
|
737
|
+
setPropToSubReturn(env[name][STATS], prop, {
|
738
|
+
[RETURNS]: [COLLECTION, UNKNOWN_SUBTYPE()]
|
739
|
+
})
|
730
740
|
} else return false
|
731
741
|
} else return false
|
732
742
|
break
|
@@ -741,7 +751,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
|
|
741
751
|
setPropToAtom(env[name][STATS], prop)
|
742
752
|
setPropToSubType(env[name][STATS], prop, env[array[VALUE]][STATS])
|
743
753
|
} else if (!isAtom && isCollection) {
|
744
|
-
setPropToType(env[name][STATS], env[array[VALUE]][STATS])
|
754
|
+
setPropToType(env[name][STATS], prop, env[array[VALUE]][STATS])
|
755
|
+
// TODO: handle this nested array overwrite better
|
756
|
+
if (getSubType(env[array[VALUE]][STATS]).has(COLLECTION))
|
757
|
+
setPropToSubType(env[name][STATS], prop, {
|
758
|
+
[TYPE_PROP]: [COLLECTION, UNKNOWN_SUBTYPE()]
|
759
|
+
})
|
745
760
|
} else return false
|
746
761
|
} else return false
|
747
762
|
}
|
@@ -824,10 +839,11 @@ const resolveReturnType = ({
|
|
824
839
|
default:
|
825
840
|
{
|
826
841
|
if (
|
842
|
+
!GETTERS_SET.has(name) &&
|
827
843
|
GETTERS_SET.has(returns[VALUE]) &&
|
828
844
|
!resolveGetter({ rem, prop, name, env })
|
829
845
|
)
|
830
|
-
return
|
846
|
+
return retry(env[name][STATS], [returns, env], stack, () => {
|
831
847
|
resolveReturnType({
|
832
848
|
returns,
|
833
849
|
rem,
|
@@ -1215,10 +1231,10 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1215
1231
|
}
|
1216
1232
|
// Predicate name consistency
|
1217
1233
|
const rightHand = rest.at(-1)
|
1234
|
+
const isApply =
|
1235
|
+
rightHand && rightHand[0] && rightHand[0][TYPE] === APPLY
|
1218
1236
|
if (
|
1219
|
-
|
1220
|
-
rightHand[0] &&
|
1221
|
-
rightHand[0][TYPE] === APPLY &&
|
1237
|
+
isApply &&
|
1222
1238
|
rightHand[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
|
1223
1239
|
) {
|
1224
1240
|
validateLambda(rightHand, name)
|
@@ -1239,6 +1255,49 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1239
1255
|
retry(env[name][STATS], exp, stack, () =>
|
1240
1256
|
check(rightHand, env, exp)
|
1241
1257
|
)
|
1258
|
+
} else if (
|
1259
|
+
isApply &&
|
1260
|
+
rightHand[0][VALUE] === KEYWORDS.CREATE_ARRAY
|
1261
|
+
) {
|
1262
|
+
const right = rightHand[0]
|
1263
|
+
env[name] = {
|
1264
|
+
[STATS]: {
|
1265
|
+
[TYPE_PROP]: [COLLECTION],
|
1266
|
+
[RETURNS]: [UNKNOWN],
|
1267
|
+
[SIGNATURE]: name,
|
1268
|
+
retried: 0,
|
1269
|
+
counter: 0
|
1270
|
+
}
|
1271
|
+
}
|
1272
|
+
setTypeToReturn(env[name][STATS], env[right[VALUE]][STATS])
|
1273
|
+
const resolve = () => {
|
1274
|
+
const body = rightHand
|
1275
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
1276
|
+
const returns = isLeaf(rem) ? rem : rem[0]
|
1277
|
+
resolveReturnType({
|
1278
|
+
stack,
|
1279
|
+
returns,
|
1280
|
+
rem,
|
1281
|
+
prop: TYPE_PROP,
|
1282
|
+
exp,
|
1283
|
+
env,
|
1284
|
+
name,
|
1285
|
+
check
|
1286
|
+
})
|
1287
|
+
}
|
1288
|
+
resolve()
|
1289
|
+
if (isUknownSubType(env[name][STATS]))
|
1290
|
+
stagger(stack, 'prepend', exp, () => {
|
1291
|
+
once(env[name][STATS], exp, stack, () => {
|
1292
|
+
setPropToCollection(env[name][STATS], TYPE_PROP)
|
1293
|
+
setPropToSubReturn(
|
1294
|
+
env[name][STATS],
|
1295
|
+
TYPE_PROP,
|
1296
|
+
initArrayType({ rem: rightHand, env })
|
1297
|
+
)
|
1298
|
+
})
|
1299
|
+
})
|
1300
|
+
check(rightHand, env, scope)
|
1242
1301
|
} else {
|
1243
1302
|
checkPredicateName(exp, rest)
|
1244
1303
|
const isLeafNode = isLeaf(rightHand)
|
@@ -1455,7 +1514,7 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1455
1514
|
resolveSetter(first, rest, env, stack)
|
1456
1515
|
// end of Var ---------------
|
1457
1516
|
// Judgement
|
1458
|
-
|
1517
|
+
const judge = () => {
|
1459
1518
|
if (!isSpecial && env[first[VALUE]] === undefined)
|
1460
1519
|
throw new TypeError(
|
1461
1520
|
`Trying to call undefined (${KEYWORDS.ANONYMOUS_FUNCTION}) ${first[VALUE]} (check #9)`
|
@@ -1745,7 +1804,9 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1745
1804
|
}
|
1746
1805
|
}
|
1747
1806
|
}
|
1748
|
-
}
|
1807
|
+
}
|
1808
|
+
stagger(stack, 'append', [first, env], judge)
|
1809
|
+
stagger(stack, 'prepend', [first, env], judge)
|
1749
1810
|
for (let i = 0; i < rest.length; ++i) {
|
1750
1811
|
const r = rest[i]
|
1751
1812
|
if (isLeaf(r) && r[TYPE] !== ATOM)
|
package/src/types.js
CHANGED
@@ -36,6 +36,7 @@ export const BOOLEAN_SUBTYPE = () => new Set([BOOLEAN])
|
|
36
36
|
export const COLLECTION_SUBTYPE = () => new Set([COLLECTION])
|
37
37
|
export const NUMBER_SUBTYPE = () => new Set([NUMBER])
|
38
38
|
export const ABSTRACTION_SUBTYPE = () => new Set([APPLY])
|
39
|
+
export const UNKNOWN_SUBTYPE = () => new Set([UNKNOWN])
|
39
40
|
|
40
41
|
const SPECIAL_BOOLEAN = BOOLEAN_SUBTYPE()
|
41
42
|
const SPECIAL_COLLECTION = COLLECTION_SUBTYPE()
|
@@ -56,7 +57,7 @@ export const toTypeNames = (type) => {
|
|
56
57
|
return 'Unknown'
|
57
58
|
case COLLECTION:
|
58
59
|
// return 'Array'
|
59
|
-
return '
|
60
|
+
return 'Unknown[]'
|
60
61
|
case ANY:
|
61
62
|
return 'Any'
|
62
63
|
default:
|
@@ -75,13 +76,20 @@ export const toTypeCodes = (type) => {
|
|
75
76
|
return [ATOM, NUMBER_SUBTYPE()]
|
76
77
|
case 'Unknown':
|
77
78
|
return [UNKNOWN]
|
79
|
+
case 'Unknown[]':
|
78
80
|
case 'Unknowns':
|
79
81
|
case 'Collection':
|
80
82
|
return [COLLECTION, new Set([ANY])]
|
81
83
|
case 'Numbers':
|
84
|
+
case 'Number[]':
|
82
85
|
return [COLLECTION, NUMBER_SUBTYPE()]
|
83
86
|
case 'Booleans':
|
87
|
+
case 'Boolean[]':
|
84
88
|
return [COLLECTION, BOOLEAN_SUBTYPE()]
|
89
|
+
case 'Collections':
|
90
|
+
case 'Collection[]':
|
91
|
+
case 'Unknown[][]':
|
92
|
+
return [COLLECTION, COLLECTION_SUBTYPE()]
|
85
93
|
case 'Any':
|
86
94
|
return [ANY]
|
87
95
|
default:
|
@@ -1300,7 +1308,7 @@ export const formatSubType = (T) => {
|
|
1300
1308
|
)
|
1301
1309
|
.join(' ') || toTypeNames(UNKNOWN)
|
1302
1310
|
: toTypeNames(UNKNOWN)
|
1303
|
-
}
|
1311
|
+
}[]`
|
1304
1312
|
case ATOM:
|
1305
1313
|
return `${
|
1306
1314
|
T[1] instanceof Set
|