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