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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/check.js +38 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.87",
5
+ "version": "1.5.88",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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(rest)})`
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) {