fez-lisp 1.5.51 → 1.5.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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
- [RETURNS]: [ATOM]
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,7 +1276,19 @@ export const typeCheck = (ast) => {
587
1276
  const re = rem.slice(2)
588
1277
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
589
1278
  env[name][STATS][prop][0] = ATOM
590
- } else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
1279
+ env[name][STATS][RETURNS][0] = ATOM
1280
+ if (
1281
+ getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
1282
+ getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
1283
+ ) {
1284
+ // env[name][STATS][TYPE_PROP][1] = PREDICATE
1285
+ env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1286
+ }
1287
+ } else if (
1288
+ !isLeaf(re[0]) &&
1289
+ env[re[0][0][VALUE]] &&
1290
+ env[re[0][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
1291
+ ) {
591
1292
  env[name][STATS][prop] =
592
1293
  env[re[0][0][VALUE]][STATS][RETURNS]
593
1294
  if (
@@ -603,11 +1304,38 @@ export const typeCheck = (ast) => {
603
1304
  }
604
1305
  }
605
1306
  // env[name][STATS] = env[re[0][0][VALUE]][STATS]
1307
+ } else if (
1308
+ !isLeaf(re[1]) &&
1309
+ env[re[1][0][VALUE]] &&
1310
+ env[re[1][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
1311
+ ) {
1312
+ env[name][STATS][prop] =
1313
+ env[re[1][0][VALUE]][STATS][prop]
1314
+ env[name][STATS][prop] =
1315
+ env[re[1][0][VALUE]][STATS][RETURNS]
1316
+ if (
1317
+ re[1][0][TYPE] === APPLY &&
1318
+ !name.startsWith(OPTIMIZED_PREFIX)
1319
+ ) {
1320
+ switch (re[1][0][VALUE]) {
1321
+ case KEYWORDS.ANONYMOUS_FUNCTION:
1322
+ env[name][STATS][TYPE_PROP] = [APPLY]
1323
+ env[name][STATS][RETURNS] = [UNKNOWN]
1324
+ env[name][STATS][ARGS_COUNT] =
1325
+ re[1].length - 2
1326
+ break
1327
+ }
1328
+ }
606
1329
  } else if (env[re[0][VALUE]]) {
607
- env[name][STATS][prop][0] =
608
- env[re[0][VALUE]][STATS][TYPE_PROP][0]
609
- env[name][STATS][RETURNS][1] =
610
- 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]
1334
+ } else if (env[re[1][VALUE]]) {
1335
+ env[name][STATS][prop] =
1336
+ env[re[1][VALUE]][STATS][prop]
1337
+ env[name][STATS][RETURNS] =
1338
+ env[re[1][VALUE]][STATS][RETURNS]
611
1339
  } else env[name][STATS][prop] = [UNKNOWN]
612
1340
  }
613
1341
  break
@@ -685,7 +1413,7 @@ export const typeCheck = (ast) => {
685
1413
  )
686
1414
  }
687
1415
  if (isPredicate) {
688
- env[name][STATS][prop] = [ATOM]
1416
+ env[name][STATS][prop] = [ATOM, PREDICATE]
689
1417
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
690
1418
  }
691
1419
  }
@@ -711,7 +1439,7 @@ export const typeCheck = (ast) => {
711
1439
  [TYPE_PROP]: [APPLY],
712
1440
  retried: 0,
713
1441
  [ARGS_COUNT]: n - 2,
714
- [ARGS]: [],
1442
+ [ARGUMENTS]: [],
715
1443
  [RETURNS]: [UNKNOWN]
716
1444
  }
717
1445
  }
@@ -771,11 +1499,13 @@ export const typeCheck = (ast) => {
771
1499
  [STATS]: {
772
1500
  retried: 0,
773
1501
  [TYPE_PROP]: [ATOM],
774
- [RETURNS]: [UNKNOWN]
1502
+ [RETURNS]: [ATOM]
775
1503
  }
776
1504
  }
777
- if (isPredicate)
1505
+ if (isPredicate) {
1506
+ env[name][STATS][TYPE_PROP][1] = PREDICATE
778
1507
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1508
+ }
779
1509
  } else {
780
1510
  const isPredicate = getSuffix(name) === PREDICATE_SUFFIX
781
1511
  if (
@@ -799,8 +1529,10 @@ export const typeCheck = (ast) => {
799
1529
  [RETURNS]: [UNKNOWN]
800
1530
  }
801
1531
  }
802
- if (isPredicate)
1532
+ if (isPredicate) {
1533
+ env[name][STATS][TYPE_PROP][1] = PREDICATE
803
1534
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1535
+ }
804
1536
  if (right && right[VALUE]) {
805
1537
  if (right[VALUE] === KEYWORDS.CALL_FUNCTION) {
806
1538
  if (isLeaf(rest.at(-1).at(-1))) {
@@ -861,6 +1593,7 @@ export const typeCheck = (ast) => {
861
1593
  // }
862
1594
  check(rest.at(-1), env, scope)
863
1595
  }
1596
+ Types.set(withScope(name, env), formatType(name, env))
864
1597
  }
865
1598
  }
866
1599
  break
@@ -886,15 +1619,18 @@ export const typeCheck = (ast) => {
886
1619
  const param = params[i]
887
1620
  copy[param[VALUE]] = {
888
1621
  [STATS]: {
1622
+ [SIGNATURE]: param[VALUE],
889
1623
  [TYPE_PROP]: [UNKNOWN],
890
1624
  [RETURNS]: [UNKNOWN],
1625
+ [ARGUMENTS]: [],
891
1626
  retried: 0
892
1627
  }
893
1628
  }
894
1629
  const ref = env[copy[SCOPE_NAME]]
895
1630
  if (ref) {
896
- if (ref[STATS][ARGS]) ref[STATS][ARGS][i] = copy[param[VALUE]]
1631
+ ref[STATS][ARGUMENTS][i] = copy[param[VALUE]]
897
1632
  if (getSuffix(param[VALUE]) === PREDICATE_SUFFIX) {
1633
+ // copy[param[VALUE]][STATS][TYPE_PROP][1]= PREDICATE
898
1634
  copy[param[VALUE]][STATS][RETURNS] = [ATOM, PREDICATE]
899
1635
  } else {
900
1636
  const returns = deepLambdaReturn(
@@ -924,7 +1660,6 @@ export const typeCheck = (ast) => {
924
1660
  const alternative = isLeaf(re[1])
925
1661
  ? copy[re[1][VALUE]]
926
1662
  : copy[re[1][0][VALUE]]
927
-
928
1663
  // todo check if condition matches alternative
929
1664
  if (
930
1665
  concequent &&
@@ -998,23 +1733,25 @@ export const typeCheck = (ast) => {
998
1733
  }
999
1734
 
1000
1735
  // also type of arg
1001
- const args = env[first[VALUE]][STATS][ARGS]
1736
+ const args = env[first[VALUE]][STATS][ARGUMENTS]
1002
1737
  if (args) {
1003
1738
  for (let i = 0; i < args.length; ++i) {
1004
1739
  // type check
1005
- 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) {
1006
1743
  if (isLeaf(rest[i])) {
1007
1744
  if (rest[i][TYPE] === WORD) {
1008
1745
  if (
1009
1746
  env[rest[i][VALUE]] &&
1010
- args[i][SUB] !==
1747
+ PRED_TYPE !==
1011
1748
  env[rest[i][VALUE]][STATS][RETURNS][1]
1012
1749
  ) {
1013
1750
  errorStack.add(
1014
1751
  `Incorrect type of argument (${i}) for (${
1015
1752
  first[VALUE]
1016
1753
  }). Expected (${toTypeNames(
1017
- args[i][SUB]
1754
+ PRED_TYPE
1018
1755
  )}) but got (${toTypeNames(
1019
1756
  env[rest[i][VALUE]][STATS][RETURNS][1] ??
1020
1757
  env[rest[i][VALUE]][STATS][TYPE_PROP][0]
@@ -1023,7 +1760,7 @@ export const typeCheck = (ast) => {
1023
1760
  }
1024
1761
  } else if (rest[i][TYPE] === ATOM) {
1025
1762
  if (
1026
- args[i][SUB] === PREDICATE &&
1763
+ PRED_TYPE === PREDICATE &&
1027
1764
  rest[i][VALUE] !== TRUE &&
1028
1765
  rest[i][VALUE] !== FALSE
1029
1766
  ) {
@@ -1031,7 +1768,7 @@ export const typeCheck = (ast) => {
1031
1768
  `Incorrect type of arguments for (${
1032
1769
  first[VALUE]
1033
1770
  }). Expected (${toTypeNames(
1034
- args[i][SUB]
1771
+ PRED_TYPE
1035
1772
  )}) but got an (${toTypeNames(
1036
1773
  rest[i][TYPE]
1037
1774
  )}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
@@ -1047,29 +1784,23 @@ export const typeCheck = (ast) => {
1047
1784
  if (isLeaf(rest[i].at(-1))) {
1048
1785
  const fnName = rest[i].at(-1)[VALUE]
1049
1786
  const fn = env[fnName]
1050
- if (
1051
- fn &&
1052
- fn[STATS][RETURNS][0] !== args[i][TYPE]
1053
- ) {
1787
+ if (fn && fn[STATS][RETURNS][0] !== MAIN_TYPE) {
1054
1788
  errorStack.add(
1055
1789
  `Incorrect type of argument (${i}) for (${
1056
1790
  first[VALUE]
1057
1791
  }). Expected (${toTypeNames(
1058
- args[i][TYPE]
1792
+ MAIN_TYPE
1059
1793
  )}) but got an (${toTypeNames(
1060
1794
  fn[STATS][RETURNS][0]
1061
1795
  )}) (${stringifyArgs(exp)}) (check #26)`
1062
1796
  )
1063
1797
  }
1064
- if (
1065
- fn &&
1066
- fn[STATS][RETURNS][1] !== args[i][SUB]
1067
- ) {
1798
+ if (fn && fn[STATS][RETURNS][1] !== PRED_TYPE) {
1068
1799
  errorStack.add(
1069
1800
  `Incorrect type of argument (${i}) for (${
1070
1801
  first[VALUE]
1071
1802
  }). Expected (${toTypeNames(
1072
- args[i][SUB]
1803
+ PRED_TYPE
1073
1804
  )}) but got an (${toTypeNames(
1074
1805
  fn[STATS][RETURNS][1] ??
1075
1806
  fn[STATS][RETURNS][0]
@@ -1083,20 +1814,20 @@ export const typeCheck = (ast) => {
1083
1814
  const rem = hasBlock(body) ? body.at(-1) : body
1084
1815
  const returns = isLeaf(rem) ? rem : rem[0]
1085
1816
  if (returns[TYPE] === ATOM) {
1086
- if (args[i][TYPE] !== ATOM) {
1817
+ if (MAIN_TYPE !== ATOM) {
1087
1818
  errorStack.add(
1088
1819
  `Incorrect type of argument ${i} for (${
1089
1820
  first[VALUE]
1090
1821
  }). Expected (${toTypeNames(
1091
- args[i][TYPE]
1822
+ MAIN_TYPE
1092
1823
  )}) but got an (${toTypeNames(
1093
1824
  ATOM
1094
1825
  )}) (${stringifyArgs(exp)}) (check #27)`
1095
1826
  )
1096
1827
  }
1097
1828
  if (
1098
- args[i][SUB] &&
1099
- args[i][SUB] === PREDICATE &&
1829
+ PRED_TYPE &&
1830
+ PRED_TYPE === PREDICATE &&
1100
1831
  returns[VALUE] !== TRUE &&
1101
1832
  returns[VALUE] !== FALSE
1102
1833
  ) {
@@ -1104,7 +1835,7 @@ export const typeCheck = (ast) => {
1104
1835
  `Incorrect type of argument ${i} for (${
1105
1836
  first[VALUE]
1106
1837
  }). Expected (${toTypeNames(
1107
- args[i][SUB]
1838
+ PRED_TYPE
1108
1839
  )}) but got an (${toTypeNames(
1109
1840
  ATOM
1110
1841
  )}) which is neither ${TRUE} or ${FALSE} (${stringifyArgs(
@@ -1114,29 +1845,29 @@ export const typeCheck = (ast) => {
1114
1845
  }
1115
1846
  } else if (env[returns[VALUE]]) {
1116
1847
  if (
1117
- args[i][TYPE] !==
1848
+ MAIN_TYPE !==
1118
1849
  env[returns[VALUE]][STATS][RETURNS][0]
1119
1850
  ) {
1120
1851
  errorStack.add(
1121
1852
  `Incorrect type of argument ${i} for (${
1122
1853
  first[VALUE]
1123
1854
  }). Expected (${toTypeNames(
1124
- args[i][TYPE]
1855
+ MAIN_TYPE
1125
1856
  )}) but got (${toTypeNames(
1126
1857
  env[returns[VALUE]][STATS][TYPE_PROP]
1127
1858
  )}) (${stringifyArgs(exp)}) (check #29)`
1128
1859
  )
1129
1860
  }
1130
1861
  if (
1131
- args[i][SUB] &&
1132
- args[i][SUB] !==
1862
+ PRED_TYPE &&
1863
+ PRED_TYPE !==
1133
1864
  env[returns[VALUE]][STATS][RETURNS][1]
1134
1865
  ) {
1135
1866
  errorStack.add(
1136
1867
  `Incorrect type of argument ${i} for (${
1137
1868
  first[VALUE]
1138
1869
  }). Expected (${toTypeNames(
1139
- args[i][SUB]
1870
+ PRED_TYPE
1140
1871
  )}) but got (${toTypeNames(
1141
1872
  env[returns[VALUE]][STATS][RETURNS][1]
1142
1873
  )}) (${stringifyArgs(exp)}) (check #28)`
@@ -1145,16 +1876,16 @@ export const typeCheck = (ast) => {
1145
1876
  }
1146
1877
  }
1147
1878
  } else if (
1148
- args[i][SUB] &&
1879
+ PRED_TYPE &&
1149
1880
  env[current[VALUE]] &&
1150
1881
  env[current[VALUE]][STATS][RETURNS][1] !==
1151
- args[i][SUB]
1882
+ PRED_TYPE
1152
1883
  ) {
1153
1884
  errorStack.add(
1154
1885
  `Incorrect type of arguments (${i}) for (${
1155
1886
  first[VALUE]
1156
1887
  }). Expected (${toTypeNames(
1157
- args[i][SUB]
1888
+ PRED_TYPE
1158
1889
  )}) but got (${toTypeNames(
1159
1890
  env[current[VALUE]][STATS][RETURNS][1] ??
1160
1891
  env[current[VALUE]][STATS][RETURNS][0]
@@ -1166,38 +1897,37 @@ export const typeCheck = (ast) => {
1166
1897
  }
1167
1898
 
1168
1899
  if (first[TYPE] === APPLY && isSpecial) {
1169
- const expectedArgs = env[first[VALUE]][STATS][ARGS]
1900
+ const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
1170
1901
  for (let i = 0; i < rest.length; ++i) {
1171
- 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
1172
1906
  if (!isLeaf(rest[i])) {
1173
1907
  const CAR = rest[i][0][VALUE]
1174
1908
  const isKnown =
1175
1909
  env[CAR] &&
1176
1910
  env[CAR][STATS][RETURNS][0] !== UNKNOWN
1177
1911
  if (isKnown) {
1178
- if (
1179
- env[CAR][STATS][RETURNS][0] !==
1180
- expectedArgs[i][TYPE]
1181
- ) {
1912
+ if (env[CAR][STATS][RETURNS][0] !== MAIN_TYPE) {
1182
1913
  errorStack.add(
1183
1914
  `Incorrect type of argument (${i}) for special form (${
1184
1915
  first[VALUE]
1185
1916
  }). Expected (${toTypeNames(
1186
- expectedArgs[i][TYPE]
1917
+ MAIN_TYPE
1187
1918
  )}) but got (${toTypeNames(
1188
1919
  env[CAR][STATS][RETURNS][0]
1189
1920
  )}) (${stringifyArgs(exp)}) (check #1)`
1190
1921
  )
1191
1922
  } else if (
1192
- expectedArgs[i][SUB] &&
1193
- env[CAR][STATS][RETURNS][1] !==
1194
- expectedArgs[i][SUB]
1923
+ PRED_TYPE &&
1924
+ env[CAR][STATS][RETURNS][1] !== PRED_TYPE
1195
1925
  ) {
1196
1926
  errorStack.add(
1197
1927
  `Incorrect type of arguments for special form (${
1198
1928
  first[VALUE]
1199
1929
  }). Expected (${toTypeNames(
1200
- expectedArgs[i][SUB]
1930
+ PRED_TYPE
1201
1931
  )}) but got (${toTypeNames(
1202
1932
  env[CAR][STATS][RETURNS][1] ??
1203
1933
  env[CAR][STATS][RETURNS][0]
@@ -1215,28 +1945,27 @@ export const typeCheck = (ast) => {
1215
1945
  env[CAR][STATS][TYPE_PROP][0] !== UNKNOWN
1216
1946
  if (isKnown) {
1217
1947
  if (
1218
- expectedArgs[i][TYPE] !==
1948
+ MAIN_TYPE !==
1219
1949
  env[CAR][STATS][TYPE_PROP][0]
1220
1950
  ) {
1221
1951
  errorStack.add(
1222
1952
  `Incorrect type of argument (${i}) for special form (${
1223
1953
  first[VALUE]
1224
1954
  }). Expected (${toTypeNames(
1225
- expectedArgs[i][TYPE]
1955
+ MAIN_TYPE
1226
1956
  )}) but got (${toTypeNames(
1227
1957
  env[CAR][STATS][TYPE_PROP][0]
1228
1958
  )}) (${stringifyArgs(exp)}) (check #3)`
1229
1959
  )
1230
1960
  } else if (
1231
- expectedArgs[i][SUB] &&
1232
- env[CAR][STATS][RETURNS][1] !==
1233
- expectedArgs[i][SUB]
1961
+ PRED_TYPE &&
1962
+ env[CAR][STATS][RETURNS][1] !== PRED_TYPE
1234
1963
  )
1235
1964
  errorStack.add(
1236
1965
  `Incorrect type of argument (${i}) for special form (${
1237
1966
  first[VALUE]
1238
1967
  }). Expected (${toTypeNames(
1239
- expectedArgs[i][SUB]
1968
+ PRED_TYPE
1240
1969
  )}) but got (${toTypeNames(
1241
1970
  env[CAR][STATS][RETURNS][1] ??
1242
1971
  env[CAR][STATS][TYPE_PROP][0]
@@ -1244,17 +1973,17 @@ export const typeCheck = (ast) => {
1244
1973
  )
1245
1974
  } else if (env[rest[i][VALUE]]) {
1246
1975
  env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
1247
- expectedArgs[i][TYPE]
1976
+ MAIN_TYPE
1248
1977
  }
1249
1978
  }
1250
1979
  break
1251
1980
  case ATOM: {
1252
- if (rest[i][TYPE] !== expectedArgs[i][TYPE]) {
1981
+ if (rest[i][TYPE] !== MAIN_TYPE) {
1253
1982
  errorStack.add(
1254
1983
  `Incorrect type of argument (${i}) for special form (${
1255
1984
  first[VALUE]
1256
1985
  }). Expected (${toTypeNames(
1257
- expectedArgs[i][TYPE]
1986
+ MAIN_TYPE
1258
1987
  )}) but got (${toTypeNames(
1259
1988
  rest[i][TYPE]
1260
1989
  )}) (${stringifyArgs(exp)}) (check #2)`
@@ -1353,5 +2082,6 @@ export const typeCheck = (ast) => {
1353
2082
  while (stack.length) stack.pop()()
1354
2083
  const issues = [...errorStack, ...warningStack]
1355
2084
  if (issues.length) throw new TypeError(issues.join('\n'))
1356
- return ast
2085
+ return [ast, Types]
1357
2086
  }
2087
+ export const type = (ast) => typeCheck(ast)[0]