fez-lisp 1.5.51 → 1.5.53
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/README.md +4 -4
- package/index.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +915 -185
- package/src/keywords.js +2 -1
- package/src/macros.js +95 -85
package/src/check.js
CHANGED
@@ -24,11 +24,12 @@ import {
|
|
24
24
|
const ARGS_COUNT = 'n'
|
25
25
|
const VARIADIC = Infinity
|
26
26
|
const STATS = '__stats__'
|
27
|
-
const
|
27
|
+
const ARGUMENTS = 'arguments'
|
28
28
|
const UNKNOWN = -1
|
29
29
|
const RETURNS = 'returns'
|
30
30
|
const SCOPE_NAME = '__scope__'
|
31
31
|
const TYPE_PROP = 'type'
|
32
|
+
const SIGNATURE = 'name'
|
32
33
|
const PREDICATE = 3
|
33
34
|
const COLLECTION = 4
|
34
35
|
const RETRY_COUNT = 1
|
@@ -46,6 +47,8 @@ const toTypeNames = (type) => {
|
|
46
47
|
return 'Predicate'
|
47
48
|
case COLLECTION:
|
48
49
|
return 'Collection'
|
50
|
+
default:
|
51
|
+
break
|
49
52
|
}
|
50
53
|
}
|
51
54
|
export const identity = (name) => [
|
@@ -70,79 +73,183 @@ const deepLambdaReturn = (rest, condition) => {
|
|
70
73
|
const rem = hasBlock(body) ? body.at(-1) : body
|
71
74
|
return condition(rem) ? rem : deepLambdaReturn(rem, condition)
|
72
75
|
}
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
76
|
+
const formatType = (name, env) => {
|
77
|
+
const stats = env[name][STATS]
|
78
|
+
return stats
|
79
|
+
? stats[TYPE_PROP][0] === APPLY
|
80
|
+
? `${name} (${(stats[ARGUMENTS] ?? [])
|
81
|
+
.map(
|
82
|
+
(x) =>
|
83
|
+
`${x[STATS][SIGNATURE]} ${toTypeNames(x[STATS][TYPE_PROP][0])}`
|
84
|
+
)
|
85
|
+
.join(' ')}) -> ${toTypeNames(
|
86
|
+
stats[RETURNS][1] ?? stats[RETURNS][0]
|
87
|
+
)}`
|
88
|
+
: `${name} ${toTypeNames(stats[TYPE_PROP][0])}`
|
89
|
+
: name
|
90
|
+
}
|
91
|
+
const formatTypes = (env) => {
|
92
|
+
const out = []
|
93
|
+
for (let x in env) {
|
94
|
+
if (x !== SCOPE_NAME) out.push(formatType(x, env))
|
95
|
+
}
|
96
|
+
return out
|
97
|
+
}
|
98
|
+
const getScopeNames = (scope) => {
|
99
|
+
const scopeNames = []
|
100
|
+
let current = scope
|
101
|
+
while (current) {
|
102
|
+
if (current[SCOPE_NAME]) {
|
103
|
+
scopeNames.push(current[SCOPE_NAME])
|
104
|
+
}
|
105
|
+
current = Object.getPrototypeOf(current)
|
106
|
+
}
|
107
|
+
return scopeNames.reverse()
|
108
|
+
}
|
109
|
+
const withScope = (name, scope) => {
|
110
|
+
const chain = getScopeNames(scope)
|
111
|
+
return `${chain.join(' ')} ${name}`
|
112
|
+
}
|
92
113
|
export const typeCheck = (ast) => {
|
93
114
|
const root = {
|
94
115
|
[toTypeNames(APPLY)]: {
|
95
|
-
[STATS]:
|
116
|
+
[STATS]: {
|
96
117
|
[TYPE_PROP]: [APPLY],
|
118
|
+
[SIGNATURE]: toTypeNames(APPLY),
|
97
119
|
retried: RETRY_COUNT,
|
98
120
|
[ARGS_COUNT]: 1,
|
99
|
-
[
|
121
|
+
[ARGUMENTS]: [
|
122
|
+
{
|
123
|
+
[STATS]: {
|
124
|
+
retried: RETRY_COUNT,
|
125
|
+
[SIGNATURE]: PLACEHOLDER,
|
126
|
+
[TYPE_PROP]: [UNKNOWN],
|
127
|
+
[RETURNS]: [UNKNOWN],
|
128
|
+
[ARGS_COUNT]: [],
|
129
|
+
[ARGUMENTS]: [],
|
130
|
+
[ARGS_COUNT]: 0
|
131
|
+
}
|
132
|
+
}
|
133
|
+
],
|
100
134
|
[RETURNS]: [APPLY]
|
101
|
-
}
|
135
|
+
}
|
102
136
|
},
|
103
137
|
[toTypeNames(ATOM)]: {
|
104
|
-
[STATS]:
|
138
|
+
[STATS]: {
|
105
139
|
[TYPE_PROP]: [APPLY],
|
140
|
+
[SIGNATURE]: toTypeNames(ATOM),
|
106
141
|
retried: RETRY_COUNT,
|
107
142
|
[ARGS_COUNT]: 1,
|
108
|
-
[
|
143
|
+
[ARGUMENTS]: [
|
144
|
+
{
|
145
|
+
[STATS]: {
|
146
|
+
retried: RETRY_COUNT,
|
147
|
+
[SIGNATURE]: PLACEHOLDER,
|
148
|
+
[TYPE_PROP]: [UNKNOWN],
|
149
|
+
[RETURNS]: [UNKNOWN],
|
150
|
+
[ARGS_COUNT]: [],
|
151
|
+
[ARGUMENTS]: [],
|
152
|
+
[ARGS_COUNT]: 0
|
153
|
+
}
|
154
|
+
}
|
155
|
+
],
|
109
156
|
[RETURNS]: [ATOM]
|
110
|
-
}
|
157
|
+
}
|
111
158
|
},
|
112
159
|
[toTypeNames(PREDICATE)]: {
|
113
|
-
[STATS]:
|
114
|
-
[TYPE_PROP]: [APPLY],
|
160
|
+
[STATS]: {
|
161
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
162
|
+
[SIGNATURE]: toTypeNames(PREDICATE),
|
115
163
|
retried: RETRY_COUNT,
|
116
164
|
[ARGS_COUNT]: 1,
|
117
|
-
[
|
165
|
+
[ARGUMENTS]: [
|
166
|
+
{
|
167
|
+
[STATS]: {
|
168
|
+
retried: RETRY_COUNT,
|
169
|
+
[SIGNATURE]: PLACEHOLDER,
|
170
|
+
[TYPE_PROP]: [UNKNOWN],
|
171
|
+
[RETURNS]: [UNKNOWN],
|
172
|
+
[ARGS_COUNT]: [],
|
173
|
+
[ARGUMENTS]: [],
|
174
|
+
[ARGS_COUNT]: 0
|
175
|
+
}
|
176
|
+
}
|
177
|
+
],
|
118
178
|
[RETURNS]: [ATOM, PREDICATE]
|
119
|
-
}
|
179
|
+
}
|
120
180
|
},
|
121
181
|
[toTypeNames(COLLECTION)]: {
|
122
|
-
[STATS]:
|
182
|
+
[STATS]: {
|
123
183
|
[TYPE_PROP]: [APPLY],
|
184
|
+
[SIGNATURE]: toTypeNames(COLLECTION),
|
124
185
|
retried: RETRY_COUNT,
|
125
186
|
[ARGS_COUNT]: 1,
|
126
|
-
[
|
187
|
+
[ARGUMENTS]: [
|
188
|
+
{
|
189
|
+
[STATS]: {
|
190
|
+
retried: RETRY_COUNT,
|
191
|
+
[SIGNATURE]: PLACEHOLDER,
|
192
|
+
[TYPE_PROP]: [UNKNOWN],
|
193
|
+
[RETURNS]: [UNKNOWN],
|
194
|
+
[ARGS_COUNT]: [],
|
195
|
+
[ARGUMENTS]: [],
|
196
|
+
[ARGS_COUNT]: 0
|
197
|
+
}
|
198
|
+
}
|
199
|
+
],
|
127
200
|
[RETURNS]: [COLLECTION]
|
128
|
-
}
|
201
|
+
}
|
129
202
|
},
|
130
203
|
[toTypeNames(UNKNOWN)]: {
|
131
|
-
[STATS]:
|
204
|
+
[STATS]: {
|
132
205
|
[TYPE_PROP]: [APPLY],
|
206
|
+
[SIGNATURE]: toTypeNames(UNKNOWN),
|
133
207
|
retried: RETRY_COUNT,
|
134
208
|
[ARGS_COUNT]: 1,
|
135
|
-
[
|
209
|
+
[ARGUMENTS]: [
|
210
|
+
{
|
211
|
+
[STATS]: {
|
212
|
+
retried: RETRY_COUNT,
|
213
|
+
[SIGNATURE]: PLACEHOLDER,
|
214
|
+
[TYPE_PROP]: [UNKNOWN],
|
215
|
+
[RETURNS]: [UNKNOWN],
|
216
|
+
[ARGS_COUNT]: [],
|
217
|
+
[ARGUMENTS]: [],
|
218
|
+
[ARGS_COUNT]: 0
|
219
|
+
}
|
220
|
+
}
|
221
|
+
],
|
136
222
|
[RETURNS]: [UNKNOWN]
|
137
|
-
}
|
223
|
+
}
|
138
224
|
},
|
139
225
|
[DEBUG.LOG]: {
|
140
226
|
[STATS]: {
|
141
227
|
[TYPE_PROP]: [APPLY],
|
228
|
+
[SIGNATURE]: DEBUG.LOG,
|
142
229
|
retried: RETRY_COUNT,
|
143
|
-
[
|
144
|
-
|
145
|
-
|
230
|
+
[ARGUMENTS]: [
|
231
|
+
{
|
232
|
+
[STATS]: {
|
233
|
+
retried: 0,
|
234
|
+
[SIGNATURE]: PLACEHOLDER,
|
235
|
+
[TYPE_PROP]: [UNKNOWN],
|
236
|
+
[RETURNS]: [UNKNOWN],
|
237
|
+
[ARGS_COUNT]: [],
|
238
|
+
[ARGUMENTS]: [],
|
239
|
+
[ARGS_COUNT]: 0
|
240
|
+
}
|
241
|
+
},
|
242
|
+
{
|
243
|
+
[STATS]: {
|
244
|
+
retried: 0,
|
245
|
+
[SIGNATURE]: PLACEHOLDER,
|
246
|
+
[TYPE_PROP]: [COLLECTION],
|
247
|
+
[RETURNS]: [COLLECTION],
|
248
|
+
[ARGS_COUNT]: [],
|
249
|
+
[ARGUMENTS]: [],
|
250
|
+
[ARGS_COUNT]: 0
|
251
|
+
}
|
252
|
+
}
|
146
253
|
],
|
147
254
|
[ARGS_COUNT]: 2,
|
148
255
|
[RETURNS]: [UNKNOWN]
|
@@ -151,15 +258,29 @@ export const typeCheck = (ast) => {
|
|
151
258
|
[DEBUG.STRING]: {
|
152
259
|
[STATS]: {
|
153
260
|
[TYPE_PROP]: [APPLY],
|
261
|
+
[SIGNATURE]: DEBUG.STRING,
|
154
262
|
retried: RETRY_COUNT,
|
155
263
|
[ARGS_COUNT]: 1,
|
156
|
-
[
|
264
|
+
[ARGUMENTS]: [
|
265
|
+
{
|
266
|
+
[STATS]: {
|
267
|
+
retried: 0,
|
268
|
+
[SIGNATURE]: PLACEHOLDER,
|
269
|
+
[TYPE_PROP]: [COLLECTION],
|
270
|
+
[RETURNS]: [COLLECTION],
|
271
|
+
[ARGS_COUNT]: [],
|
272
|
+
[ARGUMENTS]: [],
|
273
|
+
[ARGS_COUNT]: 0
|
274
|
+
}
|
275
|
+
}
|
276
|
+
],
|
157
277
|
[RETURNS]: [COLLECTION]
|
158
278
|
}
|
159
279
|
},
|
160
280
|
[DEBUG.ASSERT]: {
|
161
281
|
[STATS]: {
|
162
282
|
[TYPE_PROP]: [APPLY],
|
283
|
+
[SIGNATURE]: DEBUG.ASSERT,
|
163
284
|
retried: RETRY_COUNT,
|
164
285
|
[ARGS_COUNT]: VARIADIC,
|
165
286
|
[RETURNS]: [UNKNOWN]
|
@@ -168,6 +289,16 @@ export const typeCheck = (ast) => {
|
|
168
289
|
[DEBUG.SIGNATURE]: {
|
169
290
|
[STATS]: {
|
170
291
|
[TYPE_PROP]: [APPLY],
|
292
|
+
[SIGNATURE]: DEBUG.SIGNATURE,
|
293
|
+
retried: RETRY_COUNT,
|
294
|
+
[ARGS_COUNT]: VARIADIC,
|
295
|
+
[RETURNS]: [UNKNOWN]
|
296
|
+
}
|
297
|
+
},
|
298
|
+
[DEBUG.TYPE_SIGNATURE]: {
|
299
|
+
[STATS]: {
|
300
|
+
[TYPE_PROP]: [APPLY],
|
301
|
+
[SIGNATURE]: DEBUG.TYPE_SIGNATURE,
|
171
302
|
retried: RETRY_COUNT,
|
172
303
|
[ARGS_COUNT]: VARIADIC,
|
173
304
|
[RETURNS]: [UNKNOWN]
|
@@ -176,6 +307,7 @@ export const typeCheck = (ast) => {
|
|
176
307
|
[DEBUG.LIST_THEMES]: {
|
177
308
|
[STATS]: {
|
178
309
|
[TYPE_PROP]: [APPLY],
|
310
|
+
[SIGNATURE]: DEBUG.LIST_THEMES,
|
179
311
|
retried: RETRY_COUNT,
|
180
312
|
[ARGS_COUNT]: VARIADIC,
|
181
313
|
[RETURNS]: [UNKNOWN]
|
@@ -184,6 +316,7 @@ export const typeCheck = (ast) => {
|
|
184
316
|
[DEBUG.SET_THEME]: {
|
185
317
|
[STATS]: {
|
186
318
|
[TYPE_PROP]: [APPLY],
|
319
|
+
[SIGNATURE]: DEBUG.SET_THEME,
|
187
320
|
retried: RETRY_COUNT,
|
188
321
|
[ARGS_COUNT]: VARIADIC,
|
189
322
|
[RETURNS]: [UNKNOWN]
|
@@ -192,6 +325,7 @@ export const typeCheck = (ast) => {
|
|
192
325
|
[KEYWORDS.BLOCK]: {
|
193
326
|
[STATS]: {
|
194
327
|
[TYPE_PROP]: [APPLY],
|
328
|
+
[SIGNATURE]: KEYWORDS.BLOCK,
|
195
329
|
retried: RETRY_COUNT,
|
196
330
|
[ARGS_COUNT]: VARIADIC,
|
197
331
|
[RETURNS]: [UNKNOWN]
|
@@ -200,6 +334,7 @@ export const typeCheck = (ast) => {
|
|
200
334
|
[KEYWORDS.ANONYMOUS_FUNCTION]: {
|
201
335
|
[STATS]: {
|
202
336
|
[TYPE_PROP]: [APPLY],
|
337
|
+
[SIGNATURE]: KEYWORDS.ANONYMOUS_FUNCTION,
|
203
338
|
retried: RETRY_COUNT,
|
204
339
|
[ARGS_COUNT]: VARIADIC,
|
205
340
|
[RETURNS]: [APPLY]
|
@@ -208,6 +343,7 @@ export const typeCheck = (ast) => {
|
|
208
343
|
[KEYWORDS.CALL_FUNCTION]: {
|
209
344
|
[STATS]: {
|
210
345
|
[TYPE_PROP]: [APPLY],
|
346
|
+
[SIGNATURE]: KEYWORDS.CALL_FUNCTION,
|
211
347
|
retried: RETRY_COUNT,
|
212
348
|
[ARGS_COUNT]: VARIADIC,
|
213
349
|
[RETURNS]: [UNKNOWN]
|
@@ -216,6 +352,7 @@ export const typeCheck = (ast) => {
|
|
216
352
|
[KEYWORDS.CREATE_ARRAY]: {
|
217
353
|
[STATS]: {
|
218
354
|
[TYPE_PROP]: [APPLY],
|
355
|
+
[SIGNATURE]: KEYWORDS.CREATE_ARRAY,
|
219
356
|
retried: RETRY_COUNT,
|
220
357
|
[ARGS_COUNT]: VARIADIC,
|
221
358
|
[RETURNS]: [COLLECTION]
|
@@ -224,11 +361,32 @@ export const typeCheck = (ast) => {
|
|
224
361
|
[KEYWORDS.LOOP]: {
|
225
362
|
[STATS]: {
|
226
363
|
[TYPE_PROP]: [APPLY],
|
364
|
+
[SIGNATURE]: KEYWORDS.LOOP,
|
227
365
|
retried: RETRY_COUNT,
|
228
366
|
[ARGS_COUNT]: 2,
|
229
|
-
[
|
230
|
-
|
231
|
-
|
367
|
+
[ARGUMENTS]: [
|
368
|
+
{
|
369
|
+
[STATS]: {
|
370
|
+
retried: 0,
|
371
|
+
[SIGNATURE]: PLACEHOLDER,
|
372
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
373
|
+
[RETURNS]: [ATOM, PREDICATE],
|
374
|
+
[ARGS_COUNT]: [],
|
375
|
+
[ARGUMENTS]: [],
|
376
|
+
[ARGS_COUNT]: 0
|
377
|
+
}
|
378
|
+
},
|
379
|
+
{
|
380
|
+
[STATS]: {
|
381
|
+
retried: 0,
|
382
|
+
[SIGNATURE]: PLACEHOLDER,
|
383
|
+
[TYPE_PROP]: [UNKNOWN],
|
384
|
+
[RETURNS]: [UNKNOWN],
|
385
|
+
[ARGS_COUNT]: [],
|
386
|
+
[ARGUMENTS]: [],
|
387
|
+
[ARGS_COUNT]: 0
|
388
|
+
}
|
389
|
+
}
|
232
390
|
],
|
233
391
|
[RETURNS]: [ATOM]
|
234
392
|
}
|
@@ -236,11 +394,32 @@ export const typeCheck = (ast) => {
|
|
236
394
|
[KEYWORDS.ADDITION]: {
|
237
395
|
[STATS]: {
|
238
396
|
[TYPE_PROP]: [APPLY],
|
397
|
+
[SIGNATURE]: KEYWORDS.ADDITION,
|
239
398
|
retried: RETRY_COUNT,
|
240
399
|
[ARGS_COUNT]: 2,
|
241
|
-
[
|
242
|
-
|
243
|
-
|
400
|
+
[ARGUMENTS]: [
|
401
|
+
{
|
402
|
+
[STATS]: {
|
403
|
+
retried: 0,
|
404
|
+
[SIGNATURE]: PLACEHOLDER,
|
405
|
+
[TYPE_PROP]: [ATOM],
|
406
|
+
[RETURNS]: [ATOM],
|
407
|
+
[ARGS_COUNT]: [],
|
408
|
+
[ARGUMENTS]: [],
|
409
|
+
[ARGS_COUNT]: 0
|
410
|
+
}
|
411
|
+
},
|
412
|
+
{
|
413
|
+
[STATS]: {
|
414
|
+
retried: 0,
|
415
|
+
[SIGNATURE]: PLACEHOLDER,
|
416
|
+
[TYPE_PROP]: [ATOM],
|
417
|
+
[RETURNS]: [ATOM],
|
418
|
+
[ARGS_COUNT]: [],
|
419
|
+
[ARGUMENTS]: [],
|
420
|
+
[ARGS_COUNT]: 0
|
421
|
+
}
|
422
|
+
}
|
244
423
|
],
|
245
424
|
[RETURNS]: [ATOM]
|
246
425
|
}
|
@@ -248,11 +427,32 @@ export const typeCheck = (ast) => {
|
|
248
427
|
[KEYWORDS.MULTIPLICATION]: {
|
249
428
|
[STATS]: {
|
250
429
|
[TYPE_PROP]: [APPLY],
|
430
|
+
[SIGNATURE]: KEYWORDS.MULTIPLICATION,
|
251
431
|
retried: RETRY_COUNT,
|
252
432
|
[ARGS_COUNT]: 2,
|
253
|
-
[
|
254
|
-
|
255
|
-
|
433
|
+
[ARGUMENTS]: [
|
434
|
+
{
|
435
|
+
[STATS]: {
|
436
|
+
retried: 0,
|
437
|
+
[SIGNATURE]: PLACEHOLDER,
|
438
|
+
[TYPE_PROP]: [ATOM],
|
439
|
+
[RETURNS]: [ATOM],
|
440
|
+
[ARGS_COUNT]: [],
|
441
|
+
[ARGUMENTS]: [],
|
442
|
+
[ARGS_COUNT]: 0
|
443
|
+
}
|
444
|
+
},
|
445
|
+
{
|
446
|
+
[STATS]: {
|
447
|
+
retried: 0,
|
448
|
+
[SIGNATURE]: PLACEHOLDER,
|
449
|
+
[TYPE_PROP]: [ATOM],
|
450
|
+
[RETURNS]: [ATOM],
|
451
|
+
[ARGS_COUNT]: [],
|
452
|
+
[ARGUMENTS]: [],
|
453
|
+
[ARGS_COUNT]: 0
|
454
|
+
}
|
455
|
+
}
|
256
456
|
],
|
257
457
|
[RETURNS]: [ATOM]
|
258
458
|
}
|
@@ -260,11 +460,32 @@ export const typeCheck = (ast) => {
|
|
260
460
|
[KEYWORDS.SUBTRACTION]: {
|
261
461
|
[STATS]: {
|
262
462
|
[TYPE_PROP]: [APPLY],
|
463
|
+
[SIGNATURE]: KEYWORDS.SUBTRACTION,
|
263
464
|
retried: RETRY_COUNT,
|
264
465
|
[ARGS_COUNT]: 2,
|
265
|
-
[
|
266
|
-
|
267
|
-
|
466
|
+
[ARGUMENTS]: [
|
467
|
+
{
|
468
|
+
[STATS]: {
|
469
|
+
retried: 0,
|
470
|
+
[SIGNATURE]: PLACEHOLDER,
|
471
|
+
[TYPE_PROP]: [ATOM],
|
472
|
+
[RETURNS]: [ATOM],
|
473
|
+
[ARGS_COUNT]: [],
|
474
|
+
[ARGUMENTS]: [],
|
475
|
+
[ARGS_COUNT]: 0
|
476
|
+
}
|
477
|
+
},
|
478
|
+
{
|
479
|
+
[STATS]: {
|
480
|
+
retried: 0,
|
481
|
+
[SIGNATURE]: PLACEHOLDER,
|
482
|
+
[TYPE_PROP]: [ATOM],
|
483
|
+
[RETURNS]: [ATOM],
|
484
|
+
[ARGS_COUNT]: [],
|
485
|
+
[ARGUMENTS]: [],
|
486
|
+
[ARGS_COUNT]: 0
|
487
|
+
}
|
488
|
+
}
|
268
489
|
],
|
269
490
|
[RETURNS]: [ATOM]
|
270
491
|
}
|
@@ -272,11 +493,32 @@ export const typeCheck = (ast) => {
|
|
272
493
|
[KEYWORDS.DIVISION]: {
|
273
494
|
[STATS]: {
|
274
495
|
[TYPE_PROP]: [APPLY],
|
496
|
+
[SIGNATURE]: KEYWORDS.DIVISION,
|
275
497
|
retried: RETRY_COUNT,
|
276
498
|
[ARGS_COUNT]: 2,
|
277
|
-
[
|
278
|
-
|
279
|
-
|
499
|
+
[ARGUMENTS]: [
|
500
|
+
{
|
501
|
+
[STATS]: {
|
502
|
+
retried: 0,
|
503
|
+
[SIGNATURE]: PLACEHOLDER,
|
504
|
+
[TYPE_PROP]: [ATOM],
|
505
|
+
[RETURNS]: [ATOM],
|
506
|
+
[ARGS_COUNT]: [],
|
507
|
+
[ARGUMENTS]: [],
|
508
|
+
[ARGS_COUNT]: 0
|
509
|
+
}
|
510
|
+
},
|
511
|
+
{
|
512
|
+
[STATS]: {
|
513
|
+
retried: 0,
|
514
|
+
[SIGNATURE]: PLACEHOLDER,
|
515
|
+
[TYPE_PROP]: [ATOM],
|
516
|
+
[RETURNS]: [ATOM],
|
517
|
+
[ARGS_COUNT]: [],
|
518
|
+
[ARGUMENTS]: [],
|
519
|
+
[ARGS_COUNT]: 0
|
520
|
+
}
|
521
|
+
}
|
280
522
|
],
|
281
523
|
[RETURNS]: [ATOM]
|
282
524
|
}
|
@@ -286,9 +528,29 @@ export const typeCheck = (ast) => {
|
|
286
528
|
[TYPE_PROP]: [APPLY],
|
287
529
|
retried: RETRY_COUNT,
|
288
530
|
[ARGS_COUNT]: 2,
|
289
|
-
[
|
290
|
-
|
291
|
-
|
531
|
+
[ARGUMENTS]: [
|
532
|
+
{
|
533
|
+
[STATS]: {
|
534
|
+
retried: 0,
|
535
|
+
[SIGNATURE]: PLACEHOLDER,
|
536
|
+
[TYPE_PROP]: [ATOM],
|
537
|
+
[RETURNS]: [ATOM],
|
538
|
+
[ARGS_COUNT]: [],
|
539
|
+
[ARGUMENTS]: [],
|
540
|
+
[ARGS_COUNT]: 0
|
541
|
+
}
|
542
|
+
},
|
543
|
+
{
|
544
|
+
[STATS]: {
|
545
|
+
retried: 0,
|
546
|
+
[SIGNATURE]: PLACEHOLDER,
|
547
|
+
[TYPE_PROP]: [ATOM],
|
548
|
+
[RETURNS]: [ATOM],
|
549
|
+
[ARGS_COUNT]: [],
|
550
|
+
[ARGUMENTS]: [],
|
551
|
+
[ARGS_COUNT]: 0
|
552
|
+
}
|
553
|
+
}
|
292
554
|
],
|
293
555
|
[RETURNS]: [ATOM]
|
294
556
|
}
|
@@ -296,11 +558,32 @@ export const typeCheck = (ast) => {
|
|
296
558
|
[KEYWORDS.BITWISE_AND]: {
|
297
559
|
[STATS]: {
|
298
560
|
[TYPE_PROP]: [APPLY],
|
561
|
+
[SIGNATURE]: KEYWORDS.BITWISE_AND,
|
299
562
|
retried: RETRY_COUNT,
|
300
563
|
[ARGS_COUNT]: 2,
|
301
|
-
[
|
302
|
-
|
303
|
-
|
564
|
+
[ARGUMENTS]: [
|
565
|
+
{
|
566
|
+
[STATS]: {
|
567
|
+
retried: 0,
|
568
|
+
[SIGNATURE]: PLACEHOLDER,
|
569
|
+
[TYPE_PROP]: [ATOM],
|
570
|
+
[RETURNS]: [ATOM],
|
571
|
+
[ARGS_COUNT]: [],
|
572
|
+
[ARGUMENTS]: [],
|
573
|
+
[ARGS_COUNT]: 0
|
574
|
+
}
|
575
|
+
},
|
576
|
+
{
|
577
|
+
[STATS]: {
|
578
|
+
retried: 0,
|
579
|
+
[SIGNATURE]: PLACEHOLDER,
|
580
|
+
[TYPE_PROP]: [ATOM],
|
581
|
+
[RETURNS]: [ATOM],
|
582
|
+
[ARGS_COUNT]: [],
|
583
|
+
[ARGUMENTS]: [],
|
584
|
+
[ARGS_COUNT]: 0
|
585
|
+
}
|
586
|
+
}
|
304
587
|
],
|
305
588
|
[RETURNS]: [ATOM]
|
306
589
|
}
|
@@ -308,20 +591,54 @@ export const typeCheck = (ast) => {
|
|
308
591
|
[KEYWORDS.BITWISE_NOT]: {
|
309
592
|
[STATS]: {
|
310
593
|
[TYPE_PROP]: [APPLY],
|
594
|
+
[SIGNATURE]: KEYWORDS.BITWISE_NOT,
|
311
595
|
retried: RETRY_COUNT,
|
312
596
|
[ARGS_COUNT]: 1,
|
313
|
-
[
|
597
|
+
[ARGUMENTS]: [
|
598
|
+
{
|
599
|
+
[STATS]: {
|
600
|
+
retried: 0,
|
601
|
+
[SIGNATURE]: PLACEHOLDER,
|
602
|
+
[TYPE_PROP]: [ATOM],
|
603
|
+
[RETURNS]: [ATOM],
|
604
|
+
[ARGS_COUNT]: [],
|
605
|
+
[ARGUMENTS]: [],
|
606
|
+
[ARGS_COUNT]: 0
|
607
|
+
}
|
608
|
+
}
|
609
|
+
],
|
314
610
|
[RETURNS]: [ATOM]
|
315
611
|
}
|
316
612
|
},
|
317
613
|
[KEYWORDS.BITWISE_OR]: {
|
318
614
|
[STATS]: {
|
319
615
|
[TYPE_PROP]: [APPLY],
|
616
|
+
[SIGNATURE]: KEYWORDS.BITWISE_OR,
|
320
617
|
retried: RETRY_COUNT,
|
321
618
|
[ARGS_COUNT]: 2,
|
322
|
-
[
|
323
|
-
|
324
|
-
|
619
|
+
[ARGUMENTS]: [
|
620
|
+
{
|
621
|
+
[STATS]: {
|
622
|
+
retried: 0,
|
623
|
+
[SIGNATURE]: PLACEHOLDER,
|
624
|
+
[TYPE_PROP]: [ATOM],
|
625
|
+
[RETURNS]: [ATOM],
|
626
|
+
[ARGS_COUNT]: [],
|
627
|
+
[ARGUMENTS]: [],
|
628
|
+
[ARGS_COUNT]: 0
|
629
|
+
}
|
630
|
+
},
|
631
|
+
{
|
632
|
+
[STATS]: {
|
633
|
+
retried: 0,
|
634
|
+
[SIGNATURE]: PLACEHOLDER,
|
635
|
+
[TYPE_PROP]: [ATOM],
|
636
|
+
[RETURNS]: [ATOM],
|
637
|
+
[ARGS_COUNT]: [],
|
638
|
+
[ARGUMENTS]: [],
|
639
|
+
[ARGS_COUNT]: 0
|
640
|
+
}
|
641
|
+
}
|
325
642
|
],
|
326
643
|
[RETURNS]: [ATOM]
|
327
644
|
}
|
@@ -329,11 +646,32 @@ export const typeCheck = (ast) => {
|
|
329
646
|
[KEYWORDS.BITWISE_XOR]: {
|
330
647
|
[STATS]: {
|
331
648
|
[TYPE_PROP]: [APPLY],
|
649
|
+
[SIGNATURE]: KEYWORDS.BITWISE_XOR,
|
332
650
|
retried: RETRY_COUNT,
|
333
651
|
[ARGS_COUNT]: 2,
|
334
|
-
[
|
335
|
-
|
336
|
-
|
652
|
+
[ARGUMENTS]: [
|
653
|
+
{
|
654
|
+
[STATS]: {
|
655
|
+
retried: 0,
|
656
|
+
[SIGNATURE]: PLACEHOLDER,
|
657
|
+
[TYPE_PROP]: [ATOM],
|
658
|
+
[RETURNS]: [ATOM],
|
659
|
+
[ARGS_COUNT]: [],
|
660
|
+
[ARGUMENTS]: [],
|
661
|
+
[ARGS_COUNT]: 0
|
662
|
+
}
|
663
|
+
},
|
664
|
+
{
|
665
|
+
[STATS]: {
|
666
|
+
retried: 0,
|
667
|
+
[SIGNATURE]: PLACEHOLDER,
|
668
|
+
[TYPE_PROP]: [ATOM],
|
669
|
+
[RETURNS]: [ATOM],
|
670
|
+
[ARGS_COUNT]: [],
|
671
|
+
[ARGUMENTS]: [],
|
672
|
+
[ARGS_COUNT]: 0
|
673
|
+
}
|
674
|
+
}
|
337
675
|
],
|
338
676
|
[RETURNS]: [ATOM]
|
339
677
|
}
|
@@ -341,11 +679,32 @@ export const typeCheck = (ast) => {
|
|
341
679
|
[KEYWORDS.BITWISE_LEFT_SHIFT]: {
|
342
680
|
[STATS]: {
|
343
681
|
[TYPE_PROP]: [APPLY],
|
682
|
+
[SIGNATURE]: KEYWORDS.BITWISE_LEFT_SHIFT,
|
344
683
|
retried: RETRY_COUNT,
|
345
684
|
[ARGS_COUNT]: 2,
|
346
|
-
[
|
347
|
-
|
348
|
-
|
685
|
+
[ARGUMENTS]: [
|
686
|
+
{
|
687
|
+
[STATS]: {
|
688
|
+
retried: 0,
|
689
|
+
[SIGNATURE]: PLACEHOLDER,
|
690
|
+
[TYPE_PROP]: [ATOM],
|
691
|
+
[RETURNS]: [ATOM],
|
692
|
+
[ARGS_COUNT]: [],
|
693
|
+
[ARGUMENTS]: [],
|
694
|
+
[ARGS_COUNT]: 0
|
695
|
+
}
|
696
|
+
},
|
697
|
+
{
|
698
|
+
[STATS]: {
|
699
|
+
retried: 0,
|
700
|
+
[SIGNATURE]: PLACEHOLDER,
|
701
|
+
[TYPE_PROP]: [ATOM],
|
702
|
+
[RETURNS]: [ATOM],
|
703
|
+
[ARGS_COUNT]: [],
|
704
|
+
[ARGUMENTS]: [],
|
705
|
+
[ARGS_COUNT]: 0
|
706
|
+
}
|
707
|
+
}
|
349
708
|
],
|
350
709
|
[RETURNS]: [ATOM]
|
351
710
|
}
|
@@ -353,11 +712,32 @@ export const typeCheck = (ast) => {
|
|
353
712
|
[KEYWORDS.BITWISE_RIGHT_SHIFT]: {
|
354
713
|
[STATS]: {
|
355
714
|
[TYPE_PROP]: [APPLY],
|
715
|
+
[SIGNATURE]: KEYWORDS.BITWISE_RIGHT_SHIFT,
|
356
716
|
retried: RETRY_COUNT,
|
357
717
|
[ARGS_COUNT]: 2,
|
358
|
-
[
|
359
|
-
|
360
|
-
|
718
|
+
[ARGUMENTS]: [
|
719
|
+
{
|
720
|
+
[STATS]: {
|
721
|
+
retried: 0,
|
722
|
+
[SIGNATURE]: PLACEHOLDER,
|
723
|
+
[TYPE_PROP]: [ATOM],
|
724
|
+
[RETURNS]: [ATOM],
|
725
|
+
[ARGS_COUNT]: [],
|
726
|
+
[ARGUMENTS]: [],
|
727
|
+
[ARGS_COUNT]: 0
|
728
|
+
}
|
729
|
+
},
|
730
|
+
{
|
731
|
+
[STATS]: {
|
732
|
+
retried: 0,
|
733
|
+
[SIGNATURE]: PLACEHOLDER,
|
734
|
+
[TYPE_PROP]: [ATOM],
|
735
|
+
[RETURNS]: [ATOM],
|
736
|
+
[ARGS_COUNT]: [],
|
737
|
+
[ARGUMENTS]: [],
|
738
|
+
[ARGS_COUNT]: 0
|
739
|
+
}
|
740
|
+
}
|
361
741
|
],
|
362
742
|
[RETURNS]: [ATOM]
|
363
743
|
}
|
@@ -365,11 +745,32 @@ export const typeCheck = (ast) => {
|
|
365
745
|
[KEYWORDS.GET_ARRAY]: {
|
366
746
|
[STATS]: {
|
367
747
|
[TYPE_PROP]: [APPLY],
|
748
|
+
[SIGNATURE]: KEYWORDS.GET_ARRAY,
|
368
749
|
retried: RETRY_COUNT,
|
369
750
|
[ARGS_COUNT]: 2,
|
370
|
-
[
|
371
|
-
|
372
|
-
|
751
|
+
[ARGUMENTS]: [
|
752
|
+
{
|
753
|
+
[STATS]: {
|
754
|
+
retried: 0,
|
755
|
+
[SIGNATURE]: PLACEHOLDER,
|
756
|
+
[TYPE_PROP]: [COLLECTION],
|
757
|
+
[RETURNS]: [COLLECTION],
|
758
|
+
[ARGS_COUNT]: [],
|
759
|
+
[ARGUMENTS]: [],
|
760
|
+
[ARGS_COUNT]: 0
|
761
|
+
}
|
762
|
+
},
|
763
|
+
{
|
764
|
+
[STATS]: {
|
765
|
+
retried: 0,
|
766
|
+
[SIGNATURE]: PLACEHOLDER,
|
767
|
+
[TYPE_PROP]: [ATOM],
|
768
|
+
[RETURNS]: [ATOM],
|
769
|
+
[ARGS_COUNT]: [],
|
770
|
+
[ARGUMENTS]: [],
|
771
|
+
[ARGS_COUNT]: 0
|
772
|
+
}
|
773
|
+
}
|
373
774
|
],
|
374
775
|
[RETURNS]: [UNKNOWN]
|
375
776
|
}
|
@@ -379,10 +780,40 @@ export const typeCheck = (ast) => {
|
|
379
780
|
[TYPE_PROP]: [APPLY],
|
380
781
|
retried: RETRY_COUNT,
|
381
782
|
[ARGS_COUNT]: 3,
|
382
|
-
[
|
383
|
-
|
384
|
-
|
385
|
-
|
783
|
+
[ARGUMENTS]: [
|
784
|
+
{
|
785
|
+
[STATS]: {
|
786
|
+
retried: 0,
|
787
|
+
[SIGNATURE]: PLACEHOLDER,
|
788
|
+
[TYPE_PROP]: [COLLECTION],
|
789
|
+
[RETURNS]: [COLLECTION],
|
790
|
+
[ARGS_COUNT]: [],
|
791
|
+
[ARGUMENTS]: [],
|
792
|
+
[ARGS_COUNT]: 0
|
793
|
+
}
|
794
|
+
},
|
795
|
+
{
|
796
|
+
[STATS]: {
|
797
|
+
retried: 0,
|
798
|
+
[SIGNATURE]: PLACEHOLDER,
|
799
|
+
[TYPE_PROP]: [ATOM],
|
800
|
+
[RETURNS]: [ATOM],
|
801
|
+
[ARGS_COUNT]: [],
|
802
|
+
[ARGUMENTS]: [],
|
803
|
+
[ARGS_COUNT]: 0
|
804
|
+
}
|
805
|
+
},
|
806
|
+
{
|
807
|
+
[STATS]: {
|
808
|
+
retried: 0,
|
809
|
+
[SIGNATURE]: PLACEHOLDER,
|
810
|
+
[TYPE_PROP]: [UNKNOWN],
|
811
|
+
[RETURNS]: [UNKNOWN],
|
812
|
+
[ARGS_COUNT]: [],
|
813
|
+
[ARGUMENTS]: [],
|
814
|
+
[ARGS_COUNT]: 0
|
815
|
+
}
|
816
|
+
}
|
386
817
|
],
|
387
818
|
[RETURNS]: [COLLECTION]
|
388
819
|
}
|
@@ -390,157 +821,414 @@ export const typeCheck = (ast) => {
|
|
390
821
|
[KEYWORDS.POP_ARRAY]: {
|
391
822
|
[STATS]: {
|
392
823
|
[TYPE_PROP]: [APPLY],
|
824
|
+
[SIGNATURE]: KEYWORDS.POP_ARRAY,
|
393
825
|
retried: RETRY_COUNT,
|
394
826
|
[ARGS_COUNT]: 1,
|
395
|
-
[
|
827
|
+
[ARGUMENTS]: [
|
828
|
+
{
|
829
|
+
[STATS]: {
|
830
|
+
retried: 0,
|
831
|
+
[SIGNATURE]: PLACEHOLDER,
|
832
|
+
[TYPE_PROP]: [COLLECTION],
|
833
|
+
[RETURNS]: [COLLECTION],
|
834
|
+
[ARGS_COUNT]: [],
|
835
|
+
[ARGUMENTS]: [],
|
836
|
+
[ARGS_COUNT]: 0
|
837
|
+
}
|
838
|
+
}
|
839
|
+
],
|
396
840
|
[RETURNS]: [COLLECTION]
|
397
841
|
}
|
398
842
|
},
|
399
843
|
[KEYWORDS.ARRAY_LENGTH]: {
|
400
844
|
[STATS]: {
|
401
845
|
[TYPE_PROP]: [APPLY],
|
846
|
+
[SIGNATURE]: KEYWORDS.ARRAY_LENGTH,
|
402
847
|
retried: RETRY_COUNT,
|
403
848
|
[ARGS_COUNT]: 1,
|
404
|
-
[
|
849
|
+
[ARGUMENTS]: [
|
850
|
+
{
|
851
|
+
[STATS]: {
|
852
|
+
retried: 0,
|
853
|
+
[SIGNATURE]: PLACEHOLDER,
|
854
|
+
[TYPE_PROP]: [COLLECTION],
|
855
|
+
[RETURNS]: [COLLECTION],
|
856
|
+
[ARGS_COUNT]: [],
|
857
|
+
[ARGUMENTS]: [],
|
858
|
+
[ARGS_COUNT]: 0
|
859
|
+
}
|
860
|
+
}
|
861
|
+
],
|
405
862
|
[RETURNS]: [ATOM]
|
406
863
|
}
|
407
864
|
},
|
408
865
|
[KEYWORDS.IF]: {
|
409
866
|
[STATS]: {
|
410
867
|
[TYPE_PROP]: [APPLY],
|
868
|
+
[SIGNATURE]: KEYWORDS.IF,
|
411
869
|
retried: RETRY_COUNT,
|
412
870
|
[ARGS_COUNT]: 3,
|
413
|
-
[
|
414
|
-
|
415
|
-
|
416
|
-
|
871
|
+
[ARGUMENTS]: [
|
872
|
+
{
|
873
|
+
[STATS]: {
|
874
|
+
retried: 0,
|
875
|
+
[SIGNATURE]: PLACEHOLDER,
|
876
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
877
|
+
[RETURNS]: [ATOM, PREDICATE],
|
878
|
+
[ARGS_COUNT]: [],
|
879
|
+
[ARGUMENTS]: [],
|
880
|
+
[ARGS_COUNT]: 0
|
881
|
+
}
|
882
|
+
},
|
883
|
+
{
|
884
|
+
[STATS]: {
|
885
|
+
retried: 0,
|
886
|
+
[SIGNATURE]: PLACEHOLDER,
|
887
|
+
[TYPE_PROP]: [UNKNOWN],
|
888
|
+
[RETURNS]: [UNKNOWN],
|
889
|
+
[ARGS_COUNT]: [],
|
890
|
+
[ARGUMENTS]: [],
|
891
|
+
[ARGS_COUNT]: 0
|
892
|
+
}
|
893
|
+
},
|
894
|
+
{
|
895
|
+
[STATS]: {
|
896
|
+
retried: 0,
|
897
|
+
[SIGNATURE]: PLACEHOLDER,
|
898
|
+
[TYPE_PROP]: [UNKNOWN],
|
899
|
+
[RETURNS]: [UNKNOWN],
|
900
|
+
[ARGS_COUNT]: [],
|
901
|
+
[ARGUMENTS]: [],
|
902
|
+
[ARGS_COUNT]: 0
|
903
|
+
}
|
904
|
+
}
|
417
905
|
],
|
418
|
-
[RETURNS]: [
|
906
|
+
[RETURNS]: [UNKNOWN]
|
419
907
|
}
|
420
908
|
},
|
421
909
|
[KEYWORDS.NOT]: {
|
422
910
|
[STATS]: {
|
423
|
-
[TYPE_PROP]: [APPLY],
|
911
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
912
|
+
[SIGNATURE]: KEYWORDS.NOT,
|
424
913
|
retried: RETRY_COUNT,
|
425
914
|
[ARGS_COUNT]: 1,
|
426
|
-
[
|
915
|
+
[ARGUMENTS]: [
|
916
|
+
{
|
917
|
+
[STATS]: {
|
918
|
+
retried: RETRY_COUNT,
|
919
|
+
[SIGNATURE]: PLACEHOLDER,
|
920
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
921
|
+
[RETURNS]: [ATOM, PREDICATE],
|
922
|
+
[ARGS_COUNT]: [],
|
923
|
+
[ARGUMENTS]: [],
|
924
|
+
[ARGS_COUNT]: 0
|
925
|
+
}
|
926
|
+
}
|
927
|
+
],
|
427
928
|
[RETURNS]: [ATOM, PREDICATE]
|
428
929
|
}
|
429
930
|
},
|
430
931
|
[KEYWORDS.EQUAL]: {
|
431
932
|
[STATS]: {
|
432
|
-
[TYPE_PROP]: [APPLY],
|
933
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
934
|
+
[SIGNATURE]: KEYWORDS.EQUAL,
|
433
935
|
retried: RETRY_COUNT,
|
434
936
|
[ARGS_COUNT]: 2,
|
435
|
-
[
|
436
|
-
|
437
|
-
|
937
|
+
[ARGUMENTS]: [
|
938
|
+
{
|
939
|
+
[STATS]: {
|
940
|
+
retried: RETRY_COUNT,
|
941
|
+
[SIGNATURE]: PLACEHOLDER,
|
942
|
+
[TYPE_PROP]: [ATOM],
|
943
|
+
[RETURNS]: [ATOM],
|
944
|
+
[ARGS_COUNT]: [],
|
945
|
+
[ARGUMENTS]: [],
|
946
|
+
[ARGS_COUNT]: 0
|
947
|
+
}
|
948
|
+
},
|
949
|
+
{
|
950
|
+
[STATS]: {
|
951
|
+
retried: RETRY_COUNT,
|
952
|
+
[SIGNATURE]: PLACEHOLDER,
|
953
|
+
[TYPE_PROP]: [ATOM],
|
954
|
+
[RETURNS]: [ATOM],
|
955
|
+
[ARGS_COUNT]: [],
|
956
|
+
[ARGUMENTS]: [],
|
957
|
+
[ARGS_COUNT]: 0
|
958
|
+
}
|
959
|
+
}
|
438
960
|
],
|
439
961
|
[RETURNS]: [ATOM, PREDICATE]
|
440
962
|
}
|
441
963
|
},
|
442
964
|
[KEYWORDS.LESS_THAN]: {
|
443
965
|
[STATS]: {
|
444
|
-
[TYPE_PROP]: [APPLY],
|
966
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
445
967
|
retried: RETRY_COUNT,
|
968
|
+
[SIGNATURE]: KEYWORDS.LESS_THAN,
|
446
969
|
[ARGS_COUNT]: 2,
|
447
|
-
[
|
448
|
-
|
449
|
-
|
970
|
+
[ARGUMENTS]: [
|
971
|
+
{
|
972
|
+
[STATS]: {
|
973
|
+
retried: RETRY_COUNT,
|
974
|
+
[SIGNATURE]: PLACEHOLDER,
|
975
|
+
[TYPE_PROP]: [ATOM],
|
976
|
+
[RETURNS]: [ATOM],
|
977
|
+
[ARGS_COUNT]: [],
|
978
|
+
[ARGUMENTS]: [],
|
979
|
+
[ARGS_COUNT]: 0
|
980
|
+
}
|
981
|
+
},
|
982
|
+
{
|
983
|
+
[STATS]: {
|
984
|
+
retried: RETRY_COUNT,
|
985
|
+
[SIGNATURE]: PLACEHOLDER,
|
986
|
+
[TYPE_PROP]: [ATOM],
|
987
|
+
[RETURNS]: [ATOM],
|
988
|
+
[ARGS_COUNT]: [],
|
989
|
+
[ARGUMENTS]: [],
|
990
|
+
[ARGS_COUNT]: 0
|
991
|
+
}
|
992
|
+
}
|
450
993
|
],
|
451
994
|
[RETURNS]: [ATOM, PREDICATE]
|
452
995
|
}
|
453
996
|
},
|
454
997
|
[KEYWORDS.GREATHER_THAN]: {
|
455
998
|
[STATS]: {
|
456
|
-
[TYPE_PROP]: [APPLY],
|
999
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1000
|
+
[SIGNATURE]: KEYWORDS.GREATHER_THAN,
|
457
1001
|
retried: RETRY_COUNT,
|
458
1002
|
[ARGS_COUNT]: 2,
|
459
|
-
[
|
460
|
-
|
461
|
-
|
1003
|
+
[ARGUMENTS]: [
|
1004
|
+
{
|
1005
|
+
[STATS]: {
|
1006
|
+
retried: RETRY_COUNT,
|
1007
|
+
[SIGNATURE]: PLACEHOLDER,
|
1008
|
+
[TYPE_PROP]: [ATOM],
|
1009
|
+
[RETURNS]: [ATOM],
|
1010
|
+
[ARGS_COUNT]: [],
|
1011
|
+
[ARGUMENTS]: [],
|
1012
|
+
[ARGS_COUNT]: 0
|
1013
|
+
}
|
1014
|
+
},
|
1015
|
+
{
|
1016
|
+
[STATS]: {
|
1017
|
+
retried: RETRY_COUNT,
|
1018
|
+
[SIGNATURE]: PLACEHOLDER,
|
1019
|
+
[TYPE_PROP]: [ATOM],
|
1020
|
+
[RETURNS]: [ATOM],
|
1021
|
+
[ARGS_COUNT]: [],
|
1022
|
+
[ARGUMENTS]: [],
|
1023
|
+
[ARGS_COUNT]: 0
|
1024
|
+
}
|
1025
|
+
}
|
462
1026
|
],
|
463
1027
|
[RETURNS]: [ATOM, PREDICATE]
|
464
1028
|
}
|
465
1029
|
},
|
466
1030
|
[KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
|
467
1031
|
[STATS]: {
|
468
|
-
[TYPE_PROP]: [APPLY],
|
1032
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1033
|
+
[SIGNATURE]: KEYWORDS.GREATHER_THAN_OR_EQUAL,
|
469
1034
|
retried: RETRY_COUNT,
|
470
1035
|
[ARGS_COUNT]: 2,
|
471
|
-
[
|
472
|
-
|
473
|
-
|
1036
|
+
[ARGUMENTS]: [
|
1037
|
+
{
|
1038
|
+
[STATS]: {
|
1039
|
+
retried: RETRY_COUNT,
|
1040
|
+
[SIGNATURE]: PLACEHOLDER,
|
1041
|
+
[TYPE_PROP]: [ATOM],
|
1042
|
+
[RETURNS]: [ATOM],
|
1043
|
+
[ARGS_COUNT]: [],
|
1044
|
+
[ARGUMENTS]: [],
|
1045
|
+
[ARGS_COUNT]: 0
|
1046
|
+
}
|
1047
|
+
},
|
1048
|
+
{
|
1049
|
+
[STATS]: {
|
1050
|
+
retried: RETRY_COUNT,
|
1051
|
+
[SIGNATURE]: PLACEHOLDER,
|
1052
|
+
[TYPE_PROP]: [ATOM],
|
1053
|
+
[RETURNS]: [ATOM],
|
1054
|
+
[ARGS_COUNT]: [],
|
1055
|
+
[ARGUMENTS]: [],
|
1056
|
+
[ARGS_COUNT]: 0
|
1057
|
+
}
|
1058
|
+
}
|
474
1059
|
],
|
475
1060
|
[RETURNS]: [ATOM, PREDICATE]
|
476
1061
|
}
|
477
1062
|
},
|
478
1063
|
[KEYWORDS.LESS_THAN_OR_EQUAL]: {
|
479
1064
|
[STATS]: {
|
480
|
-
[TYPE_PROP]: [APPLY],
|
1065
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1066
|
+
[SIGNATURE]: KEYWORDS.LESS_THAN_OR_EQUAL,
|
481
1067
|
retried: RETRY_COUNT,
|
482
1068
|
[ARGS_COUNT]: 2,
|
483
|
-
[
|
484
|
-
|
485
|
-
|
1069
|
+
[ARGUMENTS]: [
|
1070
|
+
{
|
1071
|
+
[STATS]: {
|
1072
|
+
retried: RETRY_COUNT,
|
1073
|
+
[SIGNATURE]: PLACEHOLDER,
|
1074
|
+
[TYPE_PROP]: [ATOM],
|
1075
|
+
[RETURNS]: [ATOM],
|
1076
|
+
[ARGS_COUNT]: [],
|
1077
|
+
[ARGUMENTS]: [],
|
1078
|
+
[ARGS_COUNT]: 0
|
1079
|
+
}
|
1080
|
+
},
|
1081
|
+
{
|
1082
|
+
[STATS]: {
|
1083
|
+
retried: RETRY_COUNT,
|
1084
|
+
[SIGNATURE]: PLACEHOLDER,
|
1085
|
+
[TYPE_PROP]: [ATOM],
|
1086
|
+
[RETURNS]: [ATOM],
|
1087
|
+
[ARGS_COUNT]: [],
|
1088
|
+
[ARGUMENTS]: [],
|
1089
|
+
[ARGS_COUNT]: 0
|
1090
|
+
}
|
1091
|
+
}
|
486
1092
|
],
|
487
1093
|
[RETURNS]: [ATOM, PREDICATE]
|
488
1094
|
}
|
489
1095
|
},
|
490
1096
|
[KEYWORDS.AND]: {
|
491
1097
|
[STATS]: {
|
492
|
-
[TYPE_PROP]: [APPLY],
|
1098
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1099
|
+
[SIGNATURE]: KEYWORDS.AND,
|
493
1100
|
retried: RETRY_COUNT,
|
494
1101
|
[ARGS_COUNT]: 2,
|
495
|
-
[
|
496
|
-
|
497
|
-
|
1102
|
+
[ARGUMENTS]: [
|
1103
|
+
{
|
1104
|
+
[STATS]: {
|
1105
|
+
retried: RETRY_COUNT,
|
1106
|
+
[SIGNATURE]: PLACEHOLDER,
|
1107
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
1108
|
+
[RETURNS]: [ATOM, PREDICATE],
|
1109
|
+
[ARGS_COUNT]: [],
|
1110
|
+
[ARGUMENTS]: [],
|
1111
|
+
[ARGS_COUNT]: 0
|
1112
|
+
}
|
1113
|
+
},
|
1114
|
+
{
|
1115
|
+
[STATS]: {
|
1116
|
+
retried: RETRY_COUNT,
|
1117
|
+
[SIGNATURE]: PLACEHOLDER,
|
1118
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
1119
|
+
[RETURNS]: [ATOM, PREDICATE],
|
1120
|
+
[ARGS_COUNT]: [],
|
1121
|
+
[ARGUMENTS]: [],
|
1122
|
+
[ARGS_COUNT]: 0
|
1123
|
+
}
|
1124
|
+
}
|
498
1125
|
],
|
499
1126
|
[RETURNS]: [ATOM, PREDICATE]
|
500
1127
|
}
|
501
1128
|
},
|
502
1129
|
[KEYWORDS.OR]: {
|
503
1130
|
[STATS]: {
|
504
|
-
[TYPE_PROP]: [APPLY],
|
1131
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1132
|
+
[SIGNATURE]: KEYWORDS.OR,
|
505
1133
|
retried: RETRY_COUNT,
|
506
1134
|
[ARGS_COUNT]: 2,
|
507
|
-
[
|
508
|
-
|
509
|
-
|
1135
|
+
[ARGUMENTS]: [
|
1136
|
+
{
|
1137
|
+
[STATS]: {
|
1138
|
+
retried: RETRY_COUNT,
|
1139
|
+
[SIGNATURE]: PLACEHOLDER,
|
1140
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
1141
|
+
[RETURNS]: [ATOM, PREDICATE],
|
1142
|
+
[ARGS_COUNT]: [],
|
1143
|
+
[ARGUMENTS]: [],
|
1144
|
+
[ARGS_COUNT]: 0
|
1145
|
+
}
|
1146
|
+
},
|
1147
|
+
{
|
1148
|
+
[STATS]: {
|
1149
|
+
retried: RETRY_COUNT,
|
1150
|
+
[SIGNATURE]: PLACEHOLDER,
|
1151
|
+
[TYPE_PROP]: [ATOM, PREDICATE],
|
1152
|
+
[RETURNS]: [ATOM, PREDICATE],
|
1153
|
+
[ARGS_COUNT]: [],
|
1154
|
+
[ARGUMENTS]: [],
|
1155
|
+
[ARGS_COUNT]: 0
|
1156
|
+
}
|
1157
|
+
}
|
510
1158
|
],
|
511
1159
|
[RETURNS]: [ATOM, PREDICATE]
|
512
1160
|
}
|
513
1161
|
},
|
514
1162
|
[KEYWORDS.IS_ATOM]: {
|
515
1163
|
[STATS]: {
|
516
|
-
[TYPE_PROP]: [APPLY],
|
1164
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1165
|
+
[SIGNATURE]: KEYWORDS.IS_ATOM,
|
517
1166
|
retried: RETRY_COUNT,
|
518
1167
|
[ARGS_COUNT]: 1,
|
519
|
-
[
|
1168
|
+
[ARGUMENTS]: [
|
1169
|
+
{
|
1170
|
+
[STATS]: {
|
1171
|
+
retried: RETRY_COUNT,
|
1172
|
+
[SIGNATURE]: PLACEHOLDER,
|
1173
|
+
[TYPE_PROP]: [UNKNOWN],
|
1174
|
+
[RETURNS]: [UNKNOWN],
|
1175
|
+
[ARGS_COUNT]: [],
|
1176
|
+
[ARGUMENTS]: [],
|
1177
|
+
[ARGS_COUNT]: 0
|
1178
|
+
}
|
1179
|
+
}
|
1180
|
+
],
|
520
1181
|
[RETURNS]: [ATOM, PREDICATE]
|
521
1182
|
}
|
522
1183
|
},
|
523
1184
|
[KEYWORDS.IS_LAMBDA]: {
|
524
1185
|
[STATS]: {
|
525
|
-
[TYPE_PROP]: [APPLY],
|
1186
|
+
[TYPE_PROP]: [APPLY, PREDICATE],
|
1187
|
+
[SIGNATURE]: KEYWORDS.IS_LAMBDA,
|
526
1188
|
retried: RETRY_COUNT,
|
527
1189
|
[ARGS_COUNT]: 1,
|
528
|
-
[
|
1190
|
+
[ARGUMENTS]: [
|
1191
|
+
{
|
1192
|
+
[STATS]: {
|
1193
|
+
retried: RETRY_COUNT,
|
1194
|
+
[SIGNATURE]: PLACEHOLDER,
|
1195
|
+
[TYPE_PROP]: [UNKNOWN],
|
1196
|
+
[RETURNS]: [UNKNOWN],
|
1197
|
+
[ARGS_COUNT]: [],
|
1198
|
+
[ARGUMENTS]: [],
|
1199
|
+
[ARGS_COUNT]: 0
|
1200
|
+
}
|
1201
|
+
}
|
1202
|
+
],
|
529
1203
|
[RETURNS]: [ATOM, PREDICATE]
|
530
1204
|
}
|
531
1205
|
},
|
532
1206
|
[KEYWORDS.ERROR]: {
|
533
1207
|
[STATS]: {
|
534
1208
|
[TYPE_PROP]: [APPLY],
|
1209
|
+
[SIGNATURE]: KEYWORDS.ERROR,
|
535
1210
|
retried: RETRY_COUNT,
|
536
1211
|
[ARGS_COUNT]: 1,
|
537
|
-
[
|
1212
|
+
[ARGUMENTS]: [
|
1213
|
+
{
|
1214
|
+
[STATS]: {
|
1215
|
+
retried: RETRY_COUNT,
|
1216
|
+
[SIGNATURE]: PLACEHOLDER,
|
1217
|
+
[TYPE_PROP]: [COLLECTION],
|
1218
|
+
[RETURNS]: [COLLECTION],
|
1219
|
+
[ARGS_COUNT]: [],
|
1220
|
+
[ARGUMENTS]: [],
|
1221
|
+
[ARGS_COUNT]: 0
|
1222
|
+
}
|
1223
|
+
}
|
1224
|
+
],
|
538
1225
|
[RETURNS]: [UNKNOWN]
|
539
1226
|
}
|
540
1227
|
}
|
541
1228
|
}
|
542
1229
|
const errorStack = new Set()
|
543
1230
|
const warningStack = new Set()
|
1231
|
+
const Types = new Map()
|
544
1232
|
const stack = []
|
545
1233
|
const check = (exp, env, scope) => {
|
546
1234
|
const [first, ...rest] = isLeaf(exp) ? [exp] : exp
|
@@ -580,6 +1268,7 @@ export const typeCheck = (ast) => {
|
|
580
1268
|
const resolveRetunType = (returns, rem, prop, isPredicate) => {
|
581
1269
|
if (returns[TYPE] === ATOM) {
|
582
1270
|
env[name][STATS][prop][0] = ATOM
|
1271
|
+
env[name][STATS][RETURNS][0] = ATOM
|
583
1272
|
} else {
|
584
1273
|
switch (returns[VALUE]) {
|
585
1274
|
case KEYWORDS.IF:
|
@@ -587,7 +1276,19 @@ export const typeCheck = (ast) => {
|
|
587
1276
|
const re = rem.slice(2)
|
588
1277
|
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
589
1278
|
env[name][STATS][prop][0] = ATOM
|
590
|
-
|
1279
|
+
env[name][STATS][RETURNS][0] = ATOM
|
1280
|
+
if (
|
1281
|
+
getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
|
1282
|
+
getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
|
1283
|
+
) {
|
1284
|
+
// env[name][STATS][TYPE_PROP][1] = PREDICATE
|
1285
|
+
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1286
|
+
}
|
1287
|
+
} else if (
|
1288
|
+
!isLeaf(re[0]) &&
|
1289
|
+
env[re[0][0][VALUE]] &&
|
1290
|
+
env[re[0][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
|
1291
|
+
) {
|
591
1292
|
env[name][STATS][prop] =
|
592
1293
|
env[re[0][0][VALUE]][STATS][RETURNS]
|
593
1294
|
if (
|
@@ -603,11 +1304,38 @@ export const typeCheck = (ast) => {
|
|
603
1304
|
}
|
604
1305
|
}
|
605
1306
|
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
1307
|
+
} else if (
|
1308
|
+
!isLeaf(re[1]) &&
|
1309
|
+
env[re[1][0][VALUE]] &&
|
1310
|
+
env[re[1][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
|
1311
|
+
) {
|
1312
|
+
env[name][STATS][prop] =
|
1313
|
+
env[re[1][0][VALUE]][STATS][prop]
|
1314
|
+
env[name][STATS][prop] =
|
1315
|
+
env[re[1][0][VALUE]][STATS][RETURNS]
|
1316
|
+
if (
|
1317
|
+
re[1][0][TYPE] === APPLY &&
|
1318
|
+
!name.startsWith(OPTIMIZED_PREFIX)
|
1319
|
+
) {
|
1320
|
+
switch (re[1][0][VALUE]) {
|
1321
|
+
case KEYWORDS.ANONYMOUS_FUNCTION:
|
1322
|
+
env[name][STATS][TYPE_PROP] = [APPLY]
|
1323
|
+
env[name][STATS][RETURNS] = [UNKNOWN]
|
1324
|
+
env[name][STATS][ARGS_COUNT] =
|
1325
|
+
re[1].length - 2
|
1326
|
+
break
|
1327
|
+
}
|
1328
|
+
}
|
606
1329
|
} else if (env[re[0][VALUE]]) {
|
607
|
-
env[name][STATS][prop]
|
608
|
-
env[re[0][VALUE]][STATS][
|
609
|
-
env[name][STATS][RETURNS]
|
610
|
-
env[re[0][VALUE]][STATS][RETURNS]
|
1330
|
+
env[name][STATS][prop] =
|
1331
|
+
env[re[0][VALUE]][STATS][prop]
|
1332
|
+
env[name][STATS][RETURNS] =
|
1333
|
+
env[re[0][VALUE]][STATS][RETURNS]
|
1334
|
+
} else if (env[re[1][VALUE]]) {
|
1335
|
+
env[name][STATS][prop] =
|
1336
|
+
env[re[1][VALUE]][STATS][prop]
|
1337
|
+
env[name][STATS][RETURNS] =
|
1338
|
+
env[re[1][VALUE]][STATS][RETURNS]
|
611
1339
|
} else env[name][STATS][prop] = [UNKNOWN]
|
612
1340
|
}
|
613
1341
|
break
|
@@ -685,7 +1413,7 @@ export const typeCheck = (ast) => {
|
|
685
1413
|
)
|
686
1414
|
}
|
687
1415
|
if (isPredicate) {
|
688
|
-
env[name][STATS][prop] = [ATOM]
|
1416
|
+
env[name][STATS][prop] = [ATOM, PREDICATE]
|
689
1417
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
690
1418
|
}
|
691
1419
|
}
|
@@ -711,7 +1439,7 @@ export const typeCheck = (ast) => {
|
|
711
1439
|
[TYPE_PROP]: [APPLY],
|
712
1440
|
retried: 0,
|
713
1441
|
[ARGS_COUNT]: n - 2,
|
714
|
-
[
|
1442
|
+
[ARGUMENTS]: [],
|
715
1443
|
[RETURNS]: [UNKNOWN]
|
716
1444
|
}
|
717
1445
|
}
|
@@ -771,11 +1499,13 @@ export const typeCheck = (ast) => {
|
|
771
1499
|
[STATS]: {
|
772
1500
|
retried: 0,
|
773
1501
|
[TYPE_PROP]: [ATOM],
|
774
|
-
[RETURNS]: [
|
1502
|
+
[RETURNS]: [ATOM]
|
775
1503
|
}
|
776
1504
|
}
|
777
|
-
if (isPredicate)
|
1505
|
+
if (isPredicate) {
|
1506
|
+
env[name][STATS][TYPE_PROP][1] = PREDICATE
|
778
1507
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1508
|
+
}
|
779
1509
|
} else {
|
780
1510
|
const isPredicate = getSuffix(name) === PREDICATE_SUFFIX
|
781
1511
|
if (
|
@@ -799,8 +1529,10 @@ export const typeCheck = (ast) => {
|
|
799
1529
|
[RETURNS]: [UNKNOWN]
|
800
1530
|
}
|
801
1531
|
}
|
802
|
-
if (isPredicate)
|
1532
|
+
if (isPredicate) {
|
1533
|
+
env[name][STATS][TYPE_PROP][1] = PREDICATE
|
803
1534
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1535
|
+
}
|
804
1536
|
if (right && right[VALUE]) {
|
805
1537
|
if (right[VALUE] === KEYWORDS.CALL_FUNCTION) {
|
806
1538
|
if (isLeaf(rest.at(-1).at(-1))) {
|
@@ -861,6 +1593,7 @@ export const typeCheck = (ast) => {
|
|
861
1593
|
// }
|
862
1594
|
check(rest.at(-1), env, scope)
|
863
1595
|
}
|
1596
|
+
Types.set(withScope(name, env), formatType(name, env))
|
864
1597
|
}
|
865
1598
|
}
|
866
1599
|
break
|
@@ -886,15 +1619,18 @@ export const typeCheck = (ast) => {
|
|
886
1619
|
const param = params[i]
|
887
1620
|
copy[param[VALUE]] = {
|
888
1621
|
[STATS]: {
|
1622
|
+
[SIGNATURE]: param[VALUE],
|
889
1623
|
[TYPE_PROP]: [UNKNOWN],
|
890
1624
|
[RETURNS]: [UNKNOWN],
|
1625
|
+
[ARGUMENTS]: [],
|
891
1626
|
retried: 0
|
892
1627
|
}
|
893
1628
|
}
|
894
1629
|
const ref = env[copy[SCOPE_NAME]]
|
895
1630
|
if (ref) {
|
896
|
-
|
1631
|
+
ref[STATS][ARGUMENTS][i] = copy[param[VALUE]]
|
897
1632
|
if (getSuffix(param[VALUE]) === PREDICATE_SUFFIX) {
|
1633
|
+
// copy[param[VALUE]][STATS][TYPE_PROP][1]= PREDICATE
|
898
1634
|
copy[param[VALUE]][STATS][RETURNS] = [ATOM, PREDICATE]
|
899
1635
|
} else {
|
900
1636
|
const returns = deepLambdaReturn(
|
@@ -924,7 +1660,6 @@ export const typeCheck = (ast) => {
|
|
924
1660
|
const alternative = isLeaf(re[1])
|
925
1661
|
? copy[re[1][VALUE]]
|
926
1662
|
: copy[re[1][0][VALUE]]
|
927
|
-
|
928
1663
|
// todo check if condition matches alternative
|
929
1664
|
if (
|
930
1665
|
concequent &&
|
@@ -998,23 +1733,25 @@ export const typeCheck = (ast) => {
|
|
998
1733
|
}
|
999
1734
|
|
1000
1735
|
// also type of arg
|
1001
|
-
const args = env[first[VALUE]][STATS][
|
1736
|
+
const args = env[first[VALUE]][STATS][ARGUMENTS]
|
1002
1737
|
if (args) {
|
1003
1738
|
for (let i = 0; i < args.length; ++i) {
|
1004
1739
|
// type check
|
1005
|
-
|
1740
|
+
const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
|
1741
|
+
const MAIN_TYPE = args[i][STATS][TYPE_PROP][0]
|
1742
|
+
if (PRED_TYPE != undefined) {
|
1006
1743
|
if (isLeaf(rest[i])) {
|
1007
1744
|
if (rest[i][TYPE] === WORD) {
|
1008
1745
|
if (
|
1009
1746
|
env[rest[i][VALUE]] &&
|
1010
|
-
|
1747
|
+
PRED_TYPE !==
|
1011
1748
|
env[rest[i][VALUE]][STATS][RETURNS][1]
|
1012
1749
|
) {
|
1013
1750
|
errorStack.add(
|
1014
1751
|
`Incorrect type of argument (${i}) for (${
|
1015
1752
|
first[VALUE]
|
1016
1753
|
}). Expected (${toTypeNames(
|
1017
|
-
|
1754
|
+
PRED_TYPE
|
1018
1755
|
)}) but got (${toTypeNames(
|
1019
1756
|
env[rest[i][VALUE]][STATS][RETURNS][1] ??
|
1020
1757
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0]
|
@@ -1023,7 +1760,7 @@ export const typeCheck = (ast) => {
|
|
1023
1760
|
}
|
1024
1761
|
} else if (rest[i][TYPE] === ATOM) {
|
1025
1762
|
if (
|
1026
|
-
|
1763
|
+
PRED_TYPE === PREDICATE &&
|
1027
1764
|
rest[i][VALUE] !== TRUE &&
|
1028
1765
|
rest[i][VALUE] !== FALSE
|
1029
1766
|
) {
|
@@ -1031,7 +1768,7 @@ export const typeCheck = (ast) => {
|
|
1031
1768
|
`Incorrect type of arguments for (${
|
1032
1769
|
first[VALUE]
|
1033
1770
|
}). Expected (${toTypeNames(
|
1034
|
-
|
1771
|
+
PRED_TYPE
|
1035
1772
|
)}) but got an (${toTypeNames(
|
1036
1773
|
rest[i][TYPE]
|
1037
1774
|
)}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
|
@@ -1047,29 +1784,23 @@ export const typeCheck = (ast) => {
|
|
1047
1784
|
if (isLeaf(rest[i].at(-1))) {
|
1048
1785
|
const fnName = rest[i].at(-1)[VALUE]
|
1049
1786
|
const fn = env[fnName]
|
1050
|
-
if (
|
1051
|
-
fn &&
|
1052
|
-
fn[STATS][RETURNS][0] !== args[i][TYPE]
|
1053
|
-
) {
|
1787
|
+
if (fn && fn[STATS][RETURNS][0] !== MAIN_TYPE) {
|
1054
1788
|
errorStack.add(
|
1055
1789
|
`Incorrect type of argument (${i}) for (${
|
1056
1790
|
first[VALUE]
|
1057
1791
|
}). Expected (${toTypeNames(
|
1058
|
-
|
1792
|
+
MAIN_TYPE
|
1059
1793
|
)}) but got an (${toTypeNames(
|
1060
1794
|
fn[STATS][RETURNS][0]
|
1061
1795
|
)}) (${stringifyArgs(exp)}) (check #26)`
|
1062
1796
|
)
|
1063
1797
|
}
|
1064
|
-
if (
|
1065
|
-
fn &&
|
1066
|
-
fn[STATS][RETURNS][1] !== args[i][SUB]
|
1067
|
-
) {
|
1798
|
+
if (fn && fn[STATS][RETURNS][1] !== PRED_TYPE) {
|
1068
1799
|
errorStack.add(
|
1069
1800
|
`Incorrect type of argument (${i}) for (${
|
1070
1801
|
first[VALUE]
|
1071
1802
|
}). Expected (${toTypeNames(
|
1072
|
-
|
1803
|
+
PRED_TYPE
|
1073
1804
|
)}) but got an (${toTypeNames(
|
1074
1805
|
fn[STATS][RETURNS][1] ??
|
1075
1806
|
fn[STATS][RETURNS][0]
|
@@ -1083,20 +1814,20 @@ export const typeCheck = (ast) => {
|
|
1083
1814
|
const rem = hasBlock(body) ? body.at(-1) : body
|
1084
1815
|
const returns = isLeaf(rem) ? rem : rem[0]
|
1085
1816
|
if (returns[TYPE] === ATOM) {
|
1086
|
-
if (
|
1817
|
+
if (MAIN_TYPE !== ATOM) {
|
1087
1818
|
errorStack.add(
|
1088
1819
|
`Incorrect type of argument ${i} for (${
|
1089
1820
|
first[VALUE]
|
1090
1821
|
}). Expected (${toTypeNames(
|
1091
|
-
|
1822
|
+
MAIN_TYPE
|
1092
1823
|
)}) but got an (${toTypeNames(
|
1093
1824
|
ATOM
|
1094
1825
|
)}) (${stringifyArgs(exp)}) (check #27)`
|
1095
1826
|
)
|
1096
1827
|
}
|
1097
1828
|
if (
|
1098
|
-
|
1099
|
-
|
1829
|
+
PRED_TYPE &&
|
1830
|
+
PRED_TYPE === PREDICATE &&
|
1100
1831
|
returns[VALUE] !== TRUE &&
|
1101
1832
|
returns[VALUE] !== FALSE
|
1102
1833
|
) {
|
@@ -1104,7 +1835,7 @@ export const typeCheck = (ast) => {
|
|
1104
1835
|
`Incorrect type of argument ${i} for (${
|
1105
1836
|
first[VALUE]
|
1106
1837
|
}). Expected (${toTypeNames(
|
1107
|
-
|
1838
|
+
PRED_TYPE
|
1108
1839
|
)}) but got an (${toTypeNames(
|
1109
1840
|
ATOM
|
1110
1841
|
)}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
|
@@ -1114,29 +1845,29 @@ export const typeCheck = (ast) => {
|
|
1114
1845
|
}
|
1115
1846
|
} else if (env[returns[VALUE]]) {
|
1116
1847
|
if (
|
1117
|
-
|
1848
|
+
MAIN_TYPE !==
|
1118
1849
|
env[returns[VALUE]][STATS][RETURNS][0]
|
1119
1850
|
) {
|
1120
1851
|
errorStack.add(
|
1121
1852
|
`Incorrect type of argument ${i} for (${
|
1122
1853
|
first[VALUE]
|
1123
1854
|
}). Expected (${toTypeNames(
|
1124
|
-
|
1855
|
+
MAIN_TYPE
|
1125
1856
|
)}) but got (${toTypeNames(
|
1126
1857
|
env[returns[VALUE]][STATS][TYPE_PROP]
|
1127
1858
|
)}) (${stringifyArgs(exp)}) (check #29)`
|
1128
1859
|
)
|
1129
1860
|
}
|
1130
1861
|
if (
|
1131
|
-
|
1132
|
-
|
1862
|
+
PRED_TYPE &&
|
1863
|
+
PRED_TYPE !==
|
1133
1864
|
env[returns[VALUE]][STATS][RETURNS][1]
|
1134
1865
|
) {
|
1135
1866
|
errorStack.add(
|
1136
1867
|
`Incorrect type of argument ${i} for (${
|
1137
1868
|
first[VALUE]
|
1138
1869
|
}). Expected (${toTypeNames(
|
1139
|
-
|
1870
|
+
PRED_TYPE
|
1140
1871
|
)}) but got (${toTypeNames(
|
1141
1872
|
env[returns[VALUE]][STATS][RETURNS][1]
|
1142
1873
|
)}) (${stringifyArgs(exp)}) (check #28)`
|
@@ -1145,16 +1876,16 @@ export const typeCheck = (ast) => {
|
|
1145
1876
|
}
|
1146
1877
|
}
|
1147
1878
|
} else if (
|
1148
|
-
|
1879
|
+
PRED_TYPE &&
|
1149
1880
|
env[current[VALUE]] &&
|
1150
1881
|
env[current[VALUE]][STATS][RETURNS][1] !==
|
1151
|
-
|
1882
|
+
PRED_TYPE
|
1152
1883
|
) {
|
1153
1884
|
errorStack.add(
|
1154
1885
|
`Incorrect type of arguments (${i}) for (${
|
1155
1886
|
first[VALUE]
|
1156
1887
|
}). Expected (${toTypeNames(
|
1157
|
-
|
1888
|
+
PRED_TYPE
|
1158
1889
|
)}) but got (${toTypeNames(
|
1159
1890
|
env[current[VALUE]][STATS][RETURNS][1] ??
|
1160
1891
|
env[current[VALUE]][STATS][RETURNS][0]
|
@@ -1166,38 +1897,37 @@ export const typeCheck = (ast) => {
|
|
1166
1897
|
}
|
1167
1898
|
|
1168
1899
|
if (first[TYPE] === APPLY && isSpecial) {
|
1169
|
-
const expectedArgs = env[first[VALUE]][STATS][
|
1900
|
+
const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
|
1170
1901
|
for (let i = 0; i < rest.length; ++i) {
|
1171
|
-
|
1902
|
+
const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
|
1903
|
+
const MAIN_TYPE = expectedArgs[i][STATS][TYPE_PROP][0]
|
1904
|
+
|
1905
|
+
if (MAIN_TYPE === UNKNOWN) continue
|
1172
1906
|
if (!isLeaf(rest[i])) {
|
1173
1907
|
const CAR = rest[i][0][VALUE]
|
1174
1908
|
const isKnown =
|
1175
1909
|
env[CAR] &&
|
1176
1910
|
env[CAR][STATS][RETURNS][0] !== UNKNOWN
|
1177
1911
|
if (isKnown) {
|
1178
|
-
if (
|
1179
|
-
env[CAR][STATS][RETURNS][0] !==
|
1180
|
-
expectedArgs[i][TYPE]
|
1181
|
-
) {
|
1912
|
+
if (env[CAR][STATS][RETURNS][0] !== MAIN_TYPE) {
|
1182
1913
|
errorStack.add(
|
1183
1914
|
`Incorrect type of argument (${i}) for special form (${
|
1184
1915
|
first[VALUE]
|
1185
1916
|
}). Expected (${toTypeNames(
|
1186
|
-
|
1917
|
+
MAIN_TYPE
|
1187
1918
|
)}) but got (${toTypeNames(
|
1188
1919
|
env[CAR][STATS][RETURNS][0]
|
1189
1920
|
)}) (${stringifyArgs(exp)}) (check #1)`
|
1190
1921
|
)
|
1191
1922
|
} else if (
|
1192
|
-
|
1193
|
-
env[CAR][STATS][RETURNS][1] !==
|
1194
|
-
expectedArgs[i][SUB]
|
1923
|
+
PRED_TYPE &&
|
1924
|
+
env[CAR][STATS][RETURNS][1] !== PRED_TYPE
|
1195
1925
|
) {
|
1196
1926
|
errorStack.add(
|
1197
1927
|
`Incorrect type of arguments for special form (${
|
1198
1928
|
first[VALUE]
|
1199
1929
|
}). Expected (${toTypeNames(
|
1200
|
-
|
1930
|
+
PRED_TYPE
|
1201
1931
|
)}) but got (${toTypeNames(
|
1202
1932
|
env[CAR][STATS][RETURNS][1] ??
|
1203
1933
|
env[CAR][STATS][RETURNS][0]
|
@@ -1215,28 +1945,27 @@ export const typeCheck = (ast) => {
|
|
1215
1945
|
env[CAR][STATS][TYPE_PROP][0] !== UNKNOWN
|
1216
1946
|
if (isKnown) {
|
1217
1947
|
if (
|
1218
|
-
|
1948
|
+
MAIN_TYPE !==
|
1219
1949
|
env[CAR][STATS][TYPE_PROP][0]
|
1220
1950
|
) {
|
1221
1951
|
errorStack.add(
|
1222
1952
|
`Incorrect type of argument (${i}) for special form (${
|
1223
1953
|
first[VALUE]
|
1224
1954
|
}). Expected (${toTypeNames(
|
1225
|
-
|
1955
|
+
MAIN_TYPE
|
1226
1956
|
)}) but got (${toTypeNames(
|
1227
1957
|
env[CAR][STATS][TYPE_PROP][0]
|
1228
1958
|
)}) (${stringifyArgs(exp)}) (check #3)`
|
1229
1959
|
)
|
1230
1960
|
} else if (
|
1231
|
-
|
1232
|
-
env[CAR][STATS][RETURNS][1] !==
|
1233
|
-
expectedArgs[i][SUB]
|
1961
|
+
PRED_TYPE &&
|
1962
|
+
env[CAR][STATS][RETURNS][1] !== PRED_TYPE
|
1234
1963
|
)
|
1235
1964
|
errorStack.add(
|
1236
1965
|
`Incorrect type of argument (${i}) for special form (${
|
1237
1966
|
first[VALUE]
|
1238
1967
|
}). Expected (${toTypeNames(
|
1239
|
-
|
1968
|
+
PRED_TYPE
|
1240
1969
|
)}) but got (${toTypeNames(
|
1241
1970
|
env[CAR][STATS][RETURNS][1] ??
|
1242
1971
|
env[CAR][STATS][TYPE_PROP][0]
|
@@ -1244,17 +1973,17 @@ export const typeCheck = (ast) => {
|
|
1244
1973
|
)
|
1245
1974
|
} else if (env[rest[i][VALUE]]) {
|
1246
1975
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
|
1247
|
-
|
1976
|
+
MAIN_TYPE
|
1248
1977
|
}
|
1249
1978
|
}
|
1250
1979
|
break
|
1251
1980
|
case ATOM: {
|
1252
|
-
if (rest[i][TYPE] !==
|
1981
|
+
if (rest[i][TYPE] !== MAIN_TYPE) {
|
1253
1982
|
errorStack.add(
|
1254
1983
|
`Incorrect type of argument (${i}) for special form (${
|
1255
1984
|
first[VALUE]
|
1256
1985
|
}). Expected (${toTypeNames(
|
1257
|
-
|
1986
|
+
MAIN_TYPE
|
1258
1987
|
)}) but got (${toTypeNames(
|
1259
1988
|
rest[i][TYPE]
|
1260
1989
|
)}) (${stringifyArgs(exp)}) (check #2)`
|
@@ -1353,5 +2082,6 @@ export const typeCheck = (ast) => {
|
|
1353
2082
|
while (stack.length) stack.pop()()
|
1354
2083
|
const issues = [...errorStack, ...warningStack]
|
1355
2084
|
if (issues.length) throw new TypeError(issues.join('\n'))
|
1356
|
-
return ast
|
2085
|
+
return [ast, Types]
|
1357
2086
|
}
|
2087
|
+
export const type = (ast) => typeCheck(ast)[0]
|