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/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 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
@@ -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
- // 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
- // }
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]: Object.freeze({
116
+ [STATS]: {
96
117
  [TYPE_PROP]: [APPLY],
118
+ [SIGNATURE]: toTypeNames(APPLY),
97
119
  retried: RETRY_COUNT,
98
120
  [ARGS_COUNT]: 1,
99
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
138
+ [STATS]: {
105
139
  [TYPE_PROP]: [APPLY],
140
+ [SIGNATURE]: toTypeNames(ATOM),
106
141
  retried: RETRY_COUNT,
107
142
  [ARGS_COUNT]: 1,
108
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
182
+ [STATS]: {
123
183
  [TYPE_PROP]: [APPLY],
184
+ [SIGNATURE]: toTypeNames(COLLECTION),
124
185
  retried: RETRY_COUNT,
125
186
  [ARGS_COUNT]: 1,
126
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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]: Object.freeze({
204
+ [STATS]: {
132
205
  [TYPE_PROP]: [APPLY],
206
+ [SIGNATURE]: toTypeNames(UNKNOWN),
133
207
  retried: RETRY_COUNT,
134
208
  [ARGS_COUNT]: 1,
135
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [
144
- [UNKNOWN, PLACEHOLDER],
145
- [COLLECTION, PLACEHOLDER]
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [
230
- [ATOM, PLACEHOLDER, PREDICATE],
231
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [
242
- [ATOM, PLACEHOLDER],
243
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
254
- [ATOM, PLACEHOLDER],
255
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
266
- [ATOM, PLACEHOLDER],
267
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
278
- [ATOM, PLACEHOLDER],
279
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
290
- [ATOM, PLACEHOLDER],
291
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
302
- [ATOM, PLACEHOLDER],
303
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [[ATOM, PLACEHOLDER]],
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
- [ARGS]: [
323
- [ATOM, PLACEHOLDER],
324
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
335
- [ATOM, PLACEHOLDER],
336
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
347
- [ATOM, PLACEHOLDER],
348
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
359
- [ATOM, PLACEHOLDER],
360
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
371
- [COLLECTION, PLACEHOLDER],
372
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
383
- [COLLECTION, PLACEHOLDER],
384
- [ATOM, PLACEHOLDER],
385
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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
- [ARGS]: [
414
- [ATOM, PLACEHOLDER, PREDICATE],
415
- [UNKNOWN, PLACEHOLDER],
416
- [UNKNOWN, PLACEHOLDER]
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
- [ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
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
- [ARGS]: [
436
- [ATOM, PLACEHOLDER],
437
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
448
- [ATOM, PLACEHOLDER],
449
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
460
- [ATOM, PLACEHOLDER],
461
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
472
- [ATOM, PLACEHOLDER],
473
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
484
- [ATOM, PLACEHOLDER],
485
- [ATOM, PLACEHOLDER]
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
- [ARGS]: [
496
- [ATOM, PLACEHOLDER, PREDICATE],
497
- [ATOM, PLACEHOLDER, PREDICATE]
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
- [ARGS]: [
508
- [ATOM, PLACEHOLDER, PREDICATE],
509
- [ATOM, PLACEHOLDER, PREDICATE]
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
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
- [ARGS]: [[COLLECTION, PLACEHOLDER]],
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][0] =
637
- env[re[0][VALUE]][STATS][TYPE_PROP][0]
638
- env[name][STATS][RETURNS][1] =
639
- env[re[0][VALUE]][STATS][RETURNS][1]
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][1] =
642
- env[re[1][VALUE]][STATS][TYPE_PROP][0]
643
- env[name][STATS][RETURNS][1] =
644
- env[re[1][VALUE]][STATS][RETURNS][1]
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
- [ARGS]: [],
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]: [UNKNOWN]
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
- if (ref[STATS][ARGS]) ref[STATS][ARGS][i] = copy[param[VALUE]]
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][ARGS]
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
- if (args[i][SUB] != undefined) {
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
- args[i][SUB] !==
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
- args[i][SUB]
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
- args[i][SUB] === PREDICATE &&
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
- args[i][SUB]
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
- args[i][TYPE]
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
- args[i][SUB]
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 (args[i][TYPE] !== ATOM) {
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
- args[i][TYPE]
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
- args[i][SUB] &&
1132
- args[i][SUB] === PREDICATE &&
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
- args[i][SUB]
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
- args[i][TYPE] !==
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
- args[i][TYPE]
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
- args[i][SUB] &&
1165
- args[i][SUB] !==
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
- args[i][SUB]
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
- args[i][SUB] &&
1879
+ PRED_TYPE &&
1182
1880
  env[current[VALUE]] &&
1183
1881
  env[current[VALUE]][STATS][RETURNS][1] !==
1184
- args[i][SUB]
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
- args[i][SUB]
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][ARGS]
1900
+ const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
1203
1901
  for (let i = 0; i < rest.length; ++i) {
1204
- if (expectedArgs[i][TYPE] === UNKNOWN) continue
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
- expectedArgs[i][TYPE]
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
- expectedArgs[i][SUB] &&
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
- expectedArgs[i][SUB]
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
- expectedArgs[i][TYPE] !==
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
- expectedArgs[i][TYPE]
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
- expectedArgs[i][SUB] &&
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
- expectedArgs[i][SUB]
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
- expectedArgs[i][TYPE]
1976
+ MAIN_TYPE
1281
1977
  }
1282
1978
  }
1283
1979
  break
1284
1980
  case ATOM: {
1285
- if (rest[i][TYPE] !== expectedArgs[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
- expectedArgs[i][TYPE]
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]