fez-lisp 1.5.34 → 1.5.36

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 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.34",
5
+ "version": "1.5.36",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  WORD
12
12
  } from './keywords.js'
13
13
  import { isLeaf } from './parser.js'
14
- import { stringifyArgs } from './utils.js'
14
+ import { hasBlock, stringifyArgs } from './utils.js'
15
15
  const ARGS_COUNT = 'n'
16
16
  const VARIADIC = '...'
17
17
  const STATS = '__stats__'
@@ -21,6 +21,8 @@ const RETURNS = 'returns'
21
21
  const SCOPE_NAME = '__scope__'
22
22
  const SUBTYPE = 'subtype'
23
23
  const PREDICATE = 3
24
+ const RETRY_COUNT = 1
25
+ const DEFINITON_RETRY_COUNT = 1
24
26
  const toTypeNames = (type) => {
25
27
  switch (type) {
26
28
  case APPLY:
@@ -38,6 +40,7 @@ export const typeCheck = (ast) => {
38
40
  [DEBUG.LOG]: {
39
41
  [STATS]: {
40
42
  type: APPLY,
43
+ retried: 0,
41
44
  [ARGS]: [
42
45
  [UNKNOWN, PLACEHOLDER],
43
46
  [APPLY, PLACEHOLDER]
@@ -47,35 +50,81 @@ export const typeCheck = (ast) => {
47
50
  }
48
51
  },
49
52
  [DEBUG.STRING]: {
50
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: APPLY }
53
+ [STATS]: {
54
+ type: APPLY,
55
+ retried: 0,
56
+ [ARGS_COUNT]: VARIADIC,
57
+ [RETURNS]: APPLY
58
+ }
51
59
  },
52
60
  [DEBUG.ASSERT]: {
53
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
61
+ [STATS]: {
62
+ type: APPLY,
63
+ retried: 0,
64
+ [ARGS_COUNT]: VARIADIC,
65
+ [RETURNS]: UNKNOWN
66
+ }
54
67
  },
55
68
  [DEBUG.SIGNATURE]: {
56
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
69
+ [STATS]: {
70
+ type: APPLY,
71
+ retried: 0,
72
+ [ARGS_COUNT]: VARIADIC,
73
+ [RETURNS]: UNKNOWN
74
+ }
57
75
  },
58
76
  [DEBUG.LIST_THEMES]: {
59
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
77
+ [STATS]: {
78
+ type: APPLY,
79
+ retried: 0,
80
+ [ARGS_COUNT]: VARIADIC,
81
+ [RETURNS]: UNKNOWN
82
+ }
60
83
  },
61
84
  [DEBUG.SET_THEME]: {
62
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
85
+ [STATS]: {
86
+ type: APPLY,
87
+ retried: 0,
88
+ [ARGS_COUNT]: VARIADIC,
89
+ [RETURNS]: UNKNOWN
90
+ }
63
91
  },
64
92
  [KEYWORDS.BLOCK]: {
65
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
93
+ [STATS]: {
94
+ type: APPLY,
95
+ retried: 0,
96
+ [ARGS_COUNT]: VARIADIC,
97
+ [RETURNS]: UNKNOWN
98
+ }
66
99
  },
67
100
  [KEYWORDS.ANONYMOUS_FUNCTION]: {
68
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: APPLY }
101
+ [STATS]: {
102
+ type: APPLY,
103
+ retried: 0,
104
+ [ARGS_COUNT]: VARIADIC,
105
+ [RETURNS]: APPLY
106
+ }
69
107
  },
70
108
  [KEYWORDS.CALL_FUNCTION]: {
71
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
109
+ [STATS]: {
110
+ type: APPLY,
111
+ retried: 0,
112
+ [ARGS_COUNT]: VARIADIC,
113
+ [RETURNS]: UNKNOWN
114
+ }
72
115
  },
73
116
  [KEYWORDS.CREATE_ARRAY]: {
74
- [STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: APPLY }
117
+ [STATS]: {
118
+ type: APPLY,
119
+ retried: 0,
120
+ [ARGS_COUNT]: VARIADIC,
121
+ [RETURNS]: APPLY
122
+ }
75
123
  },
76
124
  [KEYWORDS.LOOP]: {
77
125
  [STATS]: {
78
126
  type: APPLY,
127
+ retried: 0,
79
128
  [ARGS_COUNT]: 2,
80
129
  [ARGS]: [
81
130
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -88,6 +137,7 @@ export const typeCheck = (ast) => {
88
137
  [KEYWORDS.ADDITION]: {
89
138
  [STATS]: {
90
139
  type: APPLY,
140
+ retried: 0,
91
141
  [ARGS_COUNT]: 2,
92
142
  [ARGS]: [
93
143
  [ATOM, PLACEHOLDER],
@@ -99,6 +149,7 @@ export const typeCheck = (ast) => {
99
149
  [KEYWORDS.MULTIPLICATION]: {
100
150
  [STATS]: {
101
151
  type: APPLY,
152
+ retried: 0,
102
153
  [ARGS_COUNT]: 2,
103
154
  [ARGS]: [
104
155
  [ATOM, PLACEHOLDER],
@@ -110,6 +161,7 @@ export const typeCheck = (ast) => {
110
161
  [KEYWORDS.SUBTRACTION]: {
111
162
  [STATS]: {
112
163
  type: APPLY,
164
+ retried: 0,
113
165
  [ARGS_COUNT]: 2,
114
166
  [ARGS]: [
115
167
  [ATOM, PLACEHOLDER],
@@ -121,6 +173,7 @@ export const typeCheck = (ast) => {
121
173
  [KEYWORDS.DIVISION]: {
122
174
  [STATS]: {
123
175
  type: APPLY,
176
+ retried: 0,
124
177
  [ARGS_COUNT]: 2,
125
178
  [ARGS]: [
126
179
  [ATOM, PLACEHOLDER],
@@ -132,6 +185,7 @@ export const typeCheck = (ast) => {
132
185
  [KEYWORDS.REMAINDER_OF_DIVISION]: {
133
186
  [STATS]: {
134
187
  type: APPLY,
188
+ retried: 0,
135
189
  [ARGS_COUNT]: 2,
136
190
  [ARGS]: [
137
191
  [ATOM, PLACEHOLDER],
@@ -143,6 +197,7 @@ export const typeCheck = (ast) => {
143
197
  [KEYWORDS.BITWISE_AND]: {
144
198
  [STATS]: {
145
199
  type: APPLY,
200
+ retried: 0,
146
201
  [ARGS_COUNT]: 2,
147
202
  [ARGS]: [
148
203
  [ATOM, PLACEHOLDER],
@@ -154,6 +209,7 @@ export const typeCheck = (ast) => {
154
209
  [KEYWORDS.BITWISE_NOT]: {
155
210
  [STATS]: {
156
211
  type: APPLY,
212
+ retried: 0,
157
213
  [ARGS_COUNT]: 1,
158
214
  [ARGS]: [[ATOM, PLACEHOLDER]],
159
215
  [RETURNS]: ATOM
@@ -162,6 +218,7 @@ export const typeCheck = (ast) => {
162
218
  [KEYWORDS.BITWISE_OR]: {
163
219
  [STATS]: {
164
220
  type: APPLY,
221
+ retried: 0,
165
222
  [ARGS_COUNT]: 2,
166
223
  [ARGS]: [
167
224
  [ATOM, PLACEHOLDER],
@@ -173,6 +230,7 @@ export const typeCheck = (ast) => {
173
230
  [KEYWORDS.BITWISE_XOR]: {
174
231
  [STATS]: {
175
232
  type: APPLY,
233
+ retried: 0,
176
234
  [ARGS_COUNT]: 2,
177
235
  [ARGS]: [
178
236
  [ATOM, PLACEHOLDER],
@@ -184,6 +242,7 @@ export const typeCheck = (ast) => {
184
242
  [KEYWORDS.BITWISE_LEFT_SHIFT]: {
185
243
  [STATS]: {
186
244
  type: APPLY,
245
+ retried: 0,
187
246
  [ARGS_COUNT]: 2,
188
247
  [ARGS]: [
189
248
  [ATOM, PLACEHOLDER],
@@ -195,6 +254,7 @@ export const typeCheck = (ast) => {
195
254
  [KEYWORDS.BITWISE_RIGHT_SHIFT]: {
196
255
  [STATS]: {
197
256
  type: APPLY,
257
+ retried: 0,
198
258
  [ARGS_COUNT]: 2,
199
259
  [ARGS]: [
200
260
  [ATOM, PLACEHOLDER],
@@ -206,6 +266,7 @@ export const typeCheck = (ast) => {
206
266
  [KEYWORDS.GET_ARRAY]: {
207
267
  [STATS]: {
208
268
  type: APPLY,
269
+ retried: 0,
209
270
  [ARGS_COUNT]: 2,
210
271
  [ARGS]: [
211
272
  [UNKNOWN, PLACEHOLDER],
@@ -217,6 +278,7 @@ export const typeCheck = (ast) => {
217
278
  [KEYWORDS.SET_ARRAY]: {
218
279
  [STATS]: {
219
280
  type: APPLY,
281
+ retried: 0,
220
282
  [ARGS_COUNT]: 3,
221
283
  [ARGS]: [
222
284
  [UNKNOWN, PLACEHOLDER],
@@ -229,6 +291,7 @@ export const typeCheck = (ast) => {
229
291
  [KEYWORDS.POP_ARRAY]: {
230
292
  [STATS]: {
231
293
  type: APPLY,
294
+ retried: 0,
232
295
  [ARGS_COUNT]: 1,
233
296
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
234
297
  [RETURNS]: UNKNOWN
@@ -237,6 +300,7 @@ export const typeCheck = (ast) => {
237
300
  [KEYWORDS.ARRAY_LENGTH]: {
238
301
  [STATS]: {
239
302
  type: APPLY,
303
+ retried: 0,
240
304
  [ARGS_COUNT]: 1,
241
305
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
242
306
  [RETURNS]: ATOM
@@ -245,6 +309,7 @@ export const typeCheck = (ast) => {
245
309
  [KEYWORDS.IF]: {
246
310
  [STATS]: {
247
311
  type: APPLY,
312
+ retried: 0,
248
313
  [ARGS_COUNT]: 3,
249
314
  [ARGS]: [
250
315
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -257,6 +322,7 @@ export const typeCheck = (ast) => {
257
322
  [KEYWORDS.NOT]: {
258
323
  [STATS]: {
259
324
  type: APPLY,
325
+ retried: 0,
260
326
  [ARGS_COUNT]: 1,
261
327
  [ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
262
328
  [RETURNS]: ATOM,
@@ -266,6 +332,7 @@ export const typeCheck = (ast) => {
266
332
  [KEYWORDS.EQUAL]: {
267
333
  [STATS]: {
268
334
  type: APPLY,
335
+ retried: 0,
269
336
  [ARGS_COUNT]: 2,
270
337
  [ARGS]: [
271
338
  [ATOM, PLACEHOLDER],
@@ -278,6 +345,7 @@ export const typeCheck = (ast) => {
278
345
  [KEYWORDS.LESS_THAN]: {
279
346
  [STATS]: {
280
347
  type: APPLY,
348
+ retried: 0,
281
349
  [ARGS_COUNT]: 2,
282
350
  [ARGS]: [
283
351
  [ATOM, PLACEHOLDER],
@@ -290,6 +358,7 @@ export const typeCheck = (ast) => {
290
358
  [KEYWORDS.GREATHER_THAN]: {
291
359
  [STATS]: {
292
360
  type: APPLY,
361
+ retried: 0,
293
362
  [ARGS_COUNT]: 2,
294
363
  [ARGS]: [
295
364
  [ATOM, PLACEHOLDER],
@@ -302,6 +371,7 @@ export const typeCheck = (ast) => {
302
371
  [KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
303
372
  [STATS]: {
304
373
  type: APPLY,
374
+ retried: 0,
305
375
  [ARGS_COUNT]: 2,
306
376
  [ARGS]: [
307
377
  [ATOM, PLACEHOLDER],
@@ -314,6 +384,7 @@ export const typeCheck = (ast) => {
314
384
  [KEYWORDS.LESS_THAN_OR_EQUAL]: {
315
385
  [STATS]: {
316
386
  type: APPLY,
387
+ retried: 0,
317
388
  [ARGS_COUNT]: 2,
318
389
  [ARGS]: [
319
390
  [ATOM, PLACEHOLDER],
@@ -326,6 +397,7 @@ export const typeCheck = (ast) => {
326
397
  [KEYWORDS.AND]: {
327
398
  [STATS]: {
328
399
  type: APPLY,
400
+ retried: 0,
329
401
  [ARGS_COUNT]: 2,
330
402
  [ARGS]: [
331
403
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -338,6 +410,7 @@ export const typeCheck = (ast) => {
338
410
  [KEYWORDS.OR]: {
339
411
  [STATS]: {
340
412
  type: APPLY,
413
+ retried: 0,
341
414
  [ARGS_COUNT]: 2,
342
415
  [ARGS]: [
343
416
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -350,6 +423,7 @@ export const typeCheck = (ast) => {
350
423
  [KEYWORDS.IS_ATOM]: {
351
424
  [STATS]: {
352
425
  type: APPLY,
426
+ retried: 0,
353
427
  [ARGS_COUNT]: 1,
354
428
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
355
429
  [RETURNS]: ATOM,
@@ -359,6 +433,7 @@ export const typeCheck = (ast) => {
359
433
  [KEYWORDS.IS_LAMBDA]: {
360
434
  [STATS]: {
361
435
  type: APPLY,
436
+ retried: 0,
362
437
  [ARGS_COUNT]: 1,
363
438
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
364
439
  [RETURNS]: ATOM,
@@ -368,6 +443,7 @@ export const typeCheck = (ast) => {
368
443
  [KEYWORDS.ERROR]: {
369
444
  [STATS]: {
370
445
  type: APPLY,
446
+ retried: 0,
371
447
  [ARGS_COUNT]: 1,
372
448
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
373
449
  [RETURNS]: UNKNOWN
@@ -395,7 +471,6 @@ export const typeCheck = (ast) => {
395
471
  const withScope = (name, scope) => {
396
472
  const chain = getScopeNames(scope)
397
473
  const str = `${chain.join('_')}_${name}`
398
- // console.log({ str })
399
474
  return { str, chain }
400
475
  }
401
476
 
@@ -441,13 +516,78 @@ export const typeCheck = (ast) => {
441
516
  env[name] = {
442
517
  [STATS]: {
443
518
  type: APPLY,
519
+ retried: 0,
444
520
  [ARGS_COUNT]: n - 2,
445
521
  [ARGS]: []
446
522
  }
447
523
  }
448
- if (name[name.length - 1] === PREDICATE_SUFFIX)
449
- env[name][STATS][SUBTYPE] = PREDICATE
450
- check(rest.at(-1), env, exp)
524
+ const checkReturnType = () => {
525
+ if (name[name.length - 1] === PREDICATE_SUFFIX) {
526
+ env[name][STATS][RETURNS] = ATOM
527
+ env[name][STATS][SUBTYPE] = PREDICATE
528
+ } else {
529
+ const body = rest.at(-1).at(-1)
530
+ const rem = hasBlock(body) ? body.at(-1) : body
531
+ const returns = isLeaf(rem) ? rem : rem[0]
532
+ if (returns[TYPE] === ATOM) {
533
+ env[name][STATS][RETURNS] = ATOM
534
+ } else {
535
+ switch (returns[VALUE]) {
536
+ case KEYWORDS.IF:
537
+ const re = rem.slice(2)
538
+ if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM)
539
+ env[name][STATS][RETURNS] = ATOM
540
+ else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
541
+ env[name][STATS][RETURNS] =
542
+ env[re[0][0][VALUE]][STATS][RETURNS]
543
+ } else {
544
+ if (env[re[0][VALUE]])
545
+ env[name][STATS][RETURNS] =
546
+ env[re[0][VALUE]][STATS].type
547
+ else env[name][STATS][RETURNS] = UNKNOWN
548
+ }
549
+ break
550
+ default:
551
+ if (env[returns[VALUE]]) {
552
+ if (env[returns[VALUE]][STATS].type === APPLY) {
553
+ env[name][STATS][RETURNS] =
554
+ env[returns[VALUE]][STATS][RETURNS]
555
+ // env[name][STATS][SUBTYPE] =
556
+ // env[returns[VALUE]][STATS][SUBTYPE]
557
+ } else {
558
+ env[name][STATS][RETURNS] =
559
+ env[returns[VALUE]].type
560
+ }
561
+ } else {
562
+ env[name][STATS][RETURNS] = UNKNOWN
563
+ }
564
+ break
565
+ }
566
+ }
567
+ }
568
+ // if (
569
+ // env[name][STATS][RETURNS] === UNKNOWN &&
570
+ // env[name][STATS].retried < RETRY_COUNT
571
+ // ) {
572
+ // env[name][STATS].retried += 1
573
+ // console.log(name, env[name][STATS])
574
+ // checkReturnType()
575
+ // }
576
+ }
577
+ checkReturnType()
578
+ if (
579
+ env[name][STATS][RETURNS] === UNKNOWN &&
580
+ env[name][STATS].retried < DEFINITON_RETRY_COUNT
581
+ ) {
582
+ env[name][STATS].retried += 1
583
+ stack.unshift(() => {
584
+ checkReturnType()
585
+ check(rest.at(-1), env, exp)
586
+ })
587
+ check(rest.at(-1), env, exp)
588
+ } else {
589
+ check(rest.at(-1), env, exp)
590
+ }
451
591
  } else {
452
592
  if (!(name in env)) {
453
593
  if (rest[1][TYPE] === WORD)
@@ -455,6 +595,7 @@ export const typeCheck = (ast) => {
455
595
  else
456
596
  env[name] = {
457
597
  [STATS]: {
598
+ retried: 0,
458
599
  type: isLeaf(rest.at(-1))
459
600
  ? rest.at(-1)[TYPE]
460
601
  : env[rest.at(-1)[0]?.[VALUE]]?.[STATS]?.[
@@ -490,7 +631,9 @@ export const typeCheck = (ast) => {
490
631
  .replace('.', 0)
491
632
  }
492
633
  for (const param of params) {
493
- copy[param[VALUE]] = { [STATS]: { type: UNKNOWN } }
634
+ copy[param[VALUE]] = {
635
+ [STATS]: { type: UNKNOWN, retried: 0 }
636
+ }
494
637
  if (env[copy[SCOPE_NAME]])
495
638
  env[copy[SCOPE_NAME]][STATS][ARGS].push(copy[param[VALUE]])
496
639
  }
@@ -678,10 +821,10 @@ export const typeCheck = (ast) => {
678
821
  const retry = env[rest[i][VALUE]]
679
822
  if (
680
823
  retry &&
681
- !retry.retried &&
824
+ retry[STATS].retried < RETRY_COUNT &&
682
825
  args[i][STATS].type === UNKNOWN
683
826
  ) {
684
- retry.retried = true
827
+ retry[STATS].retried += 1
685
828
  stack.unshift(() => check(exp, env, scope))
686
829
  }
687
830
  // console.log(
@@ -716,9 +859,10 @@ export const typeCheck = (ast) => {
716
859
  rest[i].length &&
717
860
  env[rest[i][0][VALUE]] &&
718
861
  args[i][STATS].type === UNKNOWN &&
719
- !env[rest[i][0][VALUE]].retried
862
+ env[rest[i][0][VALUE]][STATS].retried <
863
+ RETRY_COUNT
720
864
  ) {
721
- env[rest[i][0][VALUE]].retried = true
865
+ env[rest[i][0][VALUE]][STATS].retried += 1
722
866
  if (!scope[SCOPE_NAME])
723
867
  scope[SCOPE_NAME] = scope[1][VALUE]
724
868
  stack.unshift(() => check(exp, env, scope))
package/src/macros.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  VALUE,
16
16
  WORD
17
17
  } from './keywords.js'
18
- import { stringifyArgs } from './utils.js'
18
+ import { hasBlock, stringifyArgs } from './utils.js'
19
19
  export const SUGGAR = {
20
20
  // Syntactic suggars
21
21
  PIPE: '|>',
@@ -821,8 +821,7 @@ export const replaceStrings = (source) => {
821
821
  )
822
822
  return source
823
823
  }
824
- const hasBlock = (body) =>
825
- body[0] && body[0][TYPE] === APPLY && body[0][VALUE] === KEYWORDS.BLOCK
824
+
826
825
  const iron = (scope) => {
827
826
  const indecies = scope
828
827
  .map((x, i) => {
package/src/utils.js CHANGED
@@ -190,11 +190,16 @@ const deepShake = (tree, deps, visited = new Set(), ignored = new Set()) => {
190
190
  deepShake(deps.get(value).value, deps, visited, ignored)
191
191
  }
192
192
  }
193
+
194
+ export const hasBlock = (body) =>
195
+ body[0] && body[0][TYPE] === APPLY && body[0][VALUE] === KEYWORDS.BLOCK
196
+
193
197
  const extractDeps = (visited, deps) =>
194
198
  [...visited]
195
199
  .map((x) => deps.get(x))
196
200
  .sort((a, b) => a.index - b.index)
197
201
  .map((x) => x.value)
202
+
198
203
  const toIgnore = (ast) => {
199
204
  const out = []
200
205
  const dfs = (exp) => {