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/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 ARGS = 'args'
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
- // const getScopeNames = (scope) => {
74
- // const scopeNames = []
75
- // let current = scope
76
- // while (current) {
77
- // if (current[SCOPE_NAME]) {
78
- // scopeNames.push(current[SCOPE_NAME])
79
- // }
80
- // current = Object.getPrototypeOf(current)
81
- // }
82
- // return scopeNames.reverse()
83
- // }
84
- // const withScope = (name, scope) => {
85
- // const chain = getScopeNames(scope)
86
- // const str = `${chain.join('_')}_${name}::${performance
87
- // .now()
88
- // .toString()
89
- // .replace('.', 0)}`
90
- // return { str, chain }
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]: Object.freeze({
115
+ [STATS]: {
96
116
  [TYPE_PROP]: [APPLY],
117
+ [SIGNATURE]: toTypeNames(APPLY),
97
118
  retried: RETRY_COUNT,
98
119
  [ARGS_COUNT]: 1,
99
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
137
+ [STATS]: {
105
138
  [TYPE_PROP]: [APPLY],
139
+ [SIGNATURE]: toTypeNames(ATOM),
106
140
  retried: RETRY_COUNT,
107
141
  [ARGS_COUNT]: 1,
108
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
181
+ [STATS]: {
123
182
  [TYPE_PROP]: [APPLY],
183
+ [SIGNATURE]: toTypeNames(COLLECTION),
124
184
  retried: RETRY_COUNT,
125
185
  [ARGS_COUNT]: 1,
126
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
203
+ [STATS]: {
132
204
  [TYPE_PROP]: [APPLY],
205
+ [SIGNATURE]: toTypeNames(UNKNOWN),
133
206
  retried: RETRY_COUNT,
134
207
  [ARGS_COUNT]: 1,
135
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [
144
- [UNKNOWN, PLACEHOLDER],
145
- [COLLECTION, PLACEHOLDER]
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [
230
- [ATOM, PLACEHOLDER, PREDICATE],
231
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [
242
- [ATOM, PLACEHOLDER],
243
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
254
- [ATOM, PLACEHOLDER],
255
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
266
- [ATOM, PLACEHOLDER],
267
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
278
- [ATOM, PLACEHOLDER],
279
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
290
- [ATOM, PLACEHOLDER],
291
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
302
- [ATOM, PLACEHOLDER],
303
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [[ATOM, PLACEHOLDER]],
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
- [ARGS]: [
323
- [ATOM, PLACEHOLDER],
324
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
335
- [ATOM, PLACEHOLDER],
336
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
347
- [ATOM, PLACEHOLDER],
348
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
359
- [ATOM, PLACEHOLDER],
360
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
371
- [COLLECTION, PLACEHOLDER],
372
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
383
- [COLLECTION, PLACEHOLDER],
384
- [ATOM, PLACEHOLDER],
385
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [
414
- [ATOM, PLACEHOLDER, PREDICATE],
415
- [UNKNOWN, PLACEHOLDER],
416
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
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
- [ARGS]: [
436
- [ATOM, PLACEHOLDER],
437
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
448
- [ATOM, PLACEHOLDER],
449
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
460
- [ATOM, PLACEHOLDER],
461
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
472
- [ATOM, PLACEHOLDER],
473
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
484
- [ATOM, PLACEHOLDER],
485
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
496
- [ATOM, PLACEHOLDER, PREDICATE],
497
- [ATOM, PLACEHOLDER, PREDICATE]
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
- [ARGS]: [
508
- [ATOM, PLACEHOLDER, PREDICATE],
509
- [ATOM, PLACEHOLDER, PREDICATE]
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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][0] =
637
- env[re[0][VALUE]][STATS][TYPE_PROP][0]
638
- env[name][STATS][RETURNS][1] =
639
- env[re[0][VALUE]][STATS][RETURNS][1]
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][1] =
642
- env[re[1][VALUE]][STATS][TYPE_PROP][0]
643
- env[name][STATS][RETURNS][1] =
644
- env[re[1][VALUE]][STATS][RETURNS][1]
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
- [ARGS]: [],
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]: [UNKNOWN]
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
- if (ref[STATS][ARGS]) ref[STATS][ARGS][i] = copy[param[VALUE]]
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][ARGS]
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
- if (args[i][SUB] != undefined) {
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
- args[i][SUB] !==
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
- args[i][SUB]
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
- args[i][SUB] === PREDICATE &&
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
- args[i][SUB]
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
- args[i][TYPE]
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
- args[i][SUB]
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 (args[i][TYPE] !== ATOM) {
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
- args[i][TYPE]
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
- args[i][SUB] &&
1132
- args[i][SUB] === PREDICATE &&
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
- args[i][SUB]
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
- args[i][TYPE] !==
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
- args[i][TYPE]
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
- args[i][SUB] &&
1165
- args[i][SUB] !==
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
- args[i][SUB]
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
- args[i][SUB] &&
1878
+ PRED_TYPE &&
1182
1879
  env[current[VALUE]] &&
1183
1880
  env[current[VALUE]][STATS][RETURNS][1] !==
1184
- args[i][SUB]
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
- args[i][SUB]
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][ARGS]
1899
+ const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
1203
1900
  for (let i = 0; i < rest.length; ++i) {
1204
- if (expectedArgs[i][TYPE] === UNKNOWN) continue
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
- expectedArgs[i][TYPE]
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
- expectedArgs[i][SUB] &&
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
- expectedArgs[i][SUB]
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
- expectedArgs[i][TYPE] !==
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
- expectedArgs[i][TYPE]
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
- expectedArgs[i][SUB] &&
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
- expectedArgs[i][SUB]
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
- expectedArgs[i][TYPE]
1974
+ MAIN_TYPE
1281
1975
  }
1282
1976
  }
1283
1977
  break
1284
1978
  case ATOM: {
1285
- if (rest[i][TYPE] !== expectedArgs[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
- expectedArgs[i][TYPE]
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]