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