fez-lisp 1.5.87 → 1.5.88
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 +38 -1
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -73,7 +73,7 @@ const checkPredicateName = (exp, rest, warningStack) => {
|
|
73
73
|
rest[0][VALUE]
|
74
74
|
}) to an (${
|
75
75
|
STATIC_TYPES.ATOM
|
76
|
-
}) that is not (or ${TRUE} ${FALSE}) (${stringifyArgs(
|
76
|
+
}) that is not (or ${TRUE} ${FALSE}) (${stringifyArgs(exp)})`
|
77
77
|
)
|
78
78
|
else if (
|
79
79
|
last[TYPE] === WORD &&
|
@@ -223,11 +223,26 @@ export const typeCheck = (ast) => {
|
|
223
223
|
// ATOM ASSIGMENT
|
224
224
|
env[name][STATS][prop][0] = ATOM
|
225
225
|
env[name][STATS][RETURNS][0] = ATOM
|
226
|
+
checkPredicateName(
|
227
|
+
exp,
|
228
|
+
[[WORD, name], returns],
|
229
|
+
warningStack
|
230
|
+
)
|
226
231
|
} else {
|
227
232
|
switch (returns[VALUE]) {
|
228
233
|
case KEYWORDS.IF:
|
229
234
|
{
|
230
235
|
const re = rem.slice(2)
|
236
|
+
checkPredicateName(
|
237
|
+
exp,
|
238
|
+
[[WORD, name], isLeaf(re[0]) ? re[0] : re[0][0]],
|
239
|
+
warningStack
|
240
|
+
)
|
241
|
+
checkPredicateName(
|
242
|
+
exp,
|
243
|
+
[[WORD, name], isLeaf(re[1]) ? re[1] : re[1][0]],
|
244
|
+
warningStack
|
245
|
+
)
|
231
246
|
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
232
247
|
// ATOM ASSIGMENT
|
233
248
|
env[name][STATS][prop][0] = ATOM
|
@@ -291,12 +306,34 @@ export const typeCheck = (ast) => {
|
|
291
306
|
}
|
292
307
|
break
|
293
308
|
default:
|
309
|
+
checkPredicateName(
|
310
|
+
exp,
|
311
|
+
[[WORD, name], returns],
|
312
|
+
warningStack
|
313
|
+
)
|
294
314
|
if (!env[returns[VALUE]])
|
295
315
|
env[name][STATS][RETURNS] = [UNKNOWN]
|
296
316
|
// env[name][STATS][RETURNS] = APPLY
|
297
317
|
else if (
|
298
318
|
env[returns[VALUE]][STATS][TYPE_PROP][0] === APPLY
|
299
319
|
) {
|
320
|
+
if (returns[VALUE] === KEYWORDS.CALL_FUNCTION) {
|
321
|
+
const fn = rest.at(-1).at(-1).at(-1)
|
322
|
+
checkPredicateName(
|
323
|
+
exp,
|
324
|
+
[
|
325
|
+
[WORD, name],
|
326
|
+
isLeaf(fn)
|
327
|
+
? fn // when apply is a word (let x? (lambda (apply [] array:empty!)))
|
328
|
+
: drillReturnType(
|
329
|
+
fn,
|
330
|
+
(r) => r[VALUE] === KEYWORDS.CALL_FUNCTION
|
331
|
+
) // when apply is an annonymous lambda // (let fn? (lambda x (apply x (lambda x (array:empty! [])))))
|
332
|
+
],
|
333
|
+
warningStack
|
334
|
+
)
|
335
|
+
}
|
336
|
+
|
300
337
|
// TODO This seems to be able to be deleted
|
301
338
|
// FOR NOT IT CAN BE
|
302
339
|
// if (returns[VALUE] === KEYWORDS.CALL_FUNCTION) {
|