fez-lisp 1.5.87 → 1.5.89

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 +43 -19
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.89",
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 &&
@@ -90,6 +90,9 @@ const checkPredicateName = (exp, rest, warningStack) => {
90
90
  } else if (last[0][0] === APPLY) {
91
91
  const application = last[0]
92
92
  switch (application[VALUE]) {
93
+ case KEYWORDS.IF:
94
+ // TODO finishthis #1
95
+ break
93
96
  default:
94
97
  if (
95
98
  getSuffix(application[VALUE]) !== PREDICATE_SUFFIX &&
@@ -107,6 +110,23 @@ const checkPredicateName = (exp, rest, warningStack) => {
107
110
  }
108
111
  }
109
112
  }
113
+ const checkPredicateNameDeep = (name, exp, rest, returns, warningStack) => {
114
+ if (returns[VALUE] === KEYWORDS.CALL_FUNCTION) {
115
+ const fn = rest.at(-1).at(-1).at(-1)
116
+ checkPredicateName(
117
+ exp,
118
+ [
119
+ [WORD, name],
120
+ isLeaf(fn)
121
+ ? fn // when apply is a word (let x? (lambda (apply [] array:empty!)))
122
+ : drillReturnType(fn, (r) => r[VALUE] === KEYWORDS.CALL_FUNCTION) // when apply is an annonymous lambda // (let fn? (lambda x (apply x (lambda x (array:empty! [])))))
123
+ ],
124
+ warningStack
125
+ )
126
+ } else {
127
+ checkPredicateName(exp, [[WORD, name], returns], warningStack)
128
+ }
129
+ }
110
130
  // const assign = (a, b, i) => {
111
131
  // a[i] = b[i]
112
132
  // }
@@ -223,11 +243,26 @@ export const typeCheck = (ast) => {
223
243
  // ATOM ASSIGMENT
224
244
  env[name][STATS][prop][0] = ATOM
225
245
  env[name][STATS][RETURNS][0] = ATOM
246
+ checkPredicateName(
247
+ exp,
248
+ [[WORD, name], returns],
249
+ warningStack
250
+ )
226
251
  } else {
227
252
  switch (returns[VALUE]) {
228
253
  case KEYWORDS.IF:
229
254
  {
230
255
  const re = rem.slice(2)
256
+ checkPredicateName(
257
+ exp,
258
+ [[WORD, name], isLeaf(re[0]) ? re[0] : re[0][0]],
259
+ warningStack
260
+ )
261
+ checkPredicateName(
262
+ exp,
263
+ [[WORD, name], isLeaf(re[1]) ? re[1] : re[1][0]],
264
+ warningStack
265
+ )
231
266
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
232
267
  // ATOM ASSIGMENT
233
268
  env[name][STATS][prop][0] = ATOM
@@ -291,30 +326,19 @@ export const typeCheck = (ast) => {
291
326
  }
292
327
  break
293
328
  default:
329
+ checkPredicateNameDeep(
330
+ name,
331
+ exp,
332
+ rest,
333
+ returns,
334
+ warningStack
335
+ )
294
336
  if (!env[returns[VALUE]])
295
337
  env[name][STATS][RETURNS] = [UNKNOWN]
296
338
  // env[name][STATS][RETURNS] = APPLY
297
339
  else if (
298
340
  env[returns[VALUE]][STATS][TYPE_PROP][0] === APPLY
299
341
  ) {
300
- // TODO This seems to be able to be deleted
301
- // FOR NOT IT CAN BE
302
- // if (returns[VALUE] === KEYWORDS.CALL_FUNCTION) {
303
- // if (isLeaf(rest.at(-1).at(-1).at(-1))) {
304
- // const fnName = rest.at(-1).at(-1).at(-1)[VALUE]
305
- // const fn = env[fnName]
306
- // env[name][STATS][TYPE_PROP][0] =
307
- // fn[STATS][RETURNS][0]
308
- // } else {
309
- // const [returns, rem] = drillReturnType(
310
- // rest.at(-1).at(-1).at(-1),
311
- // (returns) =>
312
- // returns[VALUE] === KEYWORDS.CALL_FUNCTION
313
- // )
314
- // resolveRetunType(returns, rem, TYPE_PROP)
315
- // }
316
- // }
317
-
318
342
  // ALWAYS APPLY
319
343
  // rest.at(-1)[0][TYPE] === APPLY
320
344
  // Here is upon application to store the result in the variable