fez-lisp 1.5.65 → 1.5.67

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
@@ -17,41 +17,29 @@ import {
17
17
  } from './keywords.js'
18
18
  import { OPTIMIZED_PREFIX } from './macros.js'
19
19
  import { isLeaf } from './parser.js'
20
+ import {
21
+ SPECIAL_FORM_TYPES,
22
+ toTypeNames,
23
+ ARGS_COUNT,
24
+ VARIADIC,
25
+ STATS,
26
+ ARGUMENTS,
27
+ UNKNOWN,
28
+ RETURNS,
29
+ SCOPE_NAME,
30
+ TYPE_PROP,
31
+ SIGNATURE,
32
+ PREDICATE,
33
+ COLLECTION,
34
+ MAX_RETRY_DEFINITION
35
+ } from './types.js'
20
36
  import {
21
37
  getSuffix,
22
38
  hasApplyLambdaBlock,
23
39
  hasBlock,
24
40
  stringifyArgs
25
41
  } from './utils.js'
26
- const ARGS_COUNT = 'n'
27
- const VARIADIC = Infinity
28
- const STATS = '__stats__'
29
- const ARGUMENTS = 'arguments'
30
- const UNKNOWN = -1
31
- const RETURNS = 'returns'
32
- const SCOPE_NAME = '__scope__'
33
- const TYPE_PROP = 'type'
34
- const SIGNATURE = 'name'
35
- const PREDICATE = 3
36
- const COLLECTION = 4
37
- const RETRY_COUNT = 1
38
- const DEFINITON_RETRY_COUNT = 1
39
- const toTypeNames = (type) => {
40
- switch (type) {
41
- case APPLY:
42
- return 'Abstraction'
43
- case ATOM:
44
- return 'Atom'
45
- case UNKNOWN:
46
- return 'Unknown'
47
- case PREDICATE:
48
- return 'Predicate'
49
- case COLLECTION:
50
- return 'Collection'
51
- default:
52
- break
53
- }
54
- }
42
+
55
43
  export const identity = (name) => [
56
44
  [0, 'let'],
57
45
  [1, name],
@@ -74,24 +62,29 @@ const deepLambdaReturn = (rest, condition) => {
74
62
  const rem = hasBlock(body) ? body.at(-1) : body
75
63
  return condition(rem) ? rem : deepLambdaReturn(rem, condition)
76
64
  }
77
- const formatType = (name, env) => {
65
+ const assign = (a, b, i) => {
66
+ a[i] = b[i]
67
+ }
68
+ export const formatType = (name, env) => {
78
69
  const stats = env[name][STATS]
79
70
  return stats
80
71
  ? stats[TYPE_PROP][0] === APPLY
81
- ? `${name} (${(stats[ARGUMENTS] ?? [])
82
- .map(
83
- (x) =>
84
- `${x[STATS][SIGNATURE]} ${x[STATS][TYPE_PROP].map((x) =>
85
- toTypeNames(x)
86
- ).join(' ')}${
87
- getSuffix(x[STATS][SIGNATURE]) === PREDICATE_SUFFIX
88
- ? ' ' + toTypeNames(PREDICATE)
89
- : ''
90
- }`
91
- )
92
- .join(' ')}) -> ${toTypeNames(
93
- stats[RETURNS][1] ?? stats[RETURNS][0]
94
- )}`
72
+ ? `${name} (${
73
+ stats[ARGS_COUNT] === VARIADIC
74
+ ? '... ' + STATIC_TYPES.UNKNOWN
75
+ : (stats[ARGUMENTS] ?? [])
76
+ .map(
77
+ (x) =>
78
+ `${x[STATS][SIGNATURE]} ${x[STATS][TYPE_PROP].map((x) =>
79
+ toTypeNames(x)
80
+ ).join(' ')}${
81
+ getSuffix(x[STATS][SIGNATURE]) === PREDICATE_SUFFIX
82
+ ? ' ' + toTypeNames(PREDICATE)
83
+ : ''
84
+ }`
85
+ )
86
+ .join(' ')
87
+ }) -> ${toTypeNames(stats[RETURNS][1] ?? stats[RETURNS][0])}`
95
88
  : `${name} ${stats[TYPE_PROP].map(toTypeNames).join(' ')}`
96
89
  : name
97
90
  }
@@ -120,1121 +113,7 @@ const withScope = (name, scope) => {
120
113
  .join(' ')} ${name}`
121
114
  }
122
115
  export const typeCheck = (ast) => {
123
- const root = {
124
- [toTypeNames(APPLY)]: {
125
- [STATS]: {
126
- [TYPE_PROP]: [APPLY],
127
- [SIGNATURE]: toTypeNames(APPLY),
128
- retried: RETRY_COUNT,
129
- [ARGS_COUNT]: 1,
130
- [ARGUMENTS]: [
131
- {
132
- [STATS]: {
133
- retried: RETRY_COUNT,
134
- [SIGNATURE]: PLACEHOLDER,
135
- [TYPE_PROP]: [UNKNOWN],
136
- [RETURNS]: [UNKNOWN],
137
- [ARGS_COUNT]: [],
138
- [ARGUMENTS]: [],
139
- [ARGS_COUNT]: 0
140
- }
141
- }
142
- ],
143
- [RETURNS]: [APPLY]
144
- }
145
- },
146
- [toTypeNames(ATOM)]: {
147
- [STATS]: {
148
- [TYPE_PROP]: [APPLY],
149
- [SIGNATURE]: toTypeNames(ATOM),
150
- retried: RETRY_COUNT,
151
- [ARGS_COUNT]: 1,
152
- [ARGUMENTS]: [
153
- {
154
- [STATS]: {
155
- retried: RETRY_COUNT,
156
- [SIGNATURE]: PLACEHOLDER,
157
- [TYPE_PROP]: [UNKNOWN],
158
- [RETURNS]: [UNKNOWN],
159
- [ARGS_COUNT]: [],
160
- [ARGUMENTS]: [],
161
- [ARGS_COUNT]: 0
162
- }
163
- }
164
- ],
165
- [RETURNS]: [ATOM]
166
- }
167
- },
168
- [toTypeNames(PREDICATE)]: {
169
- [STATS]: {
170
- [TYPE_PROP]: [APPLY, PREDICATE],
171
- [SIGNATURE]: toTypeNames(PREDICATE),
172
- retried: RETRY_COUNT,
173
- [ARGS_COUNT]: 1,
174
- [ARGUMENTS]: [
175
- {
176
- [STATS]: {
177
- retried: RETRY_COUNT,
178
- [SIGNATURE]: PLACEHOLDER,
179
- [TYPE_PROP]: [UNKNOWN],
180
- [RETURNS]: [UNKNOWN],
181
- [ARGS_COUNT]: [],
182
- [ARGUMENTS]: [],
183
- [ARGS_COUNT]: 0
184
- }
185
- }
186
- ],
187
- [RETURNS]: [ATOM, PREDICATE]
188
- }
189
- },
190
- [toTypeNames(COLLECTION)]: {
191
- [STATS]: {
192
- [TYPE_PROP]: [APPLY],
193
- [SIGNATURE]: toTypeNames(COLLECTION),
194
- retried: RETRY_COUNT,
195
- [ARGS_COUNT]: 1,
196
- [ARGUMENTS]: [
197
- {
198
- [STATS]: {
199
- retried: RETRY_COUNT,
200
- [SIGNATURE]: PLACEHOLDER,
201
- [TYPE_PROP]: [UNKNOWN],
202
- [RETURNS]: [UNKNOWN],
203
- [ARGS_COUNT]: [],
204
- [ARGUMENTS]: [],
205
- [ARGS_COUNT]: 0
206
- }
207
- }
208
- ],
209
- [RETURNS]: [COLLECTION]
210
- }
211
- },
212
- [toTypeNames(UNKNOWN)]: {
213
- [STATS]: {
214
- [TYPE_PROP]: [APPLY],
215
- [SIGNATURE]: toTypeNames(UNKNOWN),
216
- retried: RETRY_COUNT,
217
- [ARGS_COUNT]: 1,
218
- [ARGUMENTS]: [
219
- {
220
- [STATS]: {
221
- retried: RETRY_COUNT,
222
- [SIGNATURE]: PLACEHOLDER,
223
- [TYPE_PROP]: [UNKNOWN],
224
- [RETURNS]: [UNKNOWN],
225
- [ARGS_COUNT]: [],
226
- [ARGUMENTS]: [],
227
- [ARGS_COUNT]: 0
228
- }
229
- }
230
- ],
231
- [RETURNS]: [UNKNOWN]
232
- }
233
- },
234
- [DEBUG.LOG]: {
235
- [STATS]: {
236
- [TYPE_PROP]: [APPLY],
237
- [SIGNATURE]: DEBUG.LOG,
238
- retried: RETRY_COUNT,
239
- [ARGUMENTS]: [
240
- {
241
- [STATS]: {
242
- retried: 0,
243
- [SIGNATURE]: PLACEHOLDER,
244
- [TYPE_PROP]: [UNKNOWN],
245
- [RETURNS]: [UNKNOWN],
246
- [ARGS_COUNT]: [],
247
- [ARGUMENTS]: [],
248
- [ARGS_COUNT]: 0
249
- }
250
- },
251
- {
252
- [STATS]: {
253
- retried: 0,
254
- [SIGNATURE]: PLACEHOLDER,
255
- [TYPE_PROP]: [COLLECTION],
256
- [RETURNS]: [COLLECTION],
257
- [ARGS_COUNT]: [],
258
- [ARGUMENTS]: [],
259
- [ARGS_COUNT]: 0
260
- }
261
- }
262
- ],
263
- [ARGS_COUNT]: 2,
264
- [RETURNS]: [UNKNOWN]
265
- }
266
- },
267
- [DEBUG.STRING]: {
268
- [STATS]: {
269
- [TYPE_PROP]: [APPLY],
270
- [SIGNATURE]: DEBUG.STRING,
271
- retried: RETRY_COUNT,
272
- [ARGS_COUNT]: 1,
273
- [ARGUMENTS]: [
274
- {
275
- [STATS]: {
276
- retried: 0,
277
- [SIGNATURE]: PLACEHOLDER,
278
- [TYPE_PROP]: [COLLECTION],
279
- [RETURNS]: [COLLECTION],
280
- [ARGS_COUNT]: [],
281
- [ARGUMENTS]: [],
282
- [ARGS_COUNT]: 0
283
- }
284
- }
285
- ],
286
- [RETURNS]: [COLLECTION]
287
- }
288
- },
289
- [DEBUG.ASSERT]: {
290
- [STATS]: {
291
- [TYPE_PROP]: [APPLY],
292
- [SIGNATURE]: DEBUG.ASSERT,
293
- retried: RETRY_COUNT,
294
- [ARGS_COUNT]: VARIADIC,
295
- [RETURNS]: [UNKNOWN]
296
- }
297
- },
298
- [DEBUG.SIGNATURE]: {
299
- [STATS]: {
300
- [TYPE_PROP]: [APPLY],
301
- [SIGNATURE]: DEBUG.SIGNATURE,
302
- retried: RETRY_COUNT,
303
- [ARGS_COUNT]: VARIADIC,
304
- [RETURNS]: [UNKNOWN]
305
- }
306
- },
307
- [DEBUG.TYPE_SIGNATURE]: {
308
- [STATS]: {
309
- [TYPE_PROP]: [APPLY],
310
- [SIGNATURE]: DEBUG.TYPE_SIGNATURE,
311
- retried: RETRY_COUNT,
312
- [ARGS_COUNT]: VARIADIC,
313
- [RETURNS]: [UNKNOWN]
314
- }
315
- },
316
- [DEBUG.LIST_THEMES]: {
317
- [STATS]: {
318
- [TYPE_PROP]: [APPLY],
319
- [SIGNATURE]: DEBUG.LIST_THEMES,
320
- retried: RETRY_COUNT,
321
- [ARGS_COUNT]: VARIADIC,
322
- [RETURNS]: [UNKNOWN]
323
- }
324
- },
325
- [DEBUG.SET_THEME]: {
326
- [STATS]: {
327
- [TYPE_PROP]: [APPLY],
328
- [SIGNATURE]: DEBUG.SET_THEME,
329
- retried: RETRY_COUNT,
330
- [ARGS_COUNT]: VARIADIC,
331
- [RETURNS]: [UNKNOWN]
332
- }
333
- },
334
- [KEYWORDS.BLOCK]: {
335
- [STATS]: {
336
- [TYPE_PROP]: [APPLY],
337
- [SIGNATURE]: KEYWORDS.BLOCK,
338
- retried: RETRY_COUNT,
339
- [ARGS_COUNT]: VARIADIC,
340
- [RETURNS]: [UNKNOWN]
341
- }
342
- },
343
- [KEYWORDS.ANONYMOUS_FUNCTION]: {
344
- [STATS]: {
345
- [TYPE_PROP]: [APPLY],
346
- [SIGNATURE]: KEYWORDS.ANONYMOUS_FUNCTION,
347
- retried: RETRY_COUNT,
348
- [ARGS_COUNT]: VARIADIC,
349
- [RETURNS]: [APPLY]
350
- }
351
- },
352
- [KEYWORDS.CALL_FUNCTION]: {
353
- [STATS]: {
354
- [TYPE_PROP]: [APPLY],
355
- [SIGNATURE]: KEYWORDS.CALL_FUNCTION,
356
- retried: RETRY_COUNT,
357
- [ARGS_COUNT]: VARIADIC,
358
- [RETURNS]: [UNKNOWN]
359
- }
360
- },
361
- [KEYWORDS.CREATE_ARRAY]: {
362
- [STATS]: {
363
- [TYPE_PROP]: [APPLY],
364
- [SIGNATURE]: KEYWORDS.CREATE_ARRAY,
365
- retried: RETRY_COUNT,
366
- [ARGS_COUNT]: VARIADIC,
367
- [RETURNS]: [COLLECTION]
368
- }
369
- },
370
- [KEYWORDS.LOOP]: {
371
- [STATS]: {
372
- [TYPE_PROP]: [APPLY],
373
- [SIGNATURE]: KEYWORDS.LOOP,
374
- retried: RETRY_COUNT,
375
- [ARGS_COUNT]: 2,
376
- [ARGUMENTS]: [
377
- {
378
- [STATS]: {
379
- retried: 0,
380
- [SIGNATURE]: PLACEHOLDER,
381
- [TYPE_PROP]: [ATOM, PREDICATE],
382
- [RETURNS]: [ATOM, PREDICATE],
383
- [ARGS_COUNT]: [],
384
- [ARGUMENTS]: [],
385
- [ARGS_COUNT]: 0
386
- }
387
- },
388
- {
389
- [STATS]: {
390
- retried: 0,
391
- [SIGNATURE]: PLACEHOLDER,
392
- [TYPE_PROP]: [UNKNOWN],
393
- [RETURNS]: [UNKNOWN],
394
- [ARGS_COUNT]: [],
395
- [ARGUMENTS]: [],
396
- [ARGS_COUNT]: 0
397
- }
398
- }
399
- ],
400
- [RETURNS]: [ATOM]
401
- }
402
- },
403
- [KEYWORDS.ADDITION]: {
404
- [STATS]: {
405
- [TYPE_PROP]: [APPLY],
406
- [SIGNATURE]: KEYWORDS.ADDITION,
407
- retried: RETRY_COUNT,
408
- [ARGS_COUNT]: 2,
409
- [ARGUMENTS]: [
410
- {
411
- [STATS]: {
412
- retried: 0,
413
- [SIGNATURE]: PLACEHOLDER,
414
- [TYPE_PROP]: [ATOM],
415
- [RETURNS]: [ATOM],
416
- [ARGS_COUNT]: [],
417
- [ARGUMENTS]: [],
418
- [ARGS_COUNT]: 0
419
- }
420
- },
421
- {
422
- [STATS]: {
423
- retried: 0,
424
- [SIGNATURE]: PLACEHOLDER,
425
- [TYPE_PROP]: [ATOM],
426
- [RETURNS]: [ATOM],
427
- [ARGS_COUNT]: [],
428
- [ARGUMENTS]: [],
429
- [ARGS_COUNT]: 0
430
- }
431
- }
432
- ],
433
- [RETURNS]: [ATOM]
434
- }
435
- },
436
- [KEYWORDS.MULTIPLICATION]: {
437
- [STATS]: {
438
- [TYPE_PROP]: [APPLY],
439
- [SIGNATURE]: KEYWORDS.MULTIPLICATION,
440
- retried: RETRY_COUNT,
441
- [ARGS_COUNT]: 2,
442
- [ARGUMENTS]: [
443
- {
444
- [STATS]: {
445
- retried: 0,
446
- [SIGNATURE]: PLACEHOLDER,
447
- [TYPE_PROP]: [ATOM],
448
- [RETURNS]: [ATOM],
449
- [ARGS_COUNT]: [],
450
- [ARGUMENTS]: [],
451
- [ARGS_COUNT]: 0
452
- }
453
- },
454
- {
455
- [STATS]: {
456
- retried: 0,
457
- [SIGNATURE]: PLACEHOLDER,
458
- [TYPE_PROP]: [ATOM],
459
- [RETURNS]: [ATOM],
460
- [ARGS_COUNT]: [],
461
- [ARGUMENTS]: [],
462
- [ARGS_COUNT]: 0
463
- }
464
- }
465
- ],
466
- [RETURNS]: [ATOM]
467
- }
468
- },
469
- [KEYWORDS.SUBTRACTION]: {
470
- [STATS]: {
471
- [TYPE_PROP]: [APPLY],
472
- [SIGNATURE]: KEYWORDS.SUBTRACTION,
473
- retried: RETRY_COUNT,
474
- [ARGS_COUNT]: 2,
475
- [ARGUMENTS]: [
476
- {
477
- [STATS]: {
478
- retried: 0,
479
- [SIGNATURE]: PLACEHOLDER,
480
- [TYPE_PROP]: [ATOM],
481
- [RETURNS]: [ATOM],
482
- [ARGS_COUNT]: [],
483
- [ARGUMENTS]: [],
484
- [ARGS_COUNT]: 0
485
- }
486
- },
487
- {
488
- [STATS]: {
489
- retried: 0,
490
- [SIGNATURE]: PLACEHOLDER,
491
- [TYPE_PROP]: [ATOM],
492
- [RETURNS]: [ATOM],
493
- [ARGS_COUNT]: [],
494
- [ARGUMENTS]: [],
495
- [ARGS_COUNT]: 0
496
- }
497
- }
498
- ],
499
- [RETURNS]: [ATOM]
500
- }
501
- },
502
- [KEYWORDS.DIVISION]: {
503
- [STATS]: {
504
- [TYPE_PROP]: [APPLY],
505
- [SIGNATURE]: KEYWORDS.DIVISION,
506
- retried: RETRY_COUNT,
507
- [ARGS_COUNT]: 2,
508
- [ARGUMENTS]: [
509
- {
510
- [STATS]: {
511
- retried: 0,
512
- [SIGNATURE]: PLACEHOLDER,
513
- [TYPE_PROP]: [ATOM],
514
- [RETURNS]: [ATOM],
515
- [ARGS_COUNT]: [],
516
- [ARGUMENTS]: [],
517
- [ARGS_COUNT]: 0
518
- }
519
- },
520
- {
521
- [STATS]: {
522
- retried: 0,
523
- [SIGNATURE]: PLACEHOLDER,
524
- [TYPE_PROP]: [ATOM],
525
- [RETURNS]: [ATOM],
526
- [ARGS_COUNT]: [],
527
- [ARGUMENTS]: [],
528
- [ARGS_COUNT]: 0
529
- }
530
- }
531
- ],
532
- [RETURNS]: [ATOM]
533
- }
534
- },
535
- [KEYWORDS.REMAINDER_OF_DIVISION]: {
536
- [STATS]: {
537
- [TYPE_PROP]: [APPLY],
538
- retried: RETRY_COUNT,
539
- [ARGS_COUNT]: 2,
540
- [ARGUMENTS]: [
541
- {
542
- [STATS]: {
543
- retried: 0,
544
- [SIGNATURE]: PLACEHOLDER,
545
- [TYPE_PROP]: [ATOM],
546
- [RETURNS]: [ATOM],
547
- [ARGS_COUNT]: [],
548
- [ARGUMENTS]: [],
549
- [ARGS_COUNT]: 0
550
- }
551
- },
552
- {
553
- [STATS]: {
554
- retried: 0,
555
- [SIGNATURE]: PLACEHOLDER,
556
- [TYPE_PROP]: [ATOM],
557
- [RETURNS]: [ATOM],
558
- [ARGS_COUNT]: [],
559
- [ARGUMENTS]: [],
560
- [ARGS_COUNT]: 0
561
- }
562
- }
563
- ],
564
- [RETURNS]: [ATOM]
565
- }
566
- },
567
- [KEYWORDS.BITWISE_AND]: {
568
- [STATS]: {
569
- [TYPE_PROP]: [APPLY],
570
- [SIGNATURE]: KEYWORDS.BITWISE_AND,
571
- retried: RETRY_COUNT,
572
- [ARGS_COUNT]: 2,
573
- [ARGUMENTS]: [
574
- {
575
- [STATS]: {
576
- retried: 0,
577
- [SIGNATURE]: PLACEHOLDER,
578
- [TYPE_PROP]: [ATOM],
579
- [RETURNS]: [ATOM],
580
- [ARGS_COUNT]: [],
581
- [ARGUMENTS]: [],
582
- [ARGS_COUNT]: 0
583
- }
584
- },
585
- {
586
- [STATS]: {
587
- retried: 0,
588
- [SIGNATURE]: PLACEHOLDER,
589
- [TYPE_PROP]: [ATOM],
590
- [RETURNS]: [ATOM],
591
- [ARGS_COUNT]: [],
592
- [ARGUMENTS]: [],
593
- [ARGS_COUNT]: 0
594
- }
595
- }
596
- ],
597
- [RETURNS]: [ATOM]
598
- }
599
- },
600
- [KEYWORDS.BITWISE_NOT]: {
601
- [STATS]: {
602
- [TYPE_PROP]: [APPLY],
603
- [SIGNATURE]: KEYWORDS.BITWISE_NOT,
604
- retried: RETRY_COUNT,
605
- [ARGS_COUNT]: 1,
606
- [ARGUMENTS]: [
607
- {
608
- [STATS]: {
609
- retried: 0,
610
- [SIGNATURE]: PLACEHOLDER,
611
- [TYPE_PROP]: [ATOM],
612
- [RETURNS]: [ATOM],
613
- [ARGS_COUNT]: [],
614
- [ARGUMENTS]: [],
615
- [ARGS_COUNT]: 0
616
- }
617
- }
618
- ],
619
- [RETURNS]: [ATOM]
620
- }
621
- },
622
- [KEYWORDS.BITWISE_OR]: {
623
- [STATS]: {
624
- [TYPE_PROP]: [APPLY],
625
- [SIGNATURE]: KEYWORDS.BITWISE_OR,
626
- retried: RETRY_COUNT,
627
- [ARGS_COUNT]: 2,
628
- [ARGUMENTS]: [
629
- {
630
- [STATS]: {
631
- retried: 0,
632
- [SIGNATURE]: PLACEHOLDER,
633
- [TYPE_PROP]: [ATOM],
634
- [RETURNS]: [ATOM],
635
- [ARGS_COUNT]: [],
636
- [ARGUMENTS]: [],
637
- [ARGS_COUNT]: 0
638
- }
639
- },
640
- {
641
- [STATS]: {
642
- retried: 0,
643
- [SIGNATURE]: PLACEHOLDER,
644
- [TYPE_PROP]: [ATOM],
645
- [RETURNS]: [ATOM],
646
- [ARGS_COUNT]: [],
647
- [ARGUMENTS]: [],
648
- [ARGS_COUNT]: 0
649
- }
650
- }
651
- ],
652
- [RETURNS]: [ATOM]
653
- }
654
- },
655
- [KEYWORDS.BITWISE_XOR]: {
656
- [STATS]: {
657
- [TYPE_PROP]: [APPLY],
658
- [SIGNATURE]: KEYWORDS.BITWISE_XOR,
659
- retried: RETRY_COUNT,
660
- [ARGS_COUNT]: 2,
661
- [ARGUMENTS]: [
662
- {
663
- [STATS]: {
664
- retried: 0,
665
- [SIGNATURE]: PLACEHOLDER,
666
- [TYPE_PROP]: [ATOM],
667
- [RETURNS]: [ATOM],
668
- [ARGS_COUNT]: [],
669
- [ARGUMENTS]: [],
670
- [ARGS_COUNT]: 0
671
- }
672
- },
673
- {
674
- [STATS]: {
675
- retried: 0,
676
- [SIGNATURE]: PLACEHOLDER,
677
- [TYPE_PROP]: [ATOM],
678
- [RETURNS]: [ATOM],
679
- [ARGS_COUNT]: [],
680
- [ARGUMENTS]: [],
681
- [ARGS_COUNT]: 0
682
- }
683
- }
684
- ],
685
- [RETURNS]: [ATOM]
686
- }
687
- },
688
- [KEYWORDS.BITWISE_LEFT_SHIFT]: {
689
- [STATS]: {
690
- [TYPE_PROP]: [APPLY],
691
- [SIGNATURE]: KEYWORDS.BITWISE_LEFT_SHIFT,
692
- retried: RETRY_COUNT,
693
- [ARGS_COUNT]: 2,
694
- [ARGUMENTS]: [
695
- {
696
- [STATS]: {
697
- retried: 0,
698
- [SIGNATURE]: PLACEHOLDER,
699
- [TYPE_PROP]: [ATOM],
700
- [RETURNS]: [ATOM],
701
- [ARGS_COUNT]: [],
702
- [ARGUMENTS]: [],
703
- [ARGS_COUNT]: 0
704
- }
705
- },
706
- {
707
- [STATS]: {
708
- retried: 0,
709
- [SIGNATURE]: PLACEHOLDER,
710
- [TYPE_PROP]: [ATOM],
711
- [RETURNS]: [ATOM],
712
- [ARGS_COUNT]: [],
713
- [ARGUMENTS]: [],
714
- [ARGS_COUNT]: 0
715
- }
716
- }
717
- ],
718
- [RETURNS]: [ATOM]
719
- }
720
- },
721
- [KEYWORDS.BITWISE_RIGHT_SHIFT]: {
722
- [STATS]: {
723
- [TYPE_PROP]: [APPLY],
724
- [SIGNATURE]: KEYWORDS.BITWISE_RIGHT_SHIFT,
725
- retried: RETRY_COUNT,
726
- [ARGS_COUNT]: 2,
727
- [ARGUMENTS]: [
728
- {
729
- [STATS]: {
730
- retried: 0,
731
- [SIGNATURE]: PLACEHOLDER,
732
- [TYPE_PROP]: [ATOM],
733
- [RETURNS]: [ATOM],
734
- [ARGS_COUNT]: [],
735
- [ARGUMENTS]: [],
736
- [ARGS_COUNT]: 0
737
- }
738
- },
739
- {
740
- [STATS]: {
741
- retried: 0,
742
- [SIGNATURE]: PLACEHOLDER,
743
- [TYPE_PROP]: [ATOM],
744
- [RETURNS]: [ATOM],
745
- [ARGS_COUNT]: [],
746
- [ARGUMENTS]: [],
747
- [ARGS_COUNT]: 0
748
- }
749
- }
750
- ],
751
- [RETURNS]: [ATOM]
752
- }
753
- },
754
- [KEYWORDS.GET_ARRAY]: {
755
- [STATS]: {
756
- [TYPE_PROP]: [APPLY],
757
- [SIGNATURE]: KEYWORDS.GET_ARRAY,
758
- retried: RETRY_COUNT,
759
- [ARGS_COUNT]: 2,
760
- [ARGUMENTS]: [
761
- {
762
- [STATS]: {
763
- retried: 0,
764
- [SIGNATURE]: PLACEHOLDER,
765
- [TYPE_PROP]: [COLLECTION],
766
- [RETURNS]: [COLLECTION],
767
- [ARGS_COUNT]: [],
768
- [ARGUMENTS]: [],
769
- [ARGS_COUNT]: 0
770
- }
771
- },
772
- {
773
- [STATS]: {
774
- retried: 0,
775
- [SIGNATURE]: PLACEHOLDER,
776
- [TYPE_PROP]: [ATOM],
777
- [RETURNS]: [ATOM],
778
- [ARGS_COUNT]: [],
779
- [ARGUMENTS]: [],
780
- [ARGS_COUNT]: 0
781
- }
782
- }
783
- ],
784
- [RETURNS]: [UNKNOWN]
785
- }
786
- },
787
- [KEYWORDS.SET_ARRAY]: {
788
- [STATS]: {
789
- [TYPE_PROP]: [APPLY],
790
- retried: RETRY_COUNT,
791
- [ARGS_COUNT]: 3,
792
- [ARGUMENTS]: [
793
- {
794
- [STATS]: {
795
- retried: 0,
796
- [SIGNATURE]: PLACEHOLDER,
797
- [TYPE_PROP]: [COLLECTION],
798
- [RETURNS]: [COLLECTION],
799
- [ARGS_COUNT]: [],
800
- [ARGUMENTS]: [],
801
- [ARGS_COUNT]: 0
802
- }
803
- },
804
- {
805
- [STATS]: {
806
- retried: 0,
807
- [SIGNATURE]: PLACEHOLDER,
808
- [TYPE_PROP]: [ATOM],
809
- [RETURNS]: [ATOM],
810
- [ARGS_COUNT]: [],
811
- [ARGUMENTS]: [],
812
- [ARGS_COUNT]: 0
813
- }
814
- },
815
- {
816
- [STATS]: {
817
- retried: 0,
818
- [SIGNATURE]: PLACEHOLDER,
819
- [TYPE_PROP]: [UNKNOWN],
820
- [RETURNS]: [UNKNOWN],
821
- [ARGS_COUNT]: [],
822
- [ARGUMENTS]: [],
823
- [ARGS_COUNT]: 0
824
- }
825
- }
826
- ],
827
- [RETURNS]: [COLLECTION]
828
- }
829
- },
830
- [KEYWORDS.POP_ARRAY]: {
831
- [STATS]: {
832
- [TYPE_PROP]: [APPLY],
833
- [SIGNATURE]: KEYWORDS.POP_ARRAY,
834
- retried: RETRY_COUNT,
835
- [ARGS_COUNT]: 1,
836
- [ARGUMENTS]: [
837
- {
838
- [STATS]: {
839
- retried: 0,
840
- [SIGNATURE]: PLACEHOLDER,
841
- [TYPE_PROP]: [COLLECTION],
842
- [RETURNS]: [COLLECTION],
843
- [ARGS_COUNT]: [],
844
- [ARGUMENTS]: [],
845
- [ARGS_COUNT]: 0
846
- }
847
- }
848
- ],
849
- [RETURNS]: [COLLECTION]
850
- }
851
- },
852
- [KEYWORDS.ARRAY_LENGTH]: {
853
- [STATS]: {
854
- [TYPE_PROP]: [APPLY],
855
- [SIGNATURE]: KEYWORDS.ARRAY_LENGTH,
856
- retried: RETRY_COUNT,
857
- [ARGS_COUNT]: 1,
858
- [ARGUMENTS]: [
859
- {
860
- [STATS]: {
861
- retried: 0,
862
- [SIGNATURE]: PLACEHOLDER,
863
- [TYPE_PROP]: [COLLECTION],
864
- [RETURNS]: [COLLECTION],
865
- [ARGS_COUNT]: [],
866
- [ARGUMENTS]: [],
867
- [ARGS_COUNT]: 0
868
- }
869
- }
870
- ],
871
- [RETURNS]: [ATOM]
872
- }
873
- },
874
- [KEYWORDS.IF]: {
875
- [STATS]: {
876
- [TYPE_PROP]: [APPLY],
877
- [SIGNATURE]: KEYWORDS.IF,
878
- retried: RETRY_COUNT,
879
- [ARGS_COUNT]: 3,
880
- [ARGUMENTS]: [
881
- {
882
- [STATS]: {
883
- retried: 0,
884
- [SIGNATURE]: PLACEHOLDER,
885
- [TYPE_PROP]: [ATOM, PREDICATE],
886
- [RETURNS]: [ATOM, PREDICATE],
887
- [ARGS_COUNT]: [],
888
- [ARGUMENTS]: [],
889
- [ARGS_COUNT]: 0
890
- }
891
- },
892
- {
893
- [STATS]: {
894
- retried: 0,
895
- [SIGNATURE]: PLACEHOLDER,
896
- [TYPE_PROP]: [UNKNOWN],
897
- [RETURNS]: [UNKNOWN],
898
- [ARGS_COUNT]: [],
899
- [ARGUMENTS]: [],
900
- [ARGS_COUNT]: 0
901
- }
902
- },
903
- {
904
- [STATS]: {
905
- retried: 0,
906
- [SIGNATURE]: PLACEHOLDER,
907
- [TYPE_PROP]: [UNKNOWN],
908
- [RETURNS]: [UNKNOWN],
909
- [ARGS_COUNT]: [],
910
- [ARGUMENTS]: [],
911
- [ARGS_COUNT]: 0
912
- }
913
- }
914
- ],
915
- [RETURNS]: [UNKNOWN]
916
- }
917
- },
918
- [KEYWORDS.NOT]: {
919
- [STATS]: {
920
- [TYPE_PROP]: [APPLY, PREDICATE],
921
- [SIGNATURE]: KEYWORDS.NOT,
922
- retried: RETRY_COUNT,
923
- [ARGS_COUNT]: 1,
924
- [ARGUMENTS]: [
925
- {
926
- [STATS]: {
927
- retried: RETRY_COUNT,
928
- [SIGNATURE]: PLACEHOLDER,
929
- [TYPE_PROP]: [ATOM, PREDICATE],
930
- [RETURNS]: [ATOM, PREDICATE],
931
- [ARGS_COUNT]: [],
932
- [ARGUMENTS]: [],
933
- [ARGS_COUNT]: 0
934
- }
935
- }
936
- ],
937
- [RETURNS]: [ATOM, PREDICATE]
938
- }
939
- },
940
- [KEYWORDS.EQUAL]: {
941
- [STATS]: {
942
- [TYPE_PROP]: [APPLY, PREDICATE],
943
- [SIGNATURE]: KEYWORDS.EQUAL,
944
- retried: RETRY_COUNT,
945
- [ARGS_COUNT]: 2,
946
- [ARGUMENTS]: [
947
- {
948
- [STATS]: {
949
- retried: RETRY_COUNT,
950
- [SIGNATURE]: PLACEHOLDER,
951
- [TYPE_PROP]: [ATOM],
952
- [RETURNS]: [ATOM],
953
- [ARGS_COUNT]: [],
954
- [ARGUMENTS]: [],
955
- [ARGS_COUNT]: 0
956
- }
957
- },
958
- {
959
- [STATS]: {
960
- retried: RETRY_COUNT,
961
- [SIGNATURE]: PLACEHOLDER,
962
- [TYPE_PROP]: [ATOM],
963
- [RETURNS]: [ATOM],
964
- [ARGS_COUNT]: [],
965
- [ARGUMENTS]: [],
966
- [ARGS_COUNT]: 0
967
- }
968
- }
969
- ],
970
- [RETURNS]: [ATOM, PREDICATE]
971
- }
972
- },
973
- [KEYWORDS.LESS_THAN]: {
974
- [STATS]: {
975
- [TYPE_PROP]: [APPLY, PREDICATE],
976
- retried: RETRY_COUNT,
977
- [SIGNATURE]: KEYWORDS.LESS_THAN,
978
- [ARGS_COUNT]: 2,
979
- [ARGUMENTS]: [
980
- {
981
- [STATS]: {
982
- retried: RETRY_COUNT,
983
- [SIGNATURE]: PLACEHOLDER,
984
- [TYPE_PROP]: [ATOM],
985
- [RETURNS]: [ATOM],
986
- [ARGS_COUNT]: [],
987
- [ARGUMENTS]: [],
988
- [ARGS_COUNT]: 0
989
- }
990
- },
991
- {
992
- [STATS]: {
993
- retried: RETRY_COUNT,
994
- [SIGNATURE]: PLACEHOLDER,
995
- [TYPE_PROP]: [ATOM],
996
- [RETURNS]: [ATOM],
997
- [ARGS_COUNT]: [],
998
- [ARGUMENTS]: [],
999
- [ARGS_COUNT]: 0
1000
- }
1001
- }
1002
- ],
1003
- [RETURNS]: [ATOM, PREDICATE]
1004
- }
1005
- },
1006
- [KEYWORDS.GREATHER_THAN]: {
1007
- [STATS]: {
1008
- [TYPE_PROP]: [APPLY, PREDICATE],
1009
- [SIGNATURE]: KEYWORDS.GREATHER_THAN,
1010
- retried: RETRY_COUNT,
1011
- [ARGS_COUNT]: 2,
1012
- [ARGUMENTS]: [
1013
- {
1014
- [STATS]: {
1015
- retried: RETRY_COUNT,
1016
- [SIGNATURE]: PLACEHOLDER,
1017
- [TYPE_PROP]: [ATOM],
1018
- [RETURNS]: [ATOM],
1019
- [ARGS_COUNT]: [],
1020
- [ARGUMENTS]: [],
1021
- [ARGS_COUNT]: 0
1022
- }
1023
- },
1024
- {
1025
- [STATS]: {
1026
- retried: RETRY_COUNT,
1027
- [SIGNATURE]: PLACEHOLDER,
1028
- [TYPE_PROP]: [ATOM],
1029
- [RETURNS]: [ATOM],
1030
- [ARGS_COUNT]: [],
1031
- [ARGUMENTS]: [],
1032
- [ARGS_COUNT]: 0
1033
- }
1034
- }
1035
- ],
1036
- [RETURNS]: [ATOM, PREDICATE]
1037
- }
1038
- },
1039
- [KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
1040
- [STATS]: {
1041
- [TYPE_PROP]: [APPLY, PREDICATE],
1042
- [SIGNATURE]: KEYWORDS.GREATHER_THAN_OR_EQUAL,
1043
- retried: RETRY_COUNT,
1044
- [ARGS_COUNT]: 2,
1045
- [ARGUMENTS]: [
1046
- {
1047
- [STATS]: {
1048
- retried: RETRY_COUNT,
1049
- [SIGNATURE]: PLACEHOLDER,
1050
- [TYPE_PROP]: [ATOM],
1051
- [RETURNS]: [ATOM],
1052
- [ARGS_COUNT]: [],
1053
- [ARGUMENTS]: [],
1054
- [ARGS_COUNT]: 0
1055
- }
1056
- },
1057
- {
1058
- [STATS]: {
1059
- retried: RETRY_COUNT,
1060
- [SIGNATURE]: PLACEHOLDER,
1061
- [TYPE_PROP]: [ATOM],
1062
- [RETURNS]: [ATOM],
1063
- [ARGS_COUNT]: [],
1064
- [ARGUMENTS]: [],
1065
- [ARGS_COUNT]: 0
1066
- }
1067
- }
1068
- ],
1069
- [RETURNS]: [ATOM, PREDICATE]
1070
- }
1071
- },
1072
- [KEYWORDS.LESS_THAN_OR_EQUAL]: {
1073
- [STATS]: {
1074
- [TYPE_PROP]: [APPLY, PREDICATE],
1075
- [SIGNATURE]: KEYWORDS.LESS_THAN_OR_EQUAL,
1076
- retried: RETRY_COUNT,
1077
- [ARGS_COUNT]: 2,
1078
- [ARGUMENTS]: [
1079
- {
1080
- [STATS]: {
1081
- retried: RETRY_COUNT,
1082
- [SIGNATURE]: PLACEHOLDER,
1083
- [TYPE_PROP]: [ATOM],
1084
- [RETURNS]: [ATOM],
1085
- [ARGS_COUNT]: [],
1086
- [ARGUMENTS]: [],
1087
- [ARGS_COUNT]: 0
1088
- }
1089
- },
1090
- {
1091
- [STATS]: {
1092
- retried: RETRY_COUNT,
1093
- [SIGNATURE]: PLACEHOLDER,
1094
- [TYPE_PROP]: [ATOM],
1095
- [RETURNS]: [ATOM],
1096
- [ARGS_COUNT]: [],
1097
- [ARGUMENTS]: [],
1098
- [ARGS_COUNT]: 0
1099
- }
1100
- }
1101
- ],
1102
- [RETURNS]: [ATOM, PREDICATE]
1103
- }
1104
- },
1105
- [KEYWORDS.AND]: {
1106
- [STATS]: {
1107
- [TYPE_PROP]: [APPLY, PREDICATE],
1108
- [SIGNATURE]: KEYWORDS.AND,
1109
- retried: RETRY_COUNT,
1110
- [ARGS_COUNT]: 2,
1111
- [ARGUMENTS]: [
1112
- {
1113
- [STATS]: {
1114
- retried: RETRY_COUNT,
1115
- [SIGNATURE]: PLACEHOLDER,
1116
- [TYPE_PROP]: [ATOM, PREDICATE],
1117
- [RETURNS]: [ATOM, PREDICATE],
1118
- [ARGS_COUNT]: [],
1119
- [ARGUMENTS]: [],
1120
- [ARGS_COUNT]: 0
1121
- }
1122
- },
1123
- {
1124
- [STATS]: {
1125
- retried: RETRY_COUNT,
1126
- [SIGNATURE]: PLACEHOLDER,
1127
- [TYPE_PROP]: [ATOM, PREDICATE],
1128
- [RETURNS]: [ATOM, PREDICATE],
1129
- [ARGS_COUNT]: [],
1130
- [ARGUMENTS]: [],
1131
- [ARGS_COUNT]: 0
1132
- }
1133
- }
1134
- ],
1135
- [RETURNS]: [ATOM, PREDICATE]
1136
- }
1137
- },
1138
- [KEYWORDS.OR]: {
1139
- [STATS]: {
1140
- [TYPE_PROP]: [APPLY, PREDICATE],
1141
- [SIGNATURE]: KEYWORDS.OR,
1142
- retried: RETRY_COUNT,
1143
- [ARGS_COUNT]: 2,
1144
- [ARGUMENTS]: [
1145
- {
1146
- [STATS]: {
1147
- retried: RETRY_COUNT,
1148
- [SIGNATURE]: PLACEHOLDER,
1149
- [TYPE_PROP]: [ATOM, PREDICATE],
1150
- [RETURNS]: [ATOM, PREDICATE],
1151
- [ARGS_COUNT]: [],
1152
- [ARGUMENTS]: [],
1153
- [ARGS_COUNT]: 0
1154
- }
1155
- },
1156
- {
1157
- [STATS]: {
1158
- retried: RETRY_COUNT,
1159
- [SIGNATURE]: PLACEHOLDER,
1160
- [TYPE_PROP]: [ATOM, PREDICATE],
1161
- [RETURNS]: [ATOM, PREDICATE],
1162
- [ARGS_COUNT]: [],
1163
- [ARGUMENTS]: [],
1164
- [ARGS_COUNT]: 0
1165
- }
1166
- }
1167
- ],
1168
- [RETURNS]: [ATOM, PREDICATE]
1169
- }
1170
- },
1171
- [KEYWORDS.IS_ATOM]: {
1172
- [STATS]: {
1173
- [TYPE_PROP]: [APPLY, PREDICATE],
1174
- [SIGNATURE]: KEYWORDS.IS_ATOM,
1175
- retried: RETRY_COUNT,
1176
- [ARGS_COUNT]: 1,
1177
- [ARGUMENTS]: [
1178
- {
1179
- [STATS]: {
1180
- retried: RETRY_COUNT,
1181
- [SIGNATURE]: PLACEHOLDER,
1182
- [TYPE_PROP]: [UNKNOWN],
1183
- [RETURNS]: [UNKNOWN],
1184
- [ARGS_COUNT]: [],
1185
- [ARGUMENTS]: [],
1186
- [ARGS_COUNT]: 0
1187
- }
1188
- }
1189
- ],
1190
- [RETURNS]: [ATOM, PREDICATE]
1191
- }
1192
- },
1193
- [KEYWORDS.IS_LAMBDA]: {
1194
- [STATS]: {
1195
- [TYPE_PROP]: [APPLY, PREDICATE],
1196
- [SIGNATURE]: KEYWORDS.IS_LAMBDA,
1197
- retried: RETRY_COUNT,
1198
- [ARGS_COUNT]: 1,
1199
- [ARGUMENTS]: [
1200
- {
1201
- [STATS]: {
1202
- retried: RETRY_COUNT,
1203
- [SIGNATURE]: PLACEHOLDER,
1204
- [TYPE_PROP]: [UNKNOWN],
1205
- [RETURNS]: [UNKNOWN],
1206
- [ARGS_COUNT]: [],
1207
- [ARGUMENTS]: [],
1208
- [ARGS_COUNT]: 0
1209
- }
1210
- }
1211
- ],
1212
- [RETURNS]: [ATOM, PREDICATE]
1213
- }
1214
- },
1215
- [KEYWORDS.ERROR]: {
1216
- [STATS]: {
1217
- [TYPE_PROP]: [APPLY],
1218
- [SIGNATURE]: KEYWORDS.ERROR,
1219
- retried: RETRY_COUNT,
1220
- [ARGS_COUNT]: 1,
1221
- [ARGUMENTS]: [
1222
- {
1223
- [STATS]: {
1224
- retried: RETRY_COUNT,
1225
- [SIGNATURE]: PLACEHOLDER,
1226
- [TYPE_PROP]: [COLLECTION],
1227
- [RETURNS]: [COLLECTION],
1228
- [ARGS_COUNT]: [],
1229
- [ARGUMENTS]: [],
1230
- [ARGS_COUNT]: 0
1231
- }
1232
- }
1233
- ],
1234
- [RETURNS]: [UNKNOWN]
1235
- }
1236
- }
1237
- }
116
+ const root = structuredClone(SPECIAL_FORM_TYPES)
1238
117
  const errorStack = new Set()
1239
118
  const warningStack = new Set()
1240
119
  const Types = new Map()
@@ -1246,46 +125,49 @@ export const typeCheck = (ast) => {
1246
125
  `(lambda) invocation with missing (Abstraction) name () Provide an (Abstraction) name as the (1) argument.`
1247
126
  )
1248
127
  }
128
+ const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
1249
129
  switch (first[TYPE]) {
1250
130
  case WORD:
1251
131
  {
1252
- stack.push(() => {
1253
- if (env[first[VALUE]] === undefined) {
1254
- errorStack.add(
1255
- `Trying to access undefined variable ${first[VALUE]} (check #11)`
1256
- )
1257
- } else {
1258
- const T = env[first[VALUE]][STATS]
1259
- const isKnown = T[TYPE_PROP][0] !== UNKNOWN
1260
- switch (first[VALUE]) {
1261
- case 'xs':
1262
- case 'arr':
1263
- case 'matrix':
1264
- case 'table':
1265
- if (isKnown && T[TYPE_PROP][0] !== COLLECTION) {
1266
- warningStack.add(
1267
- `A variable named ${first[VALUE]} must be of type (${
1268
- STATIC_TYPES.COLLECTION
1269
- }) but got type (${toTypeNames(
1270
- T[TYPE_PROP][0]
1271
- )}) (check #32)`
1272
- )
1273
- }
1274
- //else T[TYPE_PROP] = [COLLECTION]
1275
- break
1276
- default:
1277
- {
1278
- const isPredicate =
1279
- getSuffix(first[VALUE]) === PREDICATE_SUFFIX
1280
- if (isPredicate) {
1281
- if (isKnown) T[TYPE_PROP][1] = PREDICATE
1282
- T[RETURNS] = [ATOM, PREDICATE]
132
+ if (!isSpecial)
133
+ stack.push(() => {
134
+ if (env[first[VALUE]] === undefined) {
135
+ errorStack.add(
136
+ `Trying to access undefined variable ${first[VALUE]} (check #11)`
137
+ )
138
+ } else {
139
+ const T = env[first[VALUE]][STATS]
140
+ const isKnown = T[TYPE_PROP][0] !== UNKNOWN
141
+ switch (first[VALUE]) {
142
+ case 'xs':
143
+ case 'arr':
144
+ case 'matrix':
145
+ case 'table':
146
+ if (isKnown && T[TYPE_PROP][0] !== COLLECTION) {
147
+ warningStack.add(
148
+ `A variable named ${first[VALUE]} must be of type (${
149
+ STATIC_TYPES.COLLECTION
150
+ }) but got type (${toTypeNames(
151
+ T[TYPE_PROP][0]
152
+ )}) (check #32)`
153
+ )
1283
154
  }
1284
- }
1285
- break
155
+ //else T[TYPE_PROP] = [COLLECTION]
156
+ break
157
+ default:
158
+ {
159
+ const isPredicate =
160
+ getSuffix(first[VALUE]) === PREDICATE_SUFFIX
161
+ if (isPredicate) {
162
+ // PRED ASSIGMENT
163
+ if (isKnown) T[TYPE_PROP][1] = PREDICATE
164
+ T[RETURNS] = [ATOM, PREDICATE]
165
+ }
166
+ }
167
+ break
168
+ }
1286
169
  }
1287
- }
1288
- })
170
+ })
1289
171
  }
1290
172
  break
1291
173
  case ATOM:
@@ -1306,6 +188,7 @@ export const typeCheck = (ast) => {
1306
188
  const name = rest[0][VALUE]
1307
189
  const resolveRetunType = (returns, rem, prop, isPredicate) => {
1308
190
  if (returns[TYPE] === ATOM) {
191
+ // ATOM ASSIGMENT
1309
192
  env[name][STATS][prop][0] = ATOM
1310
193
  env[name][STATS][RETURNS][0] = ATOM
1311
194
  } else {
@@ -1314,13 +197,14 @@ export const typeCheck = (ast) => {
1314
197
  {
1315
198
  const re = rem.slice(2)
1316
199
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
200
+ // ATOM ASSIGMENT
1317
201
  env[name][STATS][prop][0] = ATOM
1318
202
  env[name][STATS][RETURNS][0] = ATOM
1319
203
  if (
1320
204
  getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
1321
205
  getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
1322
206
  ) {
1323
- // env[name][STATS][TYPE_PROP][1] = PREDICATE
207
+ // ATOM ASSIGMENT PREDICATE ASSIGMENT
1324
208
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1325
209
  }
1326
210
  } else if (
@@ -1336,6 +220,7 @@ export const typeCheck = (ast) => {
1336
220
  ) {
1337
221
  switch (re[0][0][VALUE]) {
1338
222
  case KEYWORDS.ANONYMOUS_FUNCTION:
223
+ // FN UKNONW ASSIGMENT
1339
224
  env[name][STATS][RETURNS] = [UNKNOWN]
1340
225
  env[name][STATS][ARGS_COUNT] =
1341
226
  re[0].length - 2
@@ -1358,6 +243,7 @@ export const typeCheck = (ast) => {
1358
243
  ) {
1359
244
  switch (re[1][0][VALUE]) {
1360
245
  case KEYWORDS.ANONYMOUS_FUNCTION:
246
+ // FN ASSIGMENT
1361
247
  env[name][STATS][TYPE_PROP] = [APPLY]
1362
248
  env[name][STATS][RETURNS] = [UNKNOWN]
1363
249
  env[name][STATS][ARGS_COUNT] =
@@ -1366,11 +252,13 @@ export const typeCheck = (ast) => {
1366
252
  }
1367
253
  }
1368
254
  } else if (env[re[0][VALUE]]) {
255
+ // ASSIGMENT
1369
256
  env[name][STATS][prop] =
1370
257
  env[re[0][VALUE]][STATS][prop]
1371
258
  env[name][STATS][RETURNS] =
1372
259
  env[re[0][VALUE]][STATS][RETURNS]
1373
260
  } else if (env[re[1][VALUE]]) {
261
+ // ASSIGMENT
1374
262
  env[name][STATS][prop] =
1375
263
  env[re[1][VALUE]][STATS][prop]
1376
264
  env[name][STATS][RETURNS] =
@@ -1423,10 +311,19 @@ export const typeCheck = (ast) => {
1423
311
  env[name][STATS][RETURNS] =
1424
312
  env[returns[VALUE]][STATS][RETURNS]
1425
313
  } else {
1426
- env[name][STATS][RETURNS] =
1427
- env[returns[VALUE]][STATS][RETURNS]
1428
- env[name][STATS][RETURNS][0] =
1429
- env[returns[VALUE]][STATS][TYPE_PROP][0]
314
+ // Enclose function with it's own scope
315
+ const args = env[name][STATS][ARGUMENTS] ?? []
316
+ const fnScope = args.length
317
+ ? Object.create(env)
318
+ : env
319
+ for (const arg of args)
320
+ fnScope[arg[STATS][SIGNATURE]] = arg
321
+ // RETURN TYPE OF FUNCTION ASSIGGMENT
322
+ fnScope[name][STATS][RETURNS] =
323
+ fnScope[returns[VALUE]][STATS][RETURNS]
324
+ // assign(env[name][STATS][RETURNS],env[returns[VALUE]][STATS][RETURNS], 0)
325
+ fnScope[name][STATS][RETURNS][0] =
326
+ fnScope[returns[VALUE]][STATS][TYPE_PROP][0]
1430
327
  }
1431
328
  } else {
1432
329
  env[name][STATS][RETURNS] = [UNKNOWN]
@@ -1452,6 +349,7 @@ export const typeCheck = (ast) => {
1452
349
  )
1453
350
  }
1454
351
  if (isPredicate) {
352
+ // ATOM ASSIGMENT PREDICATE ASSIGMENT
1455
353
  env[name][STATS][prop] = [ATOM, PREDICATE]
1456
354
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1457
355
  }
@@ -1487,7 +385,7 @@ export const typeCheck = (ast) => {
1487
385
  checkReturnType()
1488
386
  if (
1489
387
  env[name][STATS][RETURNS][0] === UNKNOWN &&
1490
- env[name][STATS].retried < DEFINITON_RETRY_COUNT
388
+ env[name][STATS].retried < MAX_RETRY_DEFINITION
1491
389
  ) {
1492
390
  env[name][STATS].retried += 1
1493
391
  stack.unshift(() => {
@@ -1502,8 +400,8 @@ export const typeCheck = (ast) => {
1502
400
  const isL = isLeaf(rightHand)
1503
401
  // if (!(name in env)) {
1504
402
  if (isL && rightHand[TYPE] === WORD) {
403
+ // FULL REFF ASSIGMENT
1505
404
  env[name] = env[rest[1][VALUE]]
1506
-
1507
405
  if (
1508
406
  getSuffix(rest[1][VALUE]) === PREDICATE_SUFFIX &&
1509
407
  getSuffix(name) !== PREDICATE_SUFFIX
@@ -1527,6 +425,7 @@ export const typeCheck = (ast) => {
1527
425
  // right[VALUE] !== FALSE
1528
426
  // ) {
1529
427
  // }
428
+ // DECLARATION of ATOM
1530
429
  env[name] = {
1531
430
  [STATS]: {
1532
431
  retried: 0,
@@ -1542,6 +441,7 @@ export const typeCheck = (ast) => {
1542
441
  )}) (check #14)`
1543
442
  )
1544
443
  } else {
444
+ // PREDICATE ASSIGMENT
1545
445
  env[name][STATS][TYPE_PROP][1] = PREDICATE
1546
446
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1547
447
  }
@@ -1558,6 +458,7 @@ export const typeCheck = (ast) => {
1558
458
  warningStack.add(
1559
459
  `${name} is assigned to ${right[VALUE]} which ends in (${PREDICATE_SUFFIX}) so ${name} must also end in (${PREDICATE_SUFFIX}) (check #19)`
1560
460
  )
461
+ //DECLARATION
1561
462
  env[name] = {
1562
463
  [STATS]: {
1563
464
  retried: 0,
@@ -1571,6 +472,7 @@ export const typeCheck = (ast) => {
1571
472
  }
1572
473
  }
1573
474
  if (isPredicate) {
475
+ // PREDICATE ASSIGMENT
1574
476
  env[name][STATS][TYPE_PROP][1] = PREDICATE
1575
477
  env[name][STATS][RETURNS] = [ATOM, PREDICATE]
1576
478
  }
@@ -1594,6 +496,7 @@ export const typeCheck = (ast) => {
1594
496
  `${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (check #25)`
1595
497
  )
1596
498
  }
499
+ // FB assigment
1597
500
  env[name][STATS][TYPE_PROP] = fn[STATS][RETURNS]
1598
501
  env[name][STATS][RETURNS] = fn[STATS][RETURNS]
1599
502
  } else {
@@ -1619,6 +522,7 @@ export const typeCheck = (ast) => {
1619
522
  )}) so ${name} must end in (${PREDICATE_SUFFIX}) (check #23)`
1620
523
  )
1621
524
  }
525
+ // FN assigment
1622
526
  env[name][STATS][RETURNS] =
1623
527
  env[right[VALUE]][STATS][RETURNS]
1624
528
  }
@@ -1682,6 +586,8 @@ export const typeCheck = (ast) => {
1682
586
  (result) => result[VALUE] !== KEYWORDS.IF
1683
587
  )
1684
588
  if (isLeaf(returns)) {
589
+ // TODO figure out what we do here
590
+ // console.log({ returns }, ref, copy[param[VALUE]][STATS])
1685
591
  } else {
1686
592
  const ret = returns[0]
1687
593
  switch (ret[VALUE]) {
@@ -1758,8 +664,6 @@ export const typeCheck = (ast) => {
1758
664
  )}) (check #15)`
1759
665
  )
1760
666
  } else {
1761
- const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
1762
-
1763
667
  if (first[TYPE] === APPLY && !isSpecial) {
1764
668
  if (env[first[VALUE]][STATS][TYPE_PROP][0] === ATOM) {
1765
669
  errorStack.add(
@@ -1772,7 +676,7 @@ export const typeCheck = (ast) => {
1772
676
  if (env[first[VALUE]][STATS][RETURNS][0] === APPLY) {
1773
677
  env[first[VALUE]][STATS][RETURNS] = [UNKNOWN]
1774
678
  }
1775
-
679
+ // FN ASSIGMENT
1776
680
  env[first[VALUE]][STATS][TYPE_PROP] = [APPLY]
1777
681
  env[first[VALUE]][STATS][ARGS_COUNT] = rest.length
1778
682
  }
@@ -2006,11 +910,13 @@ export const typeCheck = (ast) => {
2006
910
  )
2007
911
  } else if (env[rest[i][VALUE]]) {
2008
912
  if (isCast) {
913
+ // CAST assigment
2009
914
  env[rest[i][VALUE]][STATS][TYPE_PROP] =
2010
915
  root[first[VALUE]][STATS][RETURNS]
2011
916
  root[first[VALUE]][STATS][RETURNS] =
2012
917
  root[first[VALUE]][STATS][RETURNS]
2013
918
  } else {
919
+ // VALUE assigment
2014
920
  env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
2015
921
  MAIN_TYPE
2016
922
  }
@@ -2044,6 +950,7 @@ export const typeCheck = (ast) => {
2044
950
  )}) (${stringifyArgs(exp)}) (check #5)`
2045
951
  )
2046
952
  }
953
+
2047
954
  break
2048
955
  }
2049
956
  }
@@ -2111,17 +1018,18 @@ export const typeCheck = (ast) => {
2111
1018
  )}) (check #30)`
2112
1019
  )
2113
1020
  } else {
2114
- const retry = env[rest[i][VALUE]]
1021
+ // const retry = env[rest[i][VALUE]]
1022
+ // if (
1023
+ // retry &&
1024
+ // retry[STATS].retried < RETRY_COUNT &&
1025
+ // args[i][STATS][TYPE_PROP][0] === UNKNOWN
1026
+ // ) {
1027
+ // retry[STATS].retried += 1
1028
+ // stack.unshift(() => check(exp, env, scope))
1029
+ // } else
2115
1030
  if (
2116
- retry &&
2117
- retry[STATS].retried < RETRY_COUNT &&
2118
- args[i][STATS][TYPE_PROP][0] === UNKNOWN
2119
- ) {
2120
- retry[STATS].retried += 1
2121
- stack.unshift(() => check(exp, env, scope))
2122
- } else if (
2123
1031
  args[i][STATS][TYPE_PROP][0] === UNKNOWN &&
2124
- args[i][STATS].retried < DEFINITON_RETRY_COUNT
1032
+ args[i][STATS].retried < MAX_RETRY_DEFINITION
2125
1033
  ) {
2126
1034
  args[i][STATS].retried += 1
2127
1035
  stack.unshift(() => check(exp, env, scope))
@@ -2133,6 +1041,7 @@ export const typeCheck = (ast) => {
2133
1041
  UNKNOWN &&
2134
1042
  args[i][STATS][TYPE_PROP][0] !== APPLY
2135
1043
  ) {
1044
+ // REFF ASSIGMENT
2136
1045
  env[rest[i][VALUE]][STATS][TYPE_PROP] =
2137
1046
  args[i][STATS][TYPE_PROP]
2138
1047
  env[rest[i][VALUE]][STATS][RETURNS] =
@@ -2140,27 +1049,68 @@ export const typeCheck = (ast) => {
2140
1049
  }
2141
1050
  }
2142
1051
  }
2143
- } else if (
2144
- rest[i].length &&
2145
- SPECIAL_FORMS_SET.has(rest[i][0][VALUE]) &&
2146
- env[rest[i][0][VALUE]] &&
2147
- env[rest[i][0][VALUE]][STATS][RETURNS][0] !==
2148
- UNKNOWN &&
2149
- args[i][STATS][TYPE_PROP][0] !== UNKNOWN &&
2150
- env[rest[i][0][VALUE]][STATS][RETURNS][0] !==
2151
- args[i][STATS][TYPE_PROP][0]
2152
- ) {
2153
- errorStack.add(
2154
- `Incorrect type of arguments ${i} for (${
2155
- first[VALUE]
2156
- }). Expected (${toTypeNames(
1052
+ } else if (rest[i].length) {
1053
+ // TODO figure out what cann we do in this else ?
1054
+ // Check arg types
1055
+ // errorStack.add(
1056
+ // `Incorrect type of arguments ${i} for (${
1057
+ // first[VALUE]
1058
+ // }). Expected (${toTypeNames(
1059
+ // args[i][STATS][TYPE_PROP][0]
1060
+ // )}) but got (${toTypeNames(
1061
+ // env[rest[i][0][VALUE]][STATS][RETURNS][0]
1062
+ // )}) (${stringifyArgs(exp)}) (check #4)`
1063
+ // )
1064
+ // TODO figure out if we need this
1065
+ if (
1066
+ SPECIAL_FORMS_SET.has(rest[i][0][VALUE]) &&
1067
+ env[rest[i][0][VALUE]] &&
1068
+ env[rest[i][0][VALUE]][STATS][RETURNS][0] !==
1069
+ UNKNOWN &&
1070
+ args[i][STATS][TYPE_PROP][0] !== UNKNOWN &&
1071
+ env[rest[i][0][VALUE]][STATS][RETURNS][0] !==
2157
1072
  args[i][STATS][TYPE_PROP][0]
2158
- )}) but got (${toTypeNames(
2159
- env[rest[i][0][VALUE]][STATS][RETURNS][0]
2160
- )}) (${stringifyArgs(exp)}) (check #4)`
2161
1073
  )
1074
+ errorStack.add(
1075
+ `Incorrect type of arguments ${i} for (${
1076
+ first[VALUE]
1077
+ }). Expected (${toTypeNames(
1078
+ args[i][STATS][TYPE_PROP][0]
1079
+ )}) but got (${toTypeNames(
1080
+ env[rest[i][0][VALUE]][STATS][RETURNS][0]
1081
+ )}) (${stringifyArgs(exp)}) (check #4)`
1082
+ )
1083
+ else if (
1084
+ rest[i][0][TYPE] === APPLY &&
1085
+ env[rest[i][0][VALUE]]
1086
+ ) {
1087
+ const actual =
1088
+ env[rest[i][0][VALUE]][STATS][RETURNS]
1089
+ const expected = args[i][STATS][TYPE_PROP]
1090
+ if (
1091
+ expected[0] !== UNKNOWN &&
1092
+ actual[0] !== UNKNOWN
1093
+ ) {
1094
+ if (expected[0] !== actual[0])
1095
+ errorStack.add(
1096
+ `Incorrect type of arguments ${i} for (${
1097
+ first[VALUE]
1098
+ }). Expected (${toTypeNames(
1099
+ expected[0]
1100
+ )}) but got (${toTypeNames(
1101
+ actual[0]
1102
+ )}) (${stringifyArgs(exp)}) (check #16)`
1103
+ )
1104
+ } else {
1105
+ if (
1106
+ args[i][STATS].retried < MAX_RETRY_DEFINITION
1107
+ ) {
1108
+ args[i][STATS].retried += 1
1109
+ stack.unshift(() => check(exp, env, scope))
1110
+ }
1111
+ }
1112
+ }
2162
1113
  }
2163
- // TODO figure out what cann we do in this else ?
2164
1114
  }
2165
1115
  }
2166
1116
  }
@@ -2174,7 +1124,6 @@ export const typeCheck = (ast) => {
2174
1124
  }
2175
1125
  }
2176
1126
  const copy = JSON.parse(JSON.stringify(ast))
2177
- copy[SCOPE_NAME] = 'root'
2178
1127
  check(copy, root, copy)
2179
1128
  while (stack.length) stack.pop()()
2180
1129
  const issues = [...errorStack, ...warningStack]