fez-lisp 1.5.136 → 1.5.138
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.js +1 -1
- package/package.json +1 -1
- package/src/check.js +31 -28
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -45,7 +45,8 @@ import {
|
|
45
45
|
PREDICATE,
|
46
46
|
IS_ARGUMENT,
|
47
47
|
NUMBER,
|
48
|
-
SETTER
|
48
|
+
SETTER,
|
49
|
+
NUMBER_SUBTYPE
|
49
50
|
} from './types.js'
|
50
51
|
import {
|
51
52
|
Brr,
|
@@ -129,14 +130,14 @@ export const isTypeAbstraction = (stats) => stats[TYPE_PROP] === APPLY
|
|
129
130
|
export const setPropToAtom = (stats, prop) => {
|
130
131
|
return (
|
131
132
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
132
|
-
(stats[prop][0] = ATOM)
|
133
|
+
((stats[prop][0] = ATOM), (stats[prop][1] = NUMBER_SUBTYPE()))
|
133
134
|
)
|
134
135
|
}
|
135
136
|
export const setPropToPredicate = (stats, prop) => {
|
136
137
|
return (stats[prop][1] = BOOLEAN_SUBTYPE())
|
137
138
|
}
|
138
139
|
export const setReturnToPredicate = (stats) => {
|
139
|
-
return (stats[RETURNS][
|
140
|
+
return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
|
140
141
|
}
|
141
142
|
export const setTypeToPredicate = (stats) => {
|
142
143
|
return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
|
@@ -194,11 +195,13 @@ export const setPropToTypeRef = (stats, prop, value) => {
|
|
194
195
|
}
|
195
196
|
export const setReturnToAtom = (stats) => {
|
196
197
|
return (
|
197
|
-
(isUnknownReturn(stats) || isAnyReturn(stats)) &&
|
198
|
+
(isUnknownReturn(stats) || isAnyReturn(stats)) &&
|
199
|
+
((stats[RETURNS][0] = ATOM), (stats[RETURNS][1] = NUMBER_SUBTYPE()))
|
198
200
|
)
|
199
201
|
}
|
200
202
|
export const setTypeToAtom = (stats) =>
|
201
|
-
(isUnknownType(stats) || isAnyType(stats)) &&
|
203
|
+
(isUnknownType(stats) || isAnyType(stats)) &&
|
204
|
+
((stats[TYPE_PROP][0] = ATOM), (stats[TYPE_PROP][1] = NUMBER_SUBTYPE()))
|
202
205
|
export const setTypeToCollection = (stats) =>
|
203
206
|
(isUnknownType(stats) || isAnyType(stats)) &&
|
204
207
|
(stats[TYPE_PROP][0] = COLLECTION)
|
@@ -221,10 +224,13 @@ export const setReturnToTypeRef = (stats, value) => {
|
|
221
224
|
}
|
222
225
|
export const setStatsRef = (a, b) => (a[STATS] = b[STATS])
|
223
226
|
export const setTypeToReturnRef = (stats, value) => {
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
227
|
+
// To prevent getters overwritting the array subtype
|
228
|
+
// Change main type if uknown
|
229
|
+
if (isUnknownType(stats) || isAnyType(stats))
|
230
|
+
stats[TYPE_PROP][0] = value[RETURNS][0]
|
231
|
+
// cange sub type if it doesn't have
|
232
|
+
if (!hasSubType(stats) || getSubType(stats).has(UNKNOWN))
|
233
|
+
stats[TYPE_PROP][1] = value[RETURNS][1]
|
228
234
|
}
|
229
235
|
export const setPropRef = (stats, prop, value) => {
|
230
236
|
return (
|
@@ -421,16 +427,15 @@ const withScope = (name, scope) => {
|
|
421
427
|
const chain = getScopeNames(scope)
|
422
428
|
return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
|
423
429
|
}
|
424
|
-
const retry = (stats, ctx, stack, cb) => {
|
430
|
+
const retry = (stats, ctx, stack, cb, method = 'prepend') => {
|
425
431
|
if (
|
426
432
|
(isUnknownNotAnyType(stats) || isUnknownNotAnyReturn(stats)) &&
|
427
433
|
stats.retried < MAX_RETRY_DEFINITION
|
428
434
|
) {
|
429
435
|
stats.retried += 1
|
430
|
-
stagger(stack,
|
436
|
+
stagger(stack, method, ctx, cb)
|
431
437
|
}
|
432
438
|
}
|
433
|
-
|
434
439
|
const retryArgs = (stats, ctx, stack, cb) => {
|
435
440
|
if (stats.counter < MAX_ARGUMENT_RETRY) {
|
436
441
|
stats.counter++
|
@@ -547,7 +552,7 @@ const resolveCondition = ({ rem, name, env, exp, prop }) => {
|
|
547
552
|
break
|
548
553
|
}
|
549
554
|
}
|
550
|
-
const resolveSetter = (first, rest, env) => {
|
555
|
+
const resolveSetter = (first, rest, env, stack) => {
|
551
556
|
if (
|
552
557
|
getSuffix(first[VALUE]) === MUTATION_SUFFIX &&
|
553
558
|
MUTATORS_SET.has(first[VALUE]) &&
|
@@ -561,7 +566,7 @@ const resolveSetter = (first, rest, env) => {
|
|
561
566
|
const right = isLeaf(rest.at(-1)) ? rest.at(-1) : rest.at(-1)[0]
|
562
567
|
switch (right[TYPE]) {
|
563
568
|
case ATOM:
|
564
|
-
current[STATS][TYPE_PROP][1] =
|
569
|
+
current[STATS][TYPE_PROP][1] = NUMBER_SUBTYPE()
|
565
570
|
break
|
566
571
|
case WORD:
|
567
572
|
if (env[right[VALUE]]) {
|
@@ -596,6 +601,11 @@ const resolveSetter = (first, rest, env) => {
|
|
596
601
|
break
|
597
602
|
}
|
598
603
|
setTypeToCollection(current[STATS])
|
604
|
+
// Retry setting the sub-type if infered it out later
|
605
|
+
if (!hasSubType(current[STATS]) || getSubType(current[STATS]).has(UNKNOWN))
|
606
|
+
retry(current[STATS], [first[VALUE], rest], stack, () =>
|
607
|
+
resolveSetter(first, rest, env, stack)
|
608
|
+
)
|
599
609
|
}
|
600
610
|
}
|
601
611
|
const resolveGetter = ({ rem, prop, name, env }) => {
|
@@ -667,11 +677,9 @@ const initArrayType = ({ rem, env }) => {
|
|
667
677
|
[RETURNS]: [COLLECTION, new Set([])]
|
668
678
|
}
|
669
679
|
}
|
670
|
-
const
|
671
|
-
if (returns[TYPE] === ATOM)
|
672
|
-
|
673
|
-
setPropToAtom(env[name][STATS], prop)
|
674
|
-
} else {
|
680
|
+
const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
|
681
|
+
if (returns[TYPE] === ATOM) setPropToAtom(env[name][STATS], prop)
|
682
|
+
else {
|
675
683
|
switch (returns[VALUE]) {
|
676
684
|
case KEYWORDS.CREATE_ARRAY:
|
677
685
|
setPropToSubReturn(env[name][STATS], prop, initArrayType({ rem, env }))
|
@@ -686,7 +694,7 @@ const resolveRetunType = ({ returns, rem, stack, prop, exp, name, env }) => {
|
|
686
694
|
!resolveGetter({ rem, prop, name, env })
|
687
695
|
)
|
688
696
|
return retry(env[name][STATS], [returns, env], stack, () => {
|
689
|
-
|
697
|
+
resolveReturnType({
|
690
698
|
returns,
|
691
699
|
rem,
|
692
700
|
stack,
|
@@ -726,7 +734,7 @@ const checkReturnType = ({ exp, stack, name, env }) => {
|
|
726
734
|
const body = hasApplyLambdaBlock(last) ? last.at(-1).at(-1) : last
|
727
735
|
const rem = hasBlock(body) ? body.at(-1) : body
|
728
736
|
const returns = isLeaf(rem) ? rem : rem[0]
|
729
|
-
return
|
737
|
+
return resolveReturnType({
|
730
738
|
returns,
|
731
739
|
rem,
|
732
740
|
prop: RETURNS,
|
@@ -1044,7 +1052,7 @@ export const typeCheck = (ast) => {
|
|
1044
1052
|
const body = rightHand
|
1045
1053
|
const rem = hasBlock(body) ? body.at(-1) : body
|
1046
1054
|
const returns = isLeaf(rem) ? rem : rem[0]
|
1047
|
-
|
1055
|
+
resolveReturnType({
|
1048
1056
|
stack,
|
1049
1057
|
returns,
|
1050
1058
|
rem,
|
@@ -1161,7 +1169,7 @@ export const typeCheck = (ast) => {
|
|
1161
1169
|
default:
|
1162
1170
|
// Setters are just like DEFINE_VARIABLE as they are essentially the Var case for Collections
|
1163
1171
|
// So they MUST happen before Judgement
|
1164
|
-
resolveSetter(first, rest, env)
|
1172
|
+
resolveSetter(first, rest, env, stack)
|
1165
1173
|
// end of Var ---------------
|
1166
1174
|
// Judgement
|
1167
1175
|
stagger(stack, 'append', [first, env], () => {
|
@@ -1242,8 +1250,6 @@ export const typeCheck = (ast) => {
|
|
1242
1250
|
// const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
|
1243
1251
|
const MAIN_TYPE = getType(args[i][STATS])
|
1244
1252
|
if (MAIN_TYPE === ANY) continue
|
1245
|
-
// TODO - try to merge special and non special
|
1246
|
-
// REFACTORING
|
1247
1253
|
if (first[TYPE] === APPLY) {
|
1248
1254
|
if (isLeaf(rest[i])) {
|
1249
1255
|
switch (rest[i][TYPE]) {
|
@@ -1322,7 +1328,6 @@ export const typeCheck = (ast) => {
|
|
1322
1328
|
// check(exp, env, scope)
|
1323
1329
|
// )
|
1324
1330
|
// }
|
1325
|
-
|
1326
1331
|
if (isSpecial)
|
1327
1332
|
setType(env[name][STATS], args[i][STATS])
|
1328
1333
|
}
|
@@ -1531,11 +1536,9 @@ export const typeCheck = (ast) => {
|
|
1531
1536
|
setReturnRef(env[name][STATS], args[i][STATS])
|
1532
1537
|
break
|
1533
1538
|
}
|
1534
|
-
|
1535
1539
|
match({ rest, args, i, env, scope, exp })
|
1536
1540
|
}
|
1537
1541
|
}
|
1538
|
-
// REFACTORING
|
1539
1542
|
}
|
1540
1543
|
}
|
1541
1544
|
})
|