fez-lisp 1.5.47 → 1.5.48
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/package.json +1 -1
- package/src/check.js +166 -60
- package/src/compiler.js +10 -1
- package/src/interpreter.js +9 -2
- package/src/keywords.js +7 -0
- package/src/utils.js +24 -4
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -41,13 +41,22 @@ const toTypeNames = (type) => {
|
|
41
41
|
case ATOM:
|
42
42
|
return 'Atom'
|
43
43
|
case UNKNOWN:
|
44
|
-
return '
|
44
|
+
return 'Unknown'
|
45
45
|
case PREDICATE:
|
46
46
|
return 'Predicate'
|
47
47
|
case COLLECTION:
|
48
48
|
return 'Collection'
|
49
49
|
}
|
50
50
|
}
|
51
|
+
export const identity = (name) => [
|
52
|
+
[0, 'let'],
|
53
|
+
[1, name],
|
54
|
+
[
|
55
|
+
[0, 'lambda'],
|
56
|
+
[1, 'x'],
|
57
|
+
[1, 'x']
|
58
|
+
]
|
59
|
+
]
|
51
60
|
const drillReturnType = (rest, condition) => {
|
52
61
|
const body = rest.at(-1)
|
53
62
|
const rem = hasBlock(body) ? body.at(-1) : body
|
@@ -56,6 +65,11 @@ const drillReturnType = (rest, condition) => {
|
|
56
65
|
? drillReturnType(rem.at(-1), condition)
|
57
66
|
: [returns, rem]
|
58
67
|
}
|
68
|
+
const deepLambdaReturn = (rest, condition) => {
|
69
|
+
const body = rest.at(-1)
|
70
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
71
|
+
return condition(rem) ? rem : deepLambdaReturn(rem, condition)
|
72
|
+
}
|
59
73
|
const getScopeNames = (scope) => {
|
60
74
|
const scopeNames = []
|
61
75
|
let current = scope
|
@@ -74,10 +88,55 @@ const withScope = (name, scope) => {
|
|
74
88
|
}
|
75
89
|
export const typeCheck = (ast) => {
|
76
90
|
const root = {
|
91
|
+
[toTypeNames(APPLY)]: {
|
92
|
+
[STATS]: Object.freeze({
|
93
|
+
[TYPE_PROP]: [APPLY],
|
94
|
+
retried: RETRY_COUNT,
|
95
|
+
[ARGS_COUNT]: 1,
|
96
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
97
|
+
[RETURNS]: [APPLY]
|
98
|
+
})
|
99
|
+
},
|
100
|
+
[toTypeNames(ATOM)]: {
|
101
|
+
[STATS]: Object.freeze({
|
102
|
+
[TYPE_PROP]: [APPLY],
|
103
|
+
retried: RETRY_COUNT,
|
104
|
+
[ARGS_COUNT]: 1,
|
105
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
106
|
+
[RETURNS]: [ATOM]
|
107
|
+
})
|
108
|
+
},
|
109
|
+
[toTypeNames(PREDICATE)]: {
|
110
|
+
[STATS]: Object.freeze({
|
111
|
+
[TYPE_PROP]: [APPLY],
|
112
|
+
retried: RETRY_COUNT,
|
113
|
+
[ARGS_COUNT]: 1,
|
114
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
115
|
+
[RETURNS]: [ATOM, PREDICATE]
|
116
|
+
})
|
117
|
+
},
|
118
|
+
[toTypeNames(COLLECTION)]: {
|
119
|
+
[STATS]: Object.freeze({
|
120
|
+
[TYPE_PROP]: [APPLY],
|
121
|
+
retried: RETRY_COUNT,
|
122
|
+
[ARGS_COUNT]: 1,
|
123
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
124
|
+
[RETURNS]: [COLLECTION]
|
125
|
+
})
|
126
|
+
},
|
127
|
+
[toTypeNames(UNKNOWN)]: {
|
128
|
+
[STATS]: Object.freeze({
|
129
|
+
[TYPE_PROP]: [APPLY],
|
130
|
+
retried: RETRY_COUNT,
|
131
|
+
[ARGS_COUNT]: 1,
|
132
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
133
|
+
[RETURNS]: [UNKNOWN]
|
134
|
+
})
|
135
|
+
},
|
77
136
|
[DEBUG.LOG]: {
|
78
137
|
[STATS]: {
|
79
138
|
[TYPE_PROP]: [APPLY],
|
80
|
-
retried:
|
139
|
+
retried: RETRY_COUNT,
|
81
140
|
[ARGS]: [
|
82
141
|
[UNKNOWN, PLACEHOLDER],
|
83
142
|
[COLLECTION, PLACEHOLDER]
|
@@ -89,7 +148,7 @@ export const typeCheck = (ast) => {
|
|
89
148
|
[DEBUG.STRING]: {
|
90
149
|
[STATS]: {
|
91
150
|
[TYPE_PROP]: [APPLY],
|
92
|
-
retried:
|
151
|
+
retried: RETRY_COUNT,
|
93
152
|
[ARGS_COUNT]: 1,
|
94
153
|
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
95
154
|
[RETURNS]: [COLLECTION]
|
@@ -98,7 +157,7 @@ export const typeCheck = (ast) => {
|
|
98
157
|
[DEBUG.ASSERT]: {
|
99
158
|
[STATS]: {
|
100
159
|
[TYPE_PROP]: [APPLY],
|
101
|
-
retried:
|
160
|
+
retried: RETRY_COUNT,
|
102
161
|
[ARGS_COUNT]: VARIADIC,
|
103
162
|
[RETURNS]: [UNKNOWN]
|
104
163
|
}
|
@@ -106,7 +165,7 @@ export const typeCheck = (ast) => {
|
|
106
165
|
[DEBUG.SIGNATURE]: {
|
107
166
|
[STATS]: {
|
108
167
|
[TYPE_PROP]: [APPLY],
|
109
|
-
retried:
|
168
|
+
retried: RETRY_COUNT,
|
110
169
|
[ARGS_COUNT]: VARIADIC,
|
111
170
|
[RETURNS]: [UNKNOWN]
|
112
171
|
}
|
@@ -114,7 +173,7 @@ export const typeCheck = (ast) => {
|
|
114
173
|
[DEBUG.LIST_THEMES]: {
|
115
174
|
[STATS]: {
|
116
175
|
[TYPE_PROP]: [APPLY],
|
117
|
-
retried:
|
176
|
+
retried: RETRY_COUNT,
|
118
177
|
[ARGS_COUNT]: VARIADIC,
|
119
178
|
[RETURNS]: [UNKNOWN]
|
120
179
|
}
|
@@ -122,7 +181,7 @@ export const typeCheck = (ast) => {
|
|
122
181
|
[DEBUG.SET_THEME]: {
|
123
182
|
[STATS]: {
|
124
183
|
[TYPE_PROP]: [APPLY],
|
125
|
-
retried:
|
184
|
+
retried: RETRY_COUNT,
|
126
185
|
[ARGS_COUNT]: VARIADIC,
|
127
186
|
[RETURNS]: [UNKNOWN]
|
128
187
|
}
|
@@ -130,7 +189,7 @@ export const typeCheck = (ast) => {
|
|
130
189
|
[KEYWORDS.BLOCK]: {
|
131
190
|
[STATS]: {
|
132
191
|
[TYPE_PROP]: [APPLY],
|
133
|
-
retried:
|
192
|
+
retried: RETRY_COUNT,
|
134
193
|
[ARGS_COUNT]: VARIADIC,
|
135
194
|
[RETURNS]: [UNKNOWN]
|
136
195
|
}
|
@@ -138,7 +197,7 @@ export const typeCheck = (ast) => {
|
|
138
197
|
[KEYWORDS.ANONYMOUS_FUNCTION]: {
|
139
198
|
[STATS]: {
|
140
199
|
[TYPE_PROP]: [APPLY],
|
141
|
-
retried:
|
200
|
+
retried: RETRY_COUNT,
|
142
201
|
[ARGS_COUNT]: VARIADIC,
|
143
202
|
[RETURNS]: [APPLY]
|
144
203
|
}
|
@@ -146,7 +205,7 @@ export const typeCheck = (ast) => {
|
|
146
205
|
[KEYWORDS.CALL_FUNCTION]: {
|
147
206
|
[STATS]: {
|
148
207
|
[TYPE_PROP]: [APPLY],
|
149
|
-
retried:
|
208
|
+
retried: RETRY_COUNT,
|
150
209
|
[ARGS_COUNT]: VARIADIC,
|
151
210
|
[RETURNS]: [UNKNOWN]
|
152
211
|
}
|
@@ -154,7 +213,7 @@ export const typeCheck = (ast) => {
|
|
154
213
|
[KEYWORDS.CREATE_ARRAY]: {
|
155
214
|
[STATS]: {
|
156
215
|
[TYPE_PROP]: [APPLY],
|
157
|
-
retried:
|
216
|
+
retried: RETRY_COUNT,
|
158
217
|
[ARGS_COUNT]: VARIADIC,
|
159
218
|
[RETURNS]: [COLLECTION]
|
160
219
|
}
|
@@ -162,7 +221,7 @@ export const typeCheck = (ast) => {
|
|
162
221
|
[KEYWORDS.LOOP]: {
|
163
222
|
[STATS]: {
|
164
223
|
[TYPE_PROP]: [APPLY],
|
165
|
-
retried:
|
224
|
+
retried: RETRY_COUNT,
|
166
225
|
[ARGS_COUNT]: 2,
|
167
226
|
[ARGS]: [
|
168
227
|
[ATOM, PLACEHOLDER, PREDICATE],
|
@@ -174,7 +233,7 @@ export const typeCheck = (ast) => {
|
|
174
233
|
[KEYWORDS.ADDITION]: {
|
175
234
|
[STATS]: {
|
176
235
|
[TYPE_PROP]: [APPLY],
|
177
|
-
retried:
|
236
|
+
retried: RETRY_COUNT,
|
178
237
|
[ARGS_COUNT]: 2,
|
179
238
|
[ARGS]: [
|
180
239
|
[ATOM, PLACEHOLDER],
|
@@ -186,7 +245,7 @@ export const typeCheck = (ast) => {
|
|
186
245
|
[KEYWORDS.MULTIPLICATION]: {
|
187
246
|
[STATS]: {
|
188
247
|
[TYPE_PROP]: [APPLY],
|
189
|
-
retried:
|
248
|
+
retried: RETRY_COUNT,
|
190
249
|
[ARGS_COUNT]: 2,
|
191
250
|
[ARGS]: [
|
192
251
|
[ATOM, PLACEHOLDER],
|
@@ -198,7 +257,7 @@ export const typeCheck = (ast) => {
|
|
198
257
|
[KEYWORDS.SUBTRACTION]: {
|
199
258
|
[STATS]: {
|
200
259
|
[TYPE_PROP]: [APPLY],
|
201
|
-
retried:
|
260
|
+
retried: RETRY_COUNT,
|
202
261
|
[ARGS_COUNT]: 2,
|
203
262
|
[ARGS]: [
|
204
263
|
[ATOM, PLACEHOLDER],
|
@@ -210,7 +269,7 @@ export const typeCheck = (ast) => {
|
|
210
269
|
[KEYWORDS.DIVISION]: {
|
211
270
|
[STATS]: {
|
212
271
|
[TYPE_PROP]: [APPLY],
|
213
|
-
retried:
|
272
|
+
retried: RETRY_COUNT,
|
214
273
|
[ARGS_COUNT]: 2,
|
215
274
|
[ARGS]: [
|
216
275
|
[ATOM, PLACEHOLDER],
|
@@ -222,7 +281,7 @@ export const typeCheck = (ast) => {
|
|
222
281
|
[KEYWORDS.REMAINDER_OF_DIVISION]: {
|
223
282
|
[STATS]: {
|
224
283
|
[TYPE_PROP]: [APPLY],
|
225
|
-
retried:
|
284
|
+
retried: RETRY_COUNT,
|
226
285
|
[ARGS_COUNT]: 2,
|
227
286
|
[ARGS]: [
|
228
287
|
[ATOM, PLACEHOLDER],
|
@@ -234,7 +293,7 @@ export const typeCheck = (ast) => {
|
|
234
293
|
[KEYWORDS.BITWISE_AND]: {
|
235
294
|
[STATS]: {
|
236
295
|
[TYPE_PROP]: [APPLY],
|
237
|
-
retried:
|
296
|
+
retried: RETRY_COUNT,
|
238
297
|
[ARGS_COUNT]: 2,
|
239
298
|
[ARGS]: [
|
240
299
|
[ATOM, PLACEHOLDER],
|
@@ -246,7 +305,7 @@ export const typeCheck = (ast) => {
|
|
246
305
|
[KEYWORDS.BITWISE_NOT]: {
|
247
306
|
[STATS]: {
|
248
307
|
[TYPE_PROP]: [APPLY],
|
249
|
-
retried:
|
308
|
+
retried: RETRY_COUNT,
|
250
309
|
[ARGS_COUNT]: 1,
|
251
310
|
[ARGS]: [[ATOM, PLACEHOLDER]],
|
252
311
|
[RETURNS]: [ATOM]
|
@@ -255,7 +314,7 @@ export const typeCheck = (ast) => {
|
|
255
314
|
[KEYWORDS.BITWISE_OR]: {
|
256
315
|
[STATS]: {
|
257
316
|
[TYPE_PROP]: [APPLY],
|
258
|
-
retried:
|
317
|
+
retried: RETRY_COUNT,
|
259
318
|
[ARGS_COUNT]: 2,
|
260
319
|
[ARGS]: [
|
261
320
|
[ATOM, PLACEHOLDER],
|
@@ -267,7 +326,7 @@ export const typeCheck = (ast) => {
|
|
267
326
|
[KEYWORDS.BITWISE_XOR]: {
|
268
327
|
[STATS]: {
|
269
328
|
[TYPE_PROP]: [APPLY],
|
270
|
-
retried:
|
329
|
+
retried: RETRY_COUNT,
|
271
330
|
[ARGS_COUNT]: 2,
|
272
331
|
[ARGS]: [
|
273
332
|
[ATOM, PLACEHOLDER],
|
@@ -279,7 +338,7 @@ export const typeCheck = (ast) => {
|
|
279
338
|
[KEYWORDS.BITWISE_LEFT_SHIFT]: {
|
280
339
|
[STATS]: {
|
281
340
|
[TYPE_PROP]: [APPLY],
|
282
|
-
retried:
|
341
|
+
retried: RETRY_COUNT,
|
283
342
|
[ARGS_COUNT]: 2,
|
284
343
|
[ARGS]: [
|
285
344
|
[ATOM, PLACEHOLDER],
|
@@ -291,7 +350,7 @@ export const typeCheck = (ast) => {
|
|
291
350
|
[KEYWORDS.BITWISE_RIGHT_SHIFT]: {
|
292
351
|
[STATS]: {
|
293
352
|
[TYPE_PROP]: [APPLY],
|
294
|
-
retried:
|
353
|
+
retried: RETRY_COUNT,
|
295
354
|
[ARGS_COUNT]: 2,
|
296
355
|
[ARGS]: [
|
297
356
|
[ATOM, PLACEHOLDER],
|
@@ -303,7 +362,7 @@ export const typeCheck = (ast) => {
|
|
303
362
|
[KEYWORDS.GET_ARRAY]: {
|
304
363
|
[STATS]: {
|
305
364
|
[TYPE_PROP]: [APPLY],
|
306
|
-
retried:
|
365
|
+
retried: RETRY_COUNT,
|
307
366
|
[ARGS_COUNT]: 2,
|
308
367
|
[ARGS]: [
|
309
368
|
[COLLECTION, PLACEHOLDER],
|
@@ -315,7 +374,7 @@ export const typeCheck = (ast) => {
|
|
315
374
|
[KEYWORDS.SET_ARRAY]: {
|
316
375
|
[STATS]: {
|
317
376
|
[TYPE_PROP]: [APPLY],
|
318
|
-
retried:
|
377
|
+
retried: RETRY_COUNT,
|
319
378
|
[ARGS_COUNT]: 3,
|
320
379
|
[ARGS]: [
|
321
380
|
[COLLECTION, PLACEHOLDER],
|
@@ -328,7 +387,7 @@ export const typeCheck = (ast) => {
|
|
328
387
|
[KEYWORDS.POP_ARRAY]: {
|
329
388
|
[STATS]: {
|
330
389
|
[TYPE_PROP]: [APPLY],
|
331
|
-
retried:
|
390
|
+
retried: RETRY_COUNT,
|
332
391
|
[ARGS_COUNT]: 1,
|
333
392
|
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
334
393
|
[RETURNS]: [COLLECTION]
|
@@ -337,7 +396,7 @@ export const typeCheck = (ast) => {
|
|
337
396
|
[KEYWORDS.ARRAY_LENGTH]: {
|
338
397
|
[STATS]: {
|
339
398
|
[TYPE_PROP]: [APPLY],
|
340
|
-
retried:
|
399
|
+
retried: RETRY_COUNT,
|
341
400
|
[ARGS_COUNT]: 1,
|
342
401
|
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
343
402
|
[RETURNS]: [ATOM]
|
@@ -346,7 +405,7 @@ export const typeCheck = (ast) => {
|
|
346
405
|
[KEYWORDS.IF]: {
|
347
406
|
[STATS]: {
|
348
407
|
[TYPE_PROP]: [APPLY],
|
349
|
-
retried:
|
408
|
+
retried: RETRY_COUNT,
|
350
409
|
[ARGS_COUNT]: 3,
|
351
410
|
[ARGS]: [
|
352
411
|
[ATOM, PLACEHOLDER, PREDICATE],
|
@@ -359,7 +418,7 @@ export const typeCheck = (ast) => {
|
|
359
418
|
[KEYWORDS.NOT]: {
|
360
419
|
[STATS]: {
|
361
420
|
[TYPE_PROP]: [APPLY],
|
362
|
-
retried:
|
421
|
+
retried: RETRY_COUNT,
|
363
422
|
[ARGS_COUNT]: 1,
|
364
423
|
[ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
|
365
424
|
[RETURNS]: [ATOM, PREDICATE]
|
@@ -368,7 +427,7 @@ export const typeCheck = (ast) => {
|
|
368
427
|
[KEYWORDS.EQUAL]: {
|
369
428
|
[STATS]: {
|
370
429
|
[TYPE_PROP]: [APPLY],
|
371
|
-
retried:
|
430
|
+
retried: RETRY_COUNT,
|
372
431
|
[ARGS_COUNT]: 2,
|
373
432
|
[ARGS]: [
|
374
433
|
[ATOM, PLACEHOLDER],
|
@@ -380,7 +439,7 @@ export const typeCheck = (ast) => {
|
|
380
439
|
[KEYWORDS.LESS_THAN]: {
|
381
440
|
[STATS]: {
|
382
441
|
[TYPE_PROP]: [APPLY],
|
383
|
-
retried:
|
442
|
+
retried: RETRY_COUNT,
|
384
443
|
[ARGS_COUNT]: 2,
|
385
444
|
[ARGS]: [
|
386
445
|
[ATOM, PLACEHOLDER],
|
@@ -392,7 +451,7 @@ export const typeCheck = (ast) => {
|
|
392
451
|
[KEYWORDS.GREATHER_THAN]: {
|
393
452
|
[STATS]: {
|
394
453
|
[TYPE_PROP]: [APPLY],
|
395
|
-
retried:
|
454
|
+
retried: RETRY_COUNT,
|
396
455
|
[ARGS_COUNT]: 2,
|
397
456
|
[ARGS]: [
|
398
457
|
[ATOM, PLACEHOLDER],
|
@@ -404,7 +463,7 @@ export const typeCheck = (ast) => {
|
|
404
463
|
[KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
|
405
464
|
[STATS]: {
|
406
465
|
[TYPE_PROP]: [APPLY],
|
407
|
-
retried:
|
466
|
+
retried: RETRY_COUNT,
|
408
467
|
[ARGS_COUNT]: 2,
|
409
468
|
[ARGS]: [
|
410
469
|
[ATOM, PLACEHOLDER],
|
@@ -416,7 +475,7 @@ export const typeCheck = (ast) => {
|
|
416
475
|
[KEYWORDS.LESS_THAN_OR_EQUAL]: {
|
417
476
|
[STATS]: {
|
418
477
|
[TYPE_PROP]: [APPLY],
|
419
|
-
retried:
|
478
|
+
retried: RETRY_COUNT,
|
420
479
|
[ARGS_COUNT]: 2,
|
421
480
|
[ARGS]: [
|
422
481
|
[ATOM, PLACEHOLDER],
|
@@ -428,7 +487,7 @@ export const typeCheck = (ast) => {
|
|
428
487
|
[KEYWORDS.AND]: {
|
429
488
|
[STATS]: {
|
430
489
|
[TYPE_PROP]: [APPLY],
|
431
|
-
retried:
|
490
|
+
retried: RETRY_COUNT,
|
432
491
|
[ARGS_COUNT]: 2,
|
433
492
|
[ARGS]: [
|
434
493
|
[ATOM, PLACEHOLDER, PREDICATE],
|
@@ -440,7 +499,7 @@ export const typeCheck = (ast) => {
|
|
440
499
|
[KEYWORDS.OR]: {
|
441
500
|
[STATS]: {
|
442
501
|
[TYPE_PROP]: [APPLY],
|
443
|
-
retried:
|
502
|
+
retried: RETRY_COUNT,
|
444
503
|
[ARGS_COUNT]: 2,
|
445
504
|
[ARGS]: [
|
446
505
|
[ATOM, PLACEHOLDER, PREDICATE],
|
@@ -452,7 +511,7 @@ export const typeCheck = (ast) => {
|
|
452
511
|
[KEYWORDS.IS_ATOM]: {
|
453
512
|
[STATS]: {
|
454
513
|
[TYPE_PROP]: [APPLY],
|
455
|
-
retried:
|
514
|
+
retried: RETRY_COUNT,
|
456
515
|
[ARGS_COUNT]: 1,
|
457
516
|
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
458
517
|
[RETURNS]: [ATOM, PREDICATE]
|
@@ -461,7 +520,7 @@ export const typeCheck = (ast) => {
|
|
461
520
|
[KEYWORDS.IS_LAMBDA]: {
|
462
521
|
[STATS]: {
|
463
522
|
[TYPE_PROP]: [APPLY],
|
464
|
-
retried:
|
523
|
+
retried: RETRY_COUNT,
|
465
524
|
[ARGS_COUNT]: 1,
|
466
525
|
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
467
526
|
[RETURNS]: [ATOM, PREDICATE]
|
@@ -470,7 +529,7 @@ export const typeCheck = (ast) => {
|
|
470
529
|
[KEYWORDS.ERROR]: {
|
471
530
|
[STATS]: {
|
472
531
|
[TYPE_PROP]: [APPLY],
|
473
|
-
retried:
|
532
|
+
retried: RETRY_COUNT,
|
474
533
|
[ARGS_COUNT]: 1,
|
475
534
|
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
476
535
|
[RETURNS]: [UNKNOWN]
|
@@ -556,7 +615,6 @@ export const typeCheck = (ast) => {
|
|
556
615
|
// const alternative = isLeaf(re[1])
|
557
616
|
// ? env[re[1][VALUE]]
|
558
617
|
// : env[re[1][0][VALUE]]
|
559
|
-
|
560
618
|
env[name][STATS][prop] =
|
561
619
|
env[re[0][0][VALUE]][STATS][RETURNS]
|
562
620
|
if (
|
@@ -728,6 +786,7 @@ export const typeCheck = (ast) => {
|
|
728
786
|
// if (!(name in env)) {
|
729
787
|
if (rest[1][TYPE] === WORD) {
|
730
788
|
env[name] = env[rest[1][VALUE]]
|
789
|
+
|
731
790
|
if (
|
732
791
|
getSuffix(rest[1][VALUE]) === PREDICATE_SUFFIX &&
|
733
792
|
getSuffix(name) !== PREDICATE_SUFFIX
|
@@ -820,7 +879,6 @@ export const typeCheck = (ast) => {
|
|
820
879
|
const body = rest.at(-1).at(-1).at(-1)
|
821
880
|
const rem = hasBlock(body) ? body.at(-1) : body
|
822
881
|
const returns = isLeaf(rem) ? rem : rem[0]
|
823
|
-
// console.log({ returns })
|
824
882
|
resolveRetunType(
|
825
883
|
returns,
|
826
884
|
rem,
|
@@ -885,12 +943,64 @@ export const typeCheck = (ast) => {
|
|
885
943
|
retried: 0
|
886
944
|
}
|
887
945
|
}
|
888
|
-
|
889
|
-
|
890
|
-
|
946
|
+
const ref = env[copy[SCOPE_NAME]]
|
947
|
+
if (ref) {
|
948
|
+
if (ref[STATS][ARGS]) ref[STATS][ARGS][i] = copy[param[VALUE]]
|
891
949
|
if (getSuffix(param[VALUE]) === PREDICATE_SUFFIX) {
|
892
950
|
copy[param[VALUE]][STATS][RETURNS] = [ATOM, PREDICATE]
|
893
951
|
} else {
|
952
|
+
const returns = deepLambdaReturn(
|
953
|
+
hasBlock(exp) ? exp.at(-1) : exp,
|
954
|
+
(result) => result[VALUE] !== KEYWORDS.IF
|
955
|
+
)
|
956
|
+
if (isLeaf(returns)) {
|
957
|
+
} else {
|
958
|
+
const ret = returns[0]
|
959
|
+
switch (ret[VALUE]) {
|
960
|
+
case KEYWORDS.IF:
|
961
|
+
const re = returns.slice(2)
|
962
|
+
// If either is an ATOM then IF returns an ATOM
|
963
|
+
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
964
|
+
ref[STATS][RETURNS][0] = ATOM
|
965
|
+
// TODO check that both brancehs are predicates if one is
|
966
|
+
if (
|
967
|
+
getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
|
968
|
+
getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
|
969
|
+
) {
|
970
|
+
ref[STATS][RETURNS][1] = PREDICATE
|
971
|
+
}
|
972
|
+
} else {
|
973
|
+
const concequent = isLeaf(re[0])
|
974
|
+
? copy[re[0][VALUE]]
|
975
|
+
: copy[re[0][0][VALUE]]
|
976
|
+
const alternative = isLeaf(re[1])
|
977
|
+
? copy[re[1][VALUE]]
|
978
|
+
: copy[re[1][0][VALUE]]
|
979
|
+
|
980
|
+
// todo check if condition matches alternative
|
981
|
+
if (
|
982
|
+
concequent &&
|
983
|
+
concequent[STATS][RETURNS][0] !== UNKNOWN
|
984
|
+
) {
|
985
|
+
ref[STATS][RETURNS] = concequent[STATS][RETURNS]
|
986
|
+
} else if (
|
987
|
+
alternative &&
|
988
|
+
alternative[STATS][RETURNS][0] !== UNKNOWN
|
989
|
+
) {
|
990
|
+
ref[STATS][RETURNS] = alternative[STATS][RETURNS]
|
991
|
+
} else if (concequent) {
|
992
|
+
ref[STATS][RETURNS] = concequent[STATS][RETURNS]
|
993
|
+
}
|
994
|
+
}
|
995
|
+
|
996
|
+
break
|
997
|
+
default:
|
998
|
+
if (copy[ret[VALUE]])
|
999
|
+
ref[STATS][RETURNS] =
|
1000
|
+
copy[ret[VALUE]][STATS][RETURNS]
|
1001
|
+
break
|
1002
|
+
}
|
1003
|
+
}
|
894
1004
|
// TODO overwrite return type check here
|
895
1005
|
// console.log(copy[SCOPE_NAME], env[copy[SCOPE_NAME]], copy)
|
896
1006
|
}
|
@@ -925,7 +1035,6 @@ export const typeCheck = (ast) => {
|
|
925
1035
|
)
|
926
1036
|
} else {
|
927
1037
|
const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
|
928
|
-
|
929
1038
|
if (first[TYPE] === APPLY && !isSpecial) {
|
930
1039
|
if (env[first[VALUE]][STATS][TYPE_PROP][0] === ATOM) {
|
931
1040
|
errorStack.set(
|
@@ -939,6 +1048,7 @@ export const typeCheck = (ast) => {
|
|
939
1048
|
if (env[first[VALUE]][STATS][RETURNS][0] === APPLY) {
|
940
1049
|
env[first[VALUE]][STATS][RETURNS] = [UNKNOWN]
|
941
1050
|
}
|
1051
|
+
|
942
1052
|
env[first[VALUE]][STATS][TYPE_PROP] = [APPLY]
|
943
1053
|
env[first[VALUE]][STATS][ARGS_COUNT] = rest.length
|
944
1054
|
}
|
@@ -1103,17 +1213,7 @@ export const typeCheck = (ast) => {
|
|
1103
1213
|
)
|
1104
1214
|
}
|
1105
1215
|
}
|
1106
|
-
|
1107
|
-
// // console.log({ returns })
|
1108
|
-
// resolveRetunType(
|
1109
|
-
// returns,
|
1110
|
-
// rem,
|
1111
|
-
// TYPE_PROP,
|
1112
|
-
// isPredicate
|
1113
|
-
// )
|
1114
1216
|
}
|
1115
|
-
|
1116
|
-
// console.log(args[i], env[current[VALUE]][STATS])
|
1117
1217
|
} else if (
|
1118
1218
|
args[i][SUB] &&
|
1119
1219
|
env[current[VALUE]] &&
|
@@ -1189,10 +1289,10 @@ export const typeCheck = (ast) => {
|
|
1189
1289
|
expectedArgs[i][TYPE] !== rest[i][TYPE]
|
1190
1290
|
) {
|
1191
1291
|
switch (rest[i][TYPE]) {
|
1192
|
-
case UNKNOWN:
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1292
|
+
// case UNKNOWN:
|
1293
|
+
// env[first[VALUE]][STATS][TYPE_PROP][0] =
|
1294
|
+
// expectedArgs[i][TYPE]
|
1295
|
+
// break
|
1196
1296
|
case WORD:
|
1197
1297
|
const T =
|
1198
1298
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0]
|
@@ -1230,6 +1330,7 @@ export const typeCheck = (ast) => {
|
|
1230
1330
|
)
|
1231
1331
|
break
|
1232
1332
|
}
|
1333
|
+
} else {
|
1233
1334
|
}
|
1234
1335
|
}
|
1235
1336
|
}
|
@@ -1274,6 +1375,12 @@ export const typeCheck = (ast) => {
|
|
1274
1375
|
) {
|
1275
1376
|
retry[STATS].retried += 1
|
1276
1377
|
stack.unshift(() => check(exp, env, scope))
|
1378
|
+
} else if (
|
1379
|
+
args[i][STATS][TYPE_PROP][0] === UNKNOWN &&
|
1380
|
+
args[i][STATS].retried < DEFINITON_RETRY_COUNT
|
1381
|
+
) {
|
1382
|
+
args[i][STATS].retried += 1
|
1383
|
+
stack.unshift(() => check(exp, env, scope))
|
1277
1384
|
}
|
1278
1385
|
}
|
1279
1386
|
} else if (
|
@@ -1315,7 +1422,6 @@ export const typeCheck = (ast) => {
|
|
1315
1422
|
}
|
1316
1423
|
}
|
1317
1424
|
})
|
1318
|
-
// console.log(env)
|
1319
1425
|
for (const r of rest) check(r, env, scope)
|
1320
1426
|
break
|
1321
1427
|
}
|
package/src/compiler.js
CHANGED
@@ -5,7 +5,8 @@ import {
|
|
5
5
|
KEYWORDS,
|
6
6
|
TYPE,
|
7
7
|
VALUE,
|
8
|
-
WORD
|
8
|
+
WORD,
|
9
|
+
STATIC_TYPES
|
9
10
|
} from './keywords.js'
|
10
11
|
import { OPTIMIZATIONS } from './macros.js'
|
11
12
|
import { leaf, isLeaf, AST } from './parser.js'
|
@@ -262,6 +263,14 @@ const comp = (tree, Drill) => {
|
|
262
263
|
Drill.Helpers.add('__error')
|
263
264
|
return `__error(${compile(tail[0], Drill)})`
|
264
265
|
}
|
266
|
+
|
267
|
+
case STATIC_TYPES.APPLICATION:
|
268
|
+
case STATIC_TYPES.COLLECTION:
|
269
|
+
case STATIC_TYPES.UNKNOWN:
|
270
|
+
case STATIC_TYPES.ATOM:
|
271
|
+
case STATIC_TYPES.PREDICATE:
|
272
|
+
return compile(tail[0], Drill)
|
273
|
+
|
265
274
|
default: {
|
266
275
|
const camelCased = lispToJavaScriptVariableName(token)
|
267
276
|
if (camelCased in Helpers) Drill.Helpers.add(camelCased)
|
package/src/interpreter.js
CHANGED
@@ -7,7 +7,8 @@ import {
|
|
7
7
|
TRUE,
|
8
8
|
TYPES,
|
9
9
|
RUNTIME_TYPES,
|
10
|
-
DEBUG
|
10
|
+
DEBUG,
|
11
|
+
STATIC_TYPES
|
11
12
|
} from './keywords.js'
|
12
13
|
import { evaluate } from './evaluator.js'
|
13
14
|
import { isForbiddenVariableName, stringifyArgs } from './utils.js'
|
@@ -837,5 +838,11 @@ export const keywords = {
|
|
837
838
|
}) but got (${expression}) (${KEYWORDS.ERROR} ${stringifyArgs(args)})`
|
838
839
|
)
|
839
840
|
throw new Error(expression.map((x) => String.fromCharCode(x)).join(''))
|
840
|
-
}
|
841
|
+
},
|
842
|
+
|
843
|
+
[STATIC_TYPES.APPLICATION]: (args, env) => evaluate(args[0], env),
|
844
|
+
[STATIC_TYPES.ATOM]: (args, env) => evaluate(args[0], env),
|
845
|
+
[STATIC_TYPES.COLLECTION]: (args, env) => evaluate(args[0], env),
|
846
|
+
[STATIC_TYPES.PREDICATE]: (args, env) => evaluate(args[0], env),
|
847
|
+
[STATIC_TYPES.UNKNOWN]: (args, env) => evaluate(args[0], env)
|
841
848
|
}
|
package/src/keywords.js
CHANGED
@@ -8,6 +8,13 @@ export const FALSE = 0
|
|
8
8
|
export const PLACEHOLDER = '.'
|
9
9
|
export const MUTATION_SUFFIX = '!'
|
10
10
|
export const PREDICATE_SUFFIX = '?'
|
11
|
+
export const STATIC_TYPES = {
|
12
|
+
APPLICATION: 'Application',
|
13
|
+
UNKNOWN: 'Unknown',
|
14
|
+
ATOM: 'Atom',
|
15
|
+
COLLECTION: 'Collection',
|
16
|
+
PREDICATE: 'Predicate'
|
17
|
+
}
|
11
18
|
export const KEYWORDS = {
|
12
19
|
LOOP: 'loop',
|
13
20
|
CREATE_ARRAY: 'array',
|
package/src/utils.js
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
import std from '../lib/baked/std.js'
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
APPLY,
|
4
|
+
ATOM,
|
5
|
+
KEYWORDS,
|
6
|
+
STATIC_TYPES,
|
7
|
+
TYPE,
|
8
|
+
VALUE,
|
9
|
+
WORD
|
10
|
+
} from './keywords.js'
|
3
11
|
import { evaluate } from './evaluator.js'
|
4
12
|
import { isLeaf, LISP } from './parser.js'
|
5
13
|
import {
|
@@ -16,9 +24,8 @@ export const formatCallstack = (callstack) =>
|
|
16
24
|
.reverse()
|
17
25
|
.map((x, i) => `${Array(i + 2).join(' ')}(${x} ...)`)
|
18
26
|
.join('\n')
|
19
|
-
export const formatErrorWithCallstack = (error, callstack) =>
|
20
|
-
|
21
|
-
}
|
27
|
+
export const formatErrorWithCallstack = (error, callstack) =>
|
28
|
+
`${error.message}\n${formatCallstack(callstack)}`
|
22
29
|
export const getSuffix = (str) => str[str.length - 1]
|
23
30
|
export const removeNoCode = (source) =>
|
24
31
|
source
|
@@ -309,6 +316,19 @@ export const parse = (source) =>
|
|
309
316
|
)
|
310
317
|
)
|
311
318
|
|
319
|
+
export const addTypeIdentities = (ast) => {
|
320
|
+
const block = ast[1][1]
|
321
|
+
const temp = block.shift()
|
322
|
+
block.unshift(
|
323
|
+
temp,
|
324
|
+
identity(STATIC_TYPES.APPLICATION),
|
325
|
+
identity(STATIC_TYPES.ATOM),
|
326
|
+
identity(STATIC_TYPES.COLLECTION),
|
327
|
+
identity(STATIC_TYPES.PREDICATE),
|
328
|
+
identity(STATIC_TYPES.UNKNOWN)
|
329
|
+
)
|
330
|
+
}
|
331
|
+
|
312
332
|
export const UTILS = {
|
313
333
|
handleUnbalancedQuotes,
|
314
334
|
handleUnbalancedParens,
|