fez-lisp 1.5.100 → 1.5.101
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/logo.svg +5 -5
- package/package.json +1 -1
- package/src/check.js +83 -85
- package/src/types.js +12 -4
package/logo.svg
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
<svg width="
|
2
|
-
<path d="
|
1
|
+
<svg width="60" height="88" viewBox="0 0 60 88" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<path d="M56 58.4998C61.166 60.9107 63.7232 82.5984 43 86.4999C31.755 88.617 1.50018 90.3154 1.5 69C1.49978 42.7121 27.65 50.8529 43 58.4998C52 61 50.834 56.089 56 58.4998Z" fill="#F9B949"/>
|
3
3
|
<circle cx="25.5" cy="35.5" r="25.5" fill="#F9B949"/>
|
4
4
|
<circle cx="36.5" cy="31.5" r="2.5" fill="#1F1B1B"/>
|
5
5
|
<circle cx="9.5" cy="21.5" r="2.5" fill="#1F1B1B"/>
|
@@ -9,8 +9,8 @@
|
|
9
9
|
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
10
10
|
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
11
11
|
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
12
|
-
<path d="
|
13
|
-
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.
|
14
|
-
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
|
12
|
+
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
|
13
|
+
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
|
15
14
|
<path d="M51 15C46 13.5 54.6472 7.06417 48.8171 5" stroke="#F9B949" stroke-width="2" stroke-linecap="round"/>
|
15
|
+
<path d="M19.5 27.1883C16.1667 26.3396 12 28.635 12 28.635C12 28.635 12.4167 30.7565 17.4167 32.7045C22.4167 34.6525 27 35 27 35C27 35 22.8333 28.037 19.5 27.1883Z" fill="#B44637"/>
|
16
16
|
</svg>
|
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -66,6 +66,10 @@ const deepLambdaReturn = (rest, condition) => {
|
|
66
66
|
const rem = hasBlock(body) ? body.at(-1) : body
|
67
67
|
return condition(rem) ? rem : deepLambdaReturn(rem, condition)
|
68
68
|
}
|
69
|
+
export const isUnknownNotAnyType = (stats) =>
|
70
|
+
stats && !isAnyType(stats) && isUnknownType(stats)
|
71
|
+
export const isUnknownNotAnyReturn = (stats) =>
|
72
|
+
stats && !isAnyReturn(stats) && isUnknownReturn(stats)
|
69
73
|
export const castType = (stats, type) =>
|
70
74
|
(stats[TYPE_PROP][0] = type[RETURNS][0])
|
71
75
|
export const castReturn = (stats, type) =>
|
@@ -234,7 +238,22 @@ const withScope = (name, scope) => {
|
|
234
238
|
const chain = getScopeNames(scope)
|
235
239
|
return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
|
236
240
|
}
|
237
|
-
|
241
|
+
const retry = (stats, stack, errors, cb) => {
|
242
|
+
if (
|
243
|
+
errors.size === 0 &&
|
244
|
+
(isUnknownNotAnyType(stats) || isUnknownNotAnyReturn(stats)) &&
|
245
|
+
stats.retried < MAX_RETRY_DEFINITION
|
246
|
+
) {
|
247
|
+
stats.retried += 1
|
248
|
+
stack.unshift(() => cb())
|
249
|
+
}
|
250
|
+
}
|
251
|
+
const retryArgs = (stats, stack, errors, cb) => {
|
252
|
+
if (errors.size === 0 && stats.counter < MAX_ARGUMENT_RETRY) {
|
253
|
+
stats.counter++
|
254
|
+
stack.unshift(cb)
|
255
|
+
}
|
256
|
+
}
|
238
257
|
const ifExpression = ({ re, env, ref }) => {
|
239
258
|
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) setReturnToAtom(ref[STATS])
|
240
259
|
// TODO check that both brancehs are predicates if one is
|
@@ -259,6 +278,19 @@ const ifExpression = ({ re, env, ref }) => {
|
|
259
278
|
}
|
260
279
|
}
|
261
280
|
}
|
281
|
+
const resolveApplyAssigment = (re, name, env) => {
|
282
|
+
if (re[0][TYPE] === APPLY) {
|
283
|
+
switch (re[0][VALUE]) {
|
284
|
+
case KEYWORDS.ANONYMOUS_FUNCTION:
|
285
|
+
// FN ASSIGMENT
|
286
|
+
env[name][STATS][TYPE_PROP] = [APPLY]
|
287
|
+
env[name][STATS][RETURNS] = [UNKNOWN]
|
288
|
+
env[name][STATS][ARG_COUNT] = re.length - 2
|
289
|
+
env[name][STATS][ARGUMENTS] = fillUknownArgs(re.length - 2)
|
290
|
+
break
|
291
|
+
}
|
292
|
+
}
|
293
|
+
}
|
262
294
|
const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
|
263
295
|
const re = rem.slice(2)
|
264
296
|
checkPredicateName(
|
@@ -280,17 +312,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
|
|
280
312
|
!isUnknownReturn(env[re[0][0][VALUE]][STATS])
|
281
313
|
) {
|
282
314
|
setPropToReturnRef(env[name][STATS], prop, env[re[0][0][VALUE]][STATS])
|
283
|
-
|
284
|
-
switch (re[0][0][VALUE]) {
|
285
|
-
case KEYWORDS.ANONYMOUS_FUNCTION:
|
286
|
-
// FN UKNONW ASSIGMENT
|
287
|
-
env[name][STATS][TYPE_PROP] = [APPLY]
|
288
|
-
env[name][STATS][RETURNS] = [UNKNOWN]
|
289
|
-
env[name][STATS][ARG_COUNT] = re[0].length - 2
|
290
|
-
env[name][STATS][ARGUMENTS] = fillUknownArgs(re[0].length - 2)
|
291
|
-
break
|
292
|
-
}
|
293
|
-
}
|
315
|
+
resolveApplyAssigment(re[0], name, env)
|
294
316
|
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
295
317
|
} else if (
|
296
318
|
!isLeaf(re[1]) &&
|
@@ -298,17 +320,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
|
|
298
320
|
!isUnknownReturn(env[re[1][0][VALUE]][STATS])
|
299
321
|
) {
|
300
322
|
setPropToReturnRef(env[name][STATS], prop, env[re[1][0][VALUE]][STATS])
|
301
|
-
|
302
|
-
switch (re[1][0][VALUE]) {
|
303
|
-
case KEYWORDS.ANONYMOUS_FUNCTION:
|
304
|
-
// FN ASSIGMENT
|
305
|
-
env[name][STATS][TYPE_PROP] = [APPLY]
|
306
|
-
env[name][STATS][RETURNS] = [UNKNOWN]
|
307
|
-
env[name][STATS][ARG_COUNT] = re[1].length - 2
|
308
|
-
env[name][STATS][ARGUMENTS] = fillUknownArgs(re[1].length - 2)
|
309
|
-
break
|
310
|
-
}
|
311
|
-
}
|
323
|
+
resolveApplyAssigment(re[1], name, env)
|
312
324
|
} else if (env[re[0][VALUE]])
|
313
325
|
// ASSIGMENT
|
314
326
|
setPropRef(env[name][STATS], prop, env[re[0][VALUE]][STATS])
|
@@ -319,6 +331,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
|
|
319
331
|
const resolveCondition = ({ rem, name, env, exp, errors }) => {
|
320
332
|
const ret = rem[0]
|
321
333
|
const re = rem.slice(2)
|
334
|
+
resolveApplyAssigment(re, name, env)
|
322
335
|
const ref = env[name]
|
323
336
|
checkPredicateName(
|
324
337
|
exp,
|
@@ -473,11 +486,9 @@ export const typeCheck = (ast, error = true) => {
|
|
473
486
|
name,
|
474
487
|
errors
|
475
488
|
}) ||
|
476
|
-
|
477
|
-
env[name][STATS].retried < MAX_RETRY_DEFINITION)
|
489
|
+
isUnknownReturn(env[name][STATS])
|
478
490
|
) {
|
479
|
-
env[name][STATS]
|
480
|
-
stack.unshift(() => {
|
491
|
+
retry(env[name][STATS], stack, errors, () => {
|
481
492
|
checkReturnType({
|
482
493
|
stack,
|
483
494
|
exp,
|
@@ -498,7 +509,6 @@ export const typeCheck = (ast, error = true) => {
|
|
498
509
|
errors.add(
|
499
510
|
`Trying to access undefined variable ${rest[1][VALUE]} (check #22)`
|
500
511
|
)
|
501
|
-
|
502
512
|
// Used to be checkin if it's an assigment to a special form
|
503
513
|
// but this should not cause problems
|
504
514
|
// env[name] = SPECIAL_FORMS_SET.has(rest[1][VALUE])
|
@@ -519,7 +529,7 @@ export const typeCheck = (ast, error = true) => {
|
|
519
529
|
}
|
520
530
|
} else if (rightHand[0]) {
|
521
531
|
const right = rightHand[0]
|
522
|
-
//DECLARATION
|
532
|
+
// DECLARATION
|
523
533
|
env[name] = {
|
524
534
|
[STATS]: {
|
525
535
|
retried: 0,
|
@@ -619,7 +629,6 @@ export const typeCheck = (ast, error = true) => {
|
|
619
629
|
if (copy[ret[VALUE]])
|
620
630
|
setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
|
621
631
|
})
|
622
|
-
|
623
632
|
break
|
624
633
|
}
|
625
634
|
}
|
@@ -929,12 +938,8 @@ export const typeCheck = (ast, error = true) => {
|
|
929
938
|
getReturn(actual[STATS])
|
930
939
|
)}) (${stringifyArgs(exp)}) (check #782)`
|
931
940
|
)
|
932
|
-
} else
|
933
|
-
actual[STATS]
|
934
|
-
) {
|
935
|
-
actual[STATS].retried += 1
|
936
|
-
stack.unshift(() => match1())
|
937
|
-
}
|
941
|
+
} else
|
942
|
+
retry(actual[STATS], stack, errors, () => match1())
|
938
943
|
}
|
939
944
|
match1()
|
940
945
|
for (
|
@@ -962,12 +967,14 @@ export const typeCheck = (ast, error = true) => {
|
|
962
967
|
getType(actual[STATS])
|
963
968
|
)}) (${stringifyArgs(exp)}) (check #781)`
|
964
969
|
)
|
965
|
-
else
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
970
|
+
else
|
971
|
+
retry(
|
972
|
+
actual[STATS],
|
973
|
+
stack,
|
974
|
+
errors,
|
975
|
+
|
976
|
+
() => match2()
|
977
|
+
)
|
971
978
|
}
|
972
979
|
match2()
|
973
980
|
}
|
@@ -989,34 +996,27 @@ export const typeCheck = (ast, error = true) => {
|
|
989
996
|
exp
|
990
997
|
)}) (check #30)`
|
991
998
|
)
|
992
|
-
} else if (
|
993
|
-
|
994
|
-
|
999
|
+
} else if (isUnknownType(args[i][STATS]))
|
1000
|
+
retry(args[i][STATS], stack, errors, () =>
|
1001
|
+
check(exp, env, scope)
|
1002
|
+
)
|
1003
|
+
else if (
|
1004
|
+
env[rest[i][VALUE]] &&
|
1005
|
+
!isUnknownType(args[i][STATS]) &&
|
1006
|
+
isUnknownType(env[rest[i][VALUE]][STATS]) &&
|
1007
|
+
getType(args[i][STATS]) !== APPLY
|
995
1008
|
) {
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
!isUnknownType(args[i][STATS]) &&
|
1002
|
-
isUnknownType(env[rest[i][VALUE]][STATS]) &&
|
1003
|
-
getType(args[i][STATS]) !== APPLY
|
1004
|
-
) {
|
1005
|
-
// REFF ASSIGMENT
|
1006
|
-
env[rest[i][VALUE]][STATS][TYPE_PROP] =
|
1007
|
-
args[i][STATS][TYPE_PROP]
|
1008
|
-
env[rest[i][VALUE]][STATS][RETURNS] =
|
1009
|
-
args[i][STATS][RETURNS]
|
1010
|
-
}
|
1009
|
+
// REFF ASSIGMENT
|
1010
|
+
env[rest[i][VALUE]][STATS][TYPE_PROP] =
|
1011
|
+
args[i][STATS][TYPE_PROP]
|
1012
|
+
env[rest[i][VALUE]][STATS][RETURNS] =
|
1013
|
+
args[i][STATS][RETURNS]
|
1011
1014
|
}
|
1012
1015
|
} else if (env[rest[i][0][VALUE]]) {
|
1013
1016
|
const match = () => {
|
1014
1017
|
const actual = env[rest[i][0][VALUE]][STATS]
|
1015
1018
|
const expected = args[i][STATS]
|
1016
|
-
|
1017
|
-
args[i][STATS].counter++
|
1018
|
-
stack.unshift(() => match())
|
1019
|
-
}
|
1019
|
+
retryArgs(args[i][STATS], stack, errors, () => match())
|
1020
1020
|
if (!isUnknownType(expected) && !isUnknownReturn(actual))
|
1021
1021
|
if (!compareTypeWithReturn(expected, actual))
|
1022
1022
|
errors.add(
|
@@ -1090,13 +1090,14 @@ export const typeCheck = (ast, error = true) => {
|
|
1090
1090
|
exp
|
1091
1091
|
)}) (check #779)`
|
1092
1092
|
)
|
1093
|
-
else
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1093
|
+
else
|
1094
|
+
retry(
|
1095
|
+
actual[STATS],
|
1096
|
+
stack,
|
1097
|
+
errors,
|
1098
|
+
|
1099
|
+
() => match1()
|
1100
|
+
)
|
1100
1101
|
}
|
1101
1102
|
match1()
|
1102
1103
|
for (
|
@@ -1132,13 +1133,14 @@ export const typeCheck = (ast, error = true) => {
|
|
1132
1133
|
exp
|
1133
1134
|
)}) (check #780)`
|
1134
1135
|
)
|
1135
|
-
else
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1136
|
+
else
|
1137
|
+
retry(
|
1138
|
+
actual[STATS],
|
1139
|
+
stack,
|
1140
|
+
errors,
|
1141
|
+
|
1142
|
+
() => match2()
|
1143
|
+
)
|
1142
1144
|
}
|
1143
1145
|
match2()
|
1144
1146
|
}
|
@@ -1153,19 +1155,15 @@ export const typeCheck = (ast, error = true) => {
|
|
1153
1155
|
// break
|
1154
1156
|
}
|
1155
1157
|
}
|
1156
|
-
else if (
|
1157
|
-
|
1158
|
-
args[i][STATS].retried < MAX_RETRY_DEFINITION
|
1159
|
-
) {
|
1160
|
-
args[i][STATS].retried += 1
|
1161
|
-
stack.unshift(() => match())
|
1162
|
-
}
|
1158
|
+
else if (isUnknownType(expected))
|
1159
|
+
retry(args[i][STATS], stack, errors, () => match())
|
1163
1160
|
}
|
1164
1161
|
match()
|
1165
1162
|
}
|
1166
1163
|
}
|
1167
1164
|
}
|
1168
1165
|
})
|
1166
|
+
|
1169
1167
|
for (let i = 0; i < rest.length; ++i) {
|
1170
1168
|
const r = rest[i]
|
1171
1169
|
if (isLeaf(r) && r[TYPE] !== ATOM)
|
package/src/types.js
CHANGED
@@ -23,7 +23,7 @@ export const PREDICATE = 4
|
|
23
23
|
export const ANY = 5
|
24
24
|
export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
|
25
25
|
export const MAX_ARGUMENT_RETRY = 1
|
26
|
-
export const MAX_RETRY_DEFINITION =
|
26
|
+
export const MAX_RETRY_DEFINITION = 100
|
27
27
|
export const toTypeNames = (type) => {
|
28
28
|
switch (type) {
|
29
29
|
case APPLY:
|
@@ -42,6 +42,14 @@ export const toTypeNames = (type) => {
|
|
42
42
|
break
|
43
43
|
}
|
44
44
|
}
|
45
|
+
export const toTypeNamesAnyToUknown = (type) => {
|
46
|
+
switch (type) {
|
47
|
+
case ANY:
|
48
|
+
return toTypeNames(UNKNOWN)
|
49
|
+
default:
|
50
|
+
return toTypeNames(type)
|
51
|
+
}
|
52
|
+
}
|
45
53
|
export const SPECIAL_FORM_TYPES = {
|
46
54
|
[SCOPE_NAME]: ';',
|
47
55
|
// [ORDER]: 0,
|
@@ -1196,15 +1204,15 @@ export const formatType = (name, env) => {
|
|
1196
1204
|
`${
|
1197
1205
|
getType(x[STATS]) === APPLY
|
1198
1206
|
? `${formatType(i, stats[ARGUMENTS])}`
|
1199
|
-
: `${
|
1207
|
+
: `${toTypeNamesAnyToUknown(getType(x[STATS]))}`
|
1200
1208
|
}`
|
1201
1209
|
).join(' ') + ' '
|
1202
1210
|
: ''
|
1203
1211
|
// TODO format returned functions when type support is added
|
1204
|
-
}(${KEYWORDS.BLOCK} ${
|
1212
|
+
}(${KEYWORDS.BLOCK} ${toTypeNamesAnyToUknown(getReturn(stats))})${
|
1205
1213
|
isAnonymous ? '' : ')'
|
1206
1214
|
})`
|
1207
|
-
: `(let ${name} ${
|
1215
|
+
: `(let ${name} ${toTypeNamesAnyToUknown(getType(stats))})`
|
1208
1216
|
: name
|
1209
1217
|
}
|
1210
1218
|
|