fez-lisp 1.5.52 → 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/index.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +885 -188
- package/src/keywords.js +2 -1
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
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,11 +1276,14 @@ 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
|
1279
|
+
env[name][STATS][RETURNS][0] = ATOM
|
590
1280
|
if (
|
591
1281
|
getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
|
592
1282
|
getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
|
593
|
-
)
|
1283
|
+
) {
|
1284
|
+
// env[name][STATS][TYPE_PROP][1] = PREDICATE
|
594
1285
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1286
|
+
}
|
595
1287
|
} else if (
|
596
1288
|
!isLeaf(re[0]) &&
|
597
1289
|
env[re[0][0][VALUE]] &&
|
@@ -617,6 +1309,8 @@ export const typeCheck = (ast) => {
|
|
617
1309
|
env[re[1][0][VALUE]] &&
|
618
1310
|
env[re[1][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
|
619
1311
|
) {
|
1312
|
+
env[name][STATS][prop] =
|
1313
|
+
env[re[1][0][VALUE]][STATS][prop]
|
620
1314
|
env[name][STATS][prop] =
|
621
1315
|
env[re[1][0][VALUE]][STATS][RETURNS]
|
622
1316
|
if (
|
@@ -625,23 +1319,23 @@ export const typeCheck = (ast) => {
|
|
625
1319
|
) {
|
626
1320
|
switch (re[1][0][VALUE]) {
|
627
1321
|
case KEYWORDS.ANONYMOUS_FUNCTION:
|
1322
|
+
env[name][STATS][TYPE_PROP] = [APPLY]
|
628
1323
|
env[name][STATS][RETURNS] = [UNKNOWN]
|
629
1324
|
env[name][STATS][ARGS_COUNT] =
|
630
1325
|
re[1].length - 2
|
631
1326
|
break
|
632
1327
|
}
|
633
1328
|
}
|
634
|
-
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
635
1329
|
} 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]
|
1330
|
+
env[name][STATS][prop] =
|
1331
|
+
env[re[0][VALUE]][STATS][prop]
|
1332
|
+
env[name][STATS][RETURNS] =
|
1333
|
+
env[re[0][VALUE]][STATS][RETURNS]
|
640
1334
|
} 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]
|
1335
|
+
env[name][STATS][prop] =
|
1336
|
+
env[re[1][VALUE]][STATS][prop]
|
1337
|
+
env[name][STATS][RETURNS] =
|
1338
|
+
env[re[1][VALUE]][STATS][RETURNS]
|
645
1339
|
} else env[name][STATS][prop] = [UNKNOWN]
|
646
1340
|
}
|
647
1341
|
break
|
@@ -719,7 +1413,7 @@ export const typeCheck = (ast) => {
|
|
719
1413
|
)
|
720
1414
|
}
|
721
1415
|
if (isPredicate) {
|
722
|
-
env[name][STATS][prop] = [ATOM]
|
1416
|
+
env[name][STATS][prop] = [ATOM, PREDICATE]
|
723
1417
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
724
1418
|
}
|
725
1419
|
}
|
@@ -745,7 +1439,7 @@ export const typeCheck = (ast) => {
|
|
745
1439
|
[TYPE_PROP]: [APPLY],
|
746
1440
|
retried: 0,
|
747
1441
|
[ARGS_COUNT]: n - 2,
|
748
|
-
[
|
1442
|
+
[ARGUMENTS]: [],
|
749
1443
|
[RETURNS]: [UNKNOWN]
|
750
1444
|
}
|
751
1445
|
}
|
@@ -805,11 +1499,13 @@ export const typeCheck = (ast) => {
|
|
805
1499
|
[STATS]: {
|
806
1500
|
retried: 0,
|
807
1501
|
[TYPE_PROP]: [ATOM],
|
808
|
-
[RETURNS]: [
|
1502
|
+
[RETURNS]: [ATOM]
|
809
1503
|
}
|
810
1504
|
}
|
811
|
-
if (isPredicate)
|
1505
|
+
if (isPredicate) {
|
1506
|
+
env[name][STATS][TYPE_PROP][1] = PREDICATE
|
812
1507
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1508
|
+
}
|
813
1509
|
} else {
|
814
1510
|
const isPredicate = getSuffix(name) === PREDICATE_SUFFIX
|
815
1511
|
if (
|
@@ -833,8 +1529,10 @@ export const typeCheck = (ast) => {
|
|
833
1529
|
[RETURNS]: [UNKNOWN]
|
834
1530
|
}
|
835
1531
|
}
|
836
|
-
if (isPredicate)
|
1532
|
+
if (isPredicate) {
|
1533
|
+
env[name][STATS][TYPE_PROP][1] = PREDICATE
|
837
1534
|
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
1535
|
+
}
|
838
1536
|
if (right && right[VALUE]) {
|
839
1537
|
if (right[VALUE] === KEYWORDS.CALL_FUNCTION) {
|
840
1538
|
if (isLeaf(rest.at(-1).at(-1))) {
|
@@ -895,6 +1593,7 @@ export const typeCheck = (ast) => {
|
|
895
1593
|
// }
|
896
1594
|
check(rest.at(-1), env, scope)
|
897
1595
|
}
|
1596
|
+
Types.set(withScope(name, env), formatType(name, env))
|
898
1597
|
}
|
899
1598
|
}
|
900
1599
|
break
|
@@ -920,15 +1619,18 @@ export const typeCheck = (ast) => {
|
|
920
1619
|
const param = params[i]
|
921
1620
|
copy[param[VALUE]] = {
|
922
1621
|
[STATS]: {
|
1622
|
+
[SIGNATURE]: param[VALUE],
|
923
1623
|
[TYPE_PROP]: [UNKNOWN],
|
924
1624
|
[RETURNS]: [UNKNOWN],
|
1625
|
+
[ARGUMENTS]: [],
|
925
1626
|
retried: 0
|
926
1627
|
}
|
927
1628
|
}
|
928
1629
|
const ref = env[copy[SCOPE_NAME]]
|
929
1630
|
if (ref) {
|
930
|
-
|
1631
|
+
ref[STATS][ARGUMENTS][i] = copy[param[VALUE]]
|
931
1632
|
if (getSuffix(param[VALUE]) === PREDICATE_SUFFIX) {
|
1633
|
+
// copy[param[VALUE]][STATS][TYPE_PROP][1]= PREDICATE
|
932
1634
|
copy[param[VALUE]][STATS][RETURNS] = [ATOM, PREDICATE]
|
933
1635
|
} else {
|
934
1636
|
const returns = deepLambdaReturn(
|
@@ -1031,23 +1733,25 @@ export const typeCheck = (ast) => {
|
|
1031
1733
|
}
|
1032
1734
|
|
1033
1735
|
// also type of arg
|
1034
|
-
const args = env[first[VALUE]][STATS][
|
1736
|
+
const args = env[first[VALUE]][STATS][ARGUMENTS]
|
1035
1737
|
if (args) {
|
1036
1738
|
for (let i = 0; i < args.length; ++i) {
|
1037
1739
|
// type check
|
1038
|
-
|
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) {
|
1039
1743
|
if (isLeaf(rest[i])) {
|
1040
1744
|
if (rest[i][TYPE] === WORD) {
|
1041
1745
|
if (
|
1042
1746
|
env[rest[i][VALUE]] &&
|
1043
|
-
|
1747
|
+
PRED_TYPE !==
|
1044
1748
|
env[rest[i][VALUE]][STATS][RETURNS][1]
|
1045
1749
|
) {
|
1046
1750
|
errorStack.add(
|
1047
1751
|
`Incorrect type of argument (${i}) for (${
|
1048
1752
|
first[VALUE]
|
1049
1753
|
}). Expected (${toTypeNames(
|
1050
|
-
|
1754
|
+
PRED_TYPE
|
1051
1755
|
)}) but got (${toTypeNames(
|
1052
1756
|
env[rest[i][VALUE]][STATS][RETURNS][1] ??
|
1053
1757
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0]
|
@@ -1056,7 +1760,7 @@ export const typeCheck = (ast) => {
|
|
1056
1760
|
}
|
1057
1761
|
} else if (rest[i][TYPE] === ATOM) {
|
1058
1762
|
if (
|
1059
|
-
|
1763
|
+
PRED_TYPE === PREDICATE &&
|
1060
1764
|
rest[i][VALUE] !== TRUE &&
|
1061
1765
|
rest[i][VALUE] !== FALSE
|
1062
1766
|
) {
|
@@ -1064,7 +1768,7 @@ export const typeCheck = (ast) => {
|
|
1064
1768
|
`Incorrect type of arguments for (${
|
1065
1769
|
first[VALUE]
|
1066
1770
|
}). Expected (${toTypeNames(
|
1067
|
-
|
1771
|
+
PRED_TYPE
|
1068
1772
|
)}) but got an (${toTypeNames(
|
1069
1773
|
rest[i][TYPE]
|
1070
1774
|
)}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
|
@@ -1080,29 +1784,23 @@ export const typeCheck = (ast) => {
|
|
1080
1784
|
if (isLeaf(rest[i].at(-1))) {
|
1081
1785
|
const fnName = rest[i].at(-1)[VALUE]
|
1082
1786
|
const fn = env[fnName]
|
1083
|
-
if (
|
1084
|
-
fn &&
|
1085
|
-
fn[STATS][RETURNS][0] !== args[i][TYPE]
|
1086
|
-
) {
|
1787
|
+
if (fn && fn[STATS][RETURNS][0] !== MAIN_TYPE) {
|
1087
1788
|
errorStack.add(
|
1088
1789
|
`Incorrect type of argument (${i}) for (${
|
1089
1790
|
first[VALUE]
|
1090
1791
|
}). Expected (${toTypeNames(
|
1091
|
-
|
1792
|
+
MAIN_TYPE
|
1092
1793
|
)}) but got an (${toTypeNames(
|
1093
1794
|
fn[STATS][RETURNS][0]
|
1094
1795
|
)}) (${stringifyArgs(exp)}) (check #26)`
|
1095
1796
|
)
|
1096
1797
|
}
|
1097
|
-
if (
|
1098
|
-
fn &&
|
1099
|
-
fn[STATS][RETURNS][1] !== args[i][SUB]
|
1100
|
-
) {
|
1798
|
+
if (fn && fn[STATS][RETURNS][1] !== PRED_TYPE) {
|
1101
1799
|
errorStack.add(
|
1102
1800
|
`Incorrect type of argument (${i}) for (${
|
1103
1801
|
first[VALUE]
|
1104
1802
|
}). Expected (${toTypeNames(
|
1105
|
-
|
1803
|
+
PRED_TYPE
|
1106
1804
|
)}) but got an (${toTypeNames(
|
1107
1805
|
fn[STATS][RETURNS][1] ??
|
1108
1806
|
fn[STATS][RETURNS][0]
|
@@ -1116,20 +1814,20 @@ export const typeCheck = (ast) => {
|
|
1116
1814
|
const rem = hasBlock(body) ? body.at(-1) : body
|
1117
1815
|
const returns = isLeaf(rem) ? rem : rem[0]
|
1118
1816
|
if (returns[TYPE] === ATOM) {
|
1119
|
-
if (
|
1817
|
+
if (MAIN_TYPE !== ATOM) {
|
1120
1818
|
errorStack.add(
|
1121
1819
|
`Incorrect type of argument ${i} for (${
|
1122
1820
|
first[VALUE]
|
1123
1821
|
}). Expected (${toTypeNames(
|
1124
|
-
|
1822
|
+
MAIN_TYPE
|
1125
1823
|
)}) but got an (${toTypeNames(
|
1126
1824
|
ATOM
|
1127
1825
|
)}) (${stringifyArgs(exp)}) (check #27)`
|
1128
1826
|
)
|
1129
1827
|
}
|
1130
1828
|
if (
|
1131
|
-
|
1132
|
-
|
1829
|
+
PRED_TYPE &&
|
1830
|
+
PRED_TYPE === PREDICATE &&
|
1133
1831
|
returns[VALUE] !== TRUE &&
|
1134
1832
|
returns[VALUE] !== FALSE
|
1135
1833
|
) {
|
@@ -1137,7 +1835,7 @@ export const typeCheck = (ast) => {
|
|
1137
1835
|
`Incorrect type of argument ${i} for (${
|
1138
1836
|
first[VALUE]
|
1139
1837
|
}). Expected (${toTypeNames(
|
1140
|
-
|
1838
|
+
PRED_TYPE
|
1141
1839
|
)}) but got an (${toTypeNames(
|
1142
1840
|
ATOM
|
1143
1841
|
)}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
|
@@ -1147,29 +1845,29 @@ export const typeCheck = (ast) => {
|
|
1147
1845
|
}
|
1148
1846
|
} else if (env[returns[VALUE]]) {
|
1149
1847
|
if (
|
1150
|
-
|
1848
|
+
MAIN_TYPE !==
|
1151
1849
|
env[returns[VALUE]][STATS][RETURNS][0]
|
1152
1850
|
) {
|
1153
1851
|
errorStack.add(
|
1154
1852
|
`Incorrect type of argument ${i} for (${
|
1155
1853
|
first[VALUE]
|
1156
1854
|
}). Expected (${toTypeNames(
|
1157
|
-
|
1855
|
+
MAIN_TYPE
|
1158
1856
|
)}) but got (${toTypeNames(
|
1159
1857
|
env[returns[VALUE]][STATS][TYPE_PROP]
|
1160
1858
|
)}) (${stringifyArgs(exp)}) (check #29)`
|
1161
1859
|
)
|
1162
1860
|
}
|
1163
1861
|
if (
|
1164
|
-
|
1165
|
-
|
1862
|
+
PRED_TYPE &&
|
1863
|
+
PRED_TYPE !==
|
1166
1864
|
env[returns[VALUE]][STATS][RETURNS][1]
|
1167
1865
|
) {
|
1168
1866
|
errorStack.add(
|
1169
1867
|
`Incorrect type of argument ${i} for (${
|
1170
1868
|
first[VALUE]
|
1171
1869
|
}). Expected (${toTypeNames(
|
1172
|
-
|
1870
|
+
PRED_TYPE
|
1173
1871
|
)}) but got (${toTypeNames(
|
1174
1872
|
env[returns[VALUE]][STATS][RETURNS][1]
|
1175
1873
|
)}) (${stringifyArgs(exp)}) (check #28)`
|
@@ -1178,16 +1876,16 @@ export const typeCheck = (ast) => {
|
|
1178
1876
|
}
|
1179
1877
|
}
|
1180
1878
|
} else if (
|
1181
|
-
|
1879
|
+
PRED_TYPE &&
|
1182
1880
|
env[current[VALUE]] &&
|
1183
1881
|
env[current[VALUE]][STATS][RETURNS][1] !==
|
1184
|
-
|
1882
|
+
PRED_TYPE
|
1185
1883
|
) {
|
1186
1884
|
errorStack.add(
|
1187
1885
|
`Incorrect type of arguments (${i}) for (${
|
1188
1886
|
first[VALUE]
|
1189
1887
|
}). Expected (${toTypeNames(
|
1190
|
-
|
1888
|
+
PRED_TYPE
|
1191
1889
|
)}) but got (${toTypeNames(
|
1192
1890
|
env[current[VALUE]][STATS][RETURNS][1] ??
|
1193
1891
|
env[current[VALUE]][STATS][RETURNS][0]
|
@@ -1199,38 +1897,37 @@ export const typeCheck = (ast) => {
|
|
1199
1897
|
}
|
1200
1898
|
|
1201
1899
|
if (first[TYPE] === APPLY && isSpecial) {
|
1202
|
-
const expectedArgs = env[first[VALUE]][STATS][
|
1900
|
+
const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
|
1203
1901
|
for (let i = 0; i < rest.length; ++i) {
|
1204
|
-
|
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
|
1205
1906
|
if (!isLeaf(rest[i])) {
|
1206
1907
|
const CAR = rest[i][0][VALUE]
|
1207
1908
|
const isKnown =
|
1208
1909
|
env[CAR] &&
|
1209
1910
|
env[CAR][STATS][RETURNS][0] !== UNKNOWN
|
1210
1911
|
if (isKnown) {
|
1211
|
-
if (
|
1212
|
-
env[CAR][STATS][RETURNS][0] !==
|
1213
|
-
expectedArgs[i][TYPE]
|
1214
|
-
) {
|
1912
|
+
if (env[CAR][STATS][RETURNS][0] !== MAIN_TYPE) {
|
1215
1913
|
errorStack.add(
|
1216
1914
|
`Incorrect type of argument (${i}) for special form (${
|
1217
1915
|
first[VALUE]
|
1218
1916
|
}). Expected (${toTypeNames(
|
1219
|
-
|
1917
|
+
MAIN_TYPE
|
1220
1918
|
)}) but got (${toTypeNames(
|
1221
1919
|
env[CAR][STATS][RETURNS][0]
|
1222
1920
|
)}) (${stringifyArgs(exp)}) (check #1)`
|
1223
1921
|
)
|
1224
1922
|
} else if (
|
1225
|
-
|
1226
|
-
env[CAR][STATS][RETURNS][1] !==
|
1227
|
-
expectedArgs[i][SUB]
|
1923
|
+
PRED_TYPE &&
|
1924
|
+
env[CAR][STATS][RETURNS][1] !== PRED_TYPE
|
1228
1925
|
) {
|
1229
1926
|
errorStack.add(
|
1230
1927
|
`Incorrect type of arguments for special form (${
|
1231
1928
|
first[VALUE]
|
1232
1929
|
}). Expected (${toTypeNames(
|
1233
|
-
|
1930
|
+
PRED_TYPE
|
1234
1931
|
)}) but got (${toTypeNames(
|
1235
1932
|
env[CAR][STATS][RETURNS][1] ??
|
1236
1933
|
env[CAR][STATS][RETURNS][0]
|
@@ -1248,28 +1945,27 @@ export const typeCheck = (ast) => {
|
|
1248
1945
|
env[CAR][STATS][TYPE_PROP][0] !== UNKNOWN
|
1249
1946
|
if (isKnown) {
|
1250
1947
|
if (
|
1251
|
-
|
1948
|
+
MAIN_TYPE !==
|
1252
1949
|
env[CAR][STATS][TYPE_PROP][0]
|
1253
1950
|
) {
|
1254
1951
|
errorStack.add(
|
1255
1952
|
`Incorrect type of argument (${i}) for special form (${
|
1256
1953
|
first[VALUE]
|
1257
1954
|
}). Expected (${toTypeNames(
|
1258
|
-
|
1955
|
+
MAIN_TYPE
|
1259
1956
|
)}) but got (${toTypeNames(
|
1260
1957
|
env[CAR][STATS][TYPE_PROP][0]
|
1261
1958
|
)}) (${stringifyArgs(exp)}) (check #3)`
|
1262
1959
|
)
|
1263
1960
|
} else if (
|
1264
|
-
|
1265
|
-
env[CAR][STATS][RETURNS][1] !==
|
1266
|
-
expectedArgs[i][SUB]
|
1961
|
+
PRED_TYPE &&
|
1962
|
+
env[CAR][STATS][RETURNS][1] !== PRED_TYPE
|
1267
1963
|
)
|
1268
1964
|
errorStack.add(
|
1269
1965
|
`Incorrect type of argument (${i}) for special form (${
|
1270
1966
|
first[VALUE]
|
1271
1967
|
}). Expected (${toTypeNames(
|
1272
|
-
|
1968
|
+
PRED_TYPE
|
1273
1969
|
)}) but got (${toTypeNames(
|
1274
1970
|
env[CAR][STATS][RETURNS][1] ??
|
1275
1971
|
env[CAR][STATS][TYPE_PROP][0]
|
@@ -1277,17 +1973,17 @@ export const typeCheck = (ast) => {
|
|
1277
1973
|
)
|
1278
1974
|
} else if (env[rest[i][VALUE]]) {
|
1279
1975
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
|
1280
|
-
|
1976
|
+
MAIN_TYPE
|
1281
1977
|
}
|
1282
1978
|
}
|
1283
1979
|
break
|
1284
1980
|
case ATOM: {
|
1285
|
-
if (rest[i][TYPE] !==
|
1981
|
+
if (rest[i][TYPE] !== MAIN_TYPE) {
|
1286
1982
|
errorStack.add(
|
1287
1983
|
`Incorrect type of argument (${i}) for special form (${
|
1288
1984
|
first[VALUE]
|
1289
1985
|
}). Expected (${toTypeNames(
|
1290
|
-
|
1986
|
+
MAIN_TYPE
|
1291
1987
|
)}) but got (${toTypeNames(
|
1292
1988
|
rest[i][TYPE]
|
1293
1989
|
)}) (${stringifyArgs(exp)}) (check #2)`
|
@@ -1386,5 +2082,6 @@ export const typeCheck = (ast) => {
|
|
1386
2082
|
while (stack.length) stack.pop()()
|
1387
2083
|
const issues = [...errorStack, ...warningStack]
|
1388
2084
|
if (issues.length) throw new TypeError(issues.join('\n'))
|
1389
|
-
return ast
|
2085
|
+
return [ast, Types]
|
1390
2086
|
}
|
2087
|
+
export const type = (ast) => typeCheck(ast)[0]
|