fez-lisp 1.5.47 → 1.5.49

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.47",
5
+ "version": "1.5.49",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -41,13 +41,22 @@ const toTypeNames = (type) => {
41
41
  case ATOM:
42
42
  return 'Atom'
43
43
  case UNKNOWN:
44
- return 'Uknown'
44
+ return 'Unknown'
45
45
  case PREDICATE:
46
46
  return 'Predicate'
47
47
  case COLLECTION:
48
48
  return 'Collection'
49
49
  }
50
50
  }
51
+ export const identity = (name) => [
52
+ [0, 'let'],
53
+ [1, name],
54
+ [
55
+ [0, 'lambda'],
56
+ [1, 'x'],
57
+ [1, 'x']
58
+ ]
59
+ ]
51
60
  const drillReturnType = (rest, condition) => {
52
61
  const body = rest.at(-1)
53
62
  const rem = hasBlock(body) ? body.at(-1) : body
@@ -56,6 +65,11 @@ const drillReturnType = (rest, condition) => {
56
65
  ? drillReturnType(rem.at(-1), condition)
57
66
  : [returns, rem]
58
67
  }
68
+ const deepLambdaReturn = (rest, condition) => {
69
+ const body = rest.at(-1)
70
+ const rem = hasBlock(body) ? body.at(-1) : body
71
+ return condition(rem) ? rem : deepLambdaReturn(rem, condition)
72
+ }
59
73
  const getScopeNames = (scope) => {
60
74
  const scopeNames = []
61
75
  let current = scope
@@ -74,10 +88,55 @@ const withScope = (name, scope) => {
74
88
  }
75
89
  export const typeCheck = (ast) => {
76
90
  const root = {
91
+ [toTypeNames(APPLY)]: {
92
+ [STATS]: Object.freeze({
93
+ [TYPE_PROP]: [APPLY],
94
+ retried: RETRY_COUNT,
95
+ [ARGS_COUNT]: 1,
96
+ [ARGS]: [[UNKNOWN, PLACEHOLDER]],
97
+ [RETURNS]: [APPLY]
98
+ })
99
+ },
100
+ [toTypeNames(ATOM)]: {
101
+ [STATS]: Object.freeze({
102
+ [TYPE_PROP]: [APPLY],
103
+ retried: RETRY_COUNT,
104
+ [ARGS_COUNT]: 1,
105
+ [ARGS]: [[UNKNOWN, PLACEHOLDER]],
106
+ [RETURNS]: [ATOM]
107
+ })
108
+ },
109
+ [toTypeNames(PREDICATE)]: {
110
+ [STATS]: Object.freeze({
111
+ [TYPE_PROP]: [APPLY],
112
+ retried: RETRY_COUNT,
113
+ [ARGS_COUNT]: 1,
114
+ [ARGS]: [[UNKNOWN, PLACEHOLDER]],
115
+ [RETURNS]: [ATOM, PREDICATE]
116
+ })
117
+ },
118
+ [toTypeNames(COLLECTION)]: {
119
+ [STATS]: Object.freeze({
120
+ [TYPE_PROP]: [APPLY],
121
+ retried: RETRY_COUNT,
122
+ [ARGS_COUNT]: 1,
123
+ [ARGS]: [[UNKNOWN, PLACEHOLDER]],
124
+ [RETURNS]: [COLLECTION]
125
+ })
126
+ },
127
+ [toTypeNames(UNKNOWN)]: {
128
+ [STATS]: Object.freeze({
129
+ [TYPE_PROP]: [APPLY],
130
+ retried: RETRY_COUNT,
131
+ [ARGS_COUNT]: 1,
132
+ [ARGS]: [[UNKNOWN, PLACEHOLDER]],
133
+ [RETURNS]: [UNKNOWN]
134
+ })
135
+ },
77
136
  [DEBUG.LOG]: {
78
137
  [STATS]: {
79
138
  [TYPE_PROP]: [APPLY],
80
- retried: 0,
139
+ retried: RETRY_COUNT,
81
140
  [ARGS]: [
82
141
  [UNKNOWN, PLACEHOLDER],
83
142
  [COLLECTION, PLACEHOLDER]
@@ -89,7 +148,7 @@ export const typeCheck = (ast) => {
89
148
  [DEBUG.STRING]: {
90
149
  [STATS]: {
91
150
  [TYPE_PROP]: [APPLY],
92
- retried: 0,
151
+ retried: RETRY_COUNT,
93
152
  [ARGS_COUNT]: 1,
94
153
  [ARGS]: [[COLLECTION, PLACEHOLDER]],
95
154
  [RETURNS]: [COLLECTION]
@@ -98,7 +157,7 @@ export const typeCheck = (ast) => {
98
157
  [DEBUG.ASSERT]: {
99
158
  [STATS]: {
100
159
  [TYPE_PROP]: [APPLY],
101
- retried: 0,
160
+ retried: RETRY_COUNT,
102
161
  [ARGS_COUNT]: VARIADIC,
103
162
  [RETURNS]: [UNKNOWN]
104
163
  }
@@ -106,7 +165,7 @@ export const typeCheck = (ast) => {
106
165
  [DEBUG.SIGNATURE]: {
107
166
  [STATS]: {
108
167
  [TYPE_PROP]: [APPLY],
109
- retried: 0,
168
+ retried: RETRY_COUNT,
110
169
  [ARGS_COUNT]: VARIADIC,
111
170
  [RETURNS]: [UNKNOWN]
112
171
  }
@@ -114,7 +173,7 @@ export const typeCheck = (ast) => {
114
173
  [DEBUG.LIST_THEMES]: {
115
174
  [STATS]: {
116
175
  [TYPE_PROP]: [APPLY],
117
- retried: 0,
176
+ retried: RETRY_COUNT,
118
177
  [ARGS_COUNT]: VARIADIC,
119
178
  [RETURNS]: [UNKNOWN]
120
179
  }
@@ -122,7 +181,7 @@ export const typeCheck = (ast) => {
122
181
  [DEBUG.SET_THEME]: {
123
182
  [STATS]: {
124
183
  [TYPE_PROP]: [APPLY],
125
- retried: 0,
184
+ retried: RETRY_COUNT,
126
185
  [ARGS_COUNT]: VARIADIC,
127
186
  [RETURNS]: [UNKNOWN]
128
187
  }
@@ -130,7 +189,7 @@ export const typeCheck = (ast) => {
130
189
  [KEYWORDS.BLOCK]: {
131
190
  [STATS]: {
132
191
  [TYPE_PROP]: [APPLY],
133
- retried: 0,
192
+ retried: RETRY_COUNT,
134
193
  [ARGS_COUNT]: VARIADIC,
135
194
  [RETURNS]: [UNKNOWN]
136
195
  }
@@ -138,7 +197,7 @@ export const typeCheck = (ast) => {
138
197
  [KEYWORDS.ANONYMOUS_FUNCTION]: {
139
198
  [STATS]: {
140
199
  [TYPE_PROP]: [APPLY],
141
- retried: 0,
200
+ retried: RETRY_COUNT,
142
201
  [ARGS_COUNT]: VARIADIC,
143
202
  [RETURNS]: [APPLY]
144
203
  }
@@ -146,7 +205,7 @@ export const typeCheck = (ast) => {
146
205
  [KEYWORDS.CALL_FUNCTION]: {
147
206
  [STATS]: {
148
207
  [TYPE_PROP]: [APPLY],
149
- retried: 0,
208
+ retried: RETRY_COUNT,
150
209
  [ARGS_COUNT]: VARIADIC,
151
210
  [RETURNS]: [UNKNOWN]
152
211
  }
@@ -154,7 +213,7 @@ export const typeCheck = (ast) => {
154
213
  [KEYWORDS.CREATE_ARRAY]: {
155
214
  [STATS]: {
156
215
  [TYPE_PROP]: [APPLY],
157
- retried: 0,
216
+ retried: RETRY_COUNT,
158
217
  [ARGS_COUNT]: VARIADIC,
159
218
  [RETURNS]: [COLLECTION]
160
219
  }
@@ -162,7 +221,7 @@ export const typeCheck = (ast) => {
162
221
  [KEYWORDS.LOOP]: {
163
222
  [STATS]: {
164
223
  [TYPE_PROP]: [APPLY],
165
- retried: 0,
224
+ retried: RETRY_COUNT,
166
225
  [ARGS_COUNT]: 2,
167
226
  [ARGS]: [
168
227
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -174,7 +233,7 @@ export const typeCheck = (ast) => {
174
233
  [KEYWORDS.ADDITION]: {
175
234
  [STATS]: {
176
235
  [TYPE_PROP]: [APPLY],
177
- retried: 0,
236
+ retried: RETRY_COUNT,
178
237
  [ARGS_COUNT]: 2,
179
238
  [ARGS]: [
180
239
  [ATOM, PLACEHOLDER],
@@ -186,7 +245,7 @@ export const typeCheck = (ast) => {
186
245
  [KEYWORDS.MULTIPLICATION]: {
187
246
  [STATS]: {
188
247
  [TYPE_PROP]: [APPLY],
189
- retried: 0,
248
+ retried: RETRY_COUNT,
190
249
  [ARGS_COUNT]: 2,
191
250
  [ARGS]: [
192
251
  [ATOM, PLACEHOLDER],
@@ -198,7 +257,7 @@ export const typeCheck = (ast) => {
198
257
  [KEYWORDS.SUBTRACTION]: {
199
258
  [STATS]: {
200
259
  [TYPE_PROP]: [APPLY],
201
- retried: 0,
260
+ retried: RETRY_COUNT,
202
261
  [ARGS_COUNT]: 2,
203
262
  [ARGS]: [
204
263
  [ATOM, PLACEHOLDER],
@@ -210,7 +269,7 @@ export const typeCheck = (ast) => {
210
269
  [KEYWORDS.DIVISION]: {
211
270
  [STATS]: {
212
271
  [TYPE_PROP]: [APPLY],
213
- retried: 0,
272
+ retried: RETRY_COUNT,
214
273
  [ARGS_COUNT]: 2,
215
274
  [ARGS]: [
216
275
  [ATOM, PLACEHOLDER],
@@ -222,7 +281,7 @@ export const typeCheck = (ast) => {
222
281
  [KEYWORDS.REMAINDER_OF_DIVISION]: {
223
282
  [STATS]: {
224
283
  [TYPE_PROP]: [APPLY],
225
- retried: 0,
284
+ retried: RETRY_COUNT,
226
285
  [ARGS_COUNT]: 2,
227
286
  [ARGS]: [
228
287
  [ATOM, PLACEHOLDER],
@@ -234,7 +293,7 @@ export const typeCheck = (ast) => {
234
293
  [KEYWORDS.BITWISE_AND]: {
235
294
  [STATS]: {
236
295
  [TYPE_PROP]: [APPLY],
237
- retried: 0,
296
+ retried: RETRY_COUNT,
238
297
  [ARGS_COUNT]: 2,
239
298
  [ARGS]: [
240
299
  [ATOM, PLACEHOLDER],
@@ -246,7 +305,7 @@ export const typeCheck = (ast) => {
246
305
  [KEYWORDS.BITWISE_NOT]: {
247
306
  [STATS]: {
248
307
  [TYPE_PROP]: [APPLY],
249
- retried: 0,
308
+ retried: RETRY_COUNT,
250
309
  [ARGS_COUNT]: 1,
251
310
  [ARGS]: [[ATOM, PLACEHOLDER]],
252
311
  [RETURNS]: [ATOM]
@@ -255,7 +314,7 @@ export const typeCheck = (ast) => {
255
314
  [KEYWORDS.BITWISE_OR]: {
256
315
  [STATS]: {
257
316
  [TYPE_PROP]: [APPLY],
258
- retried: 0,
317
+ retried: RETRY_COUNT,
259
318
  [ARGS_COUNT]: 2,
260
319
  [ARGS]: [
261
320
  [ATOM, PLACEHOLDER],
@@ -267,7 +326,7 @@ export const typeCheck = (ast) => {
267
326
  [KEYWORDS.BITWISE_XOR]: {
268
327
  [STATS]: {
269
328
  [TYPE_PROP]: [APPLY],
270
- retried: 0,
329
+ retried: RETRY_COUNT,
271
330
  [ARGS_COUNT]: 2,
272
331
  [ARGS]: [
273
332
  [ATOM, PLACEHOLDER],
@@ -279,7 +338,7 @@ export const typeCheck = (ast) => {
279
338
  [KEYWORDS.BITWISE_LEFT_SHIFT]: {
280
339
  [STATS]: {
281
340
  [TYPE_PROP]: [APPLY],
282
- retried: 0,
341
+ retried: RETRY_COUNT,
283
342
  [ARGS_COUNT]: 2,
284
343
  [ARGS]: [
285
344
  [ATOM, PLACEHOLDER],
@@ -291,7 +350,7 @@ export const typeCheck = (ast) => {
291
350
  [KEYWORDS.BITWISE_RIGHT_SHIFT]: {
292
351
  [STATS]: {
293
352
  [TYPE_PROP]: [APPLY],
294
- retried: 0,
353
+ retried: RETRY_COUNT,
295
354
  [ARGS_COUNT]: 2,
296
355
  [ARGS]: [
297
356
  [ATOM, PLACEHOLDER],
@@ -303,7 +362,7 @@ export const typeCheck = (ast) => {
303
362
  [KEYWORDS.GET_ARRAY]: {
304
363
  [STATS]: {
305
364
  [TYPE_PROP]: [APPLY],
306
- retried: 0,
365
+ retried: RETRY_COUNT,
307
366
  [ARGS_COUNT]: 2,
308
367
  [ARGS]: [
309
368
  [COLLECTION, PLACEHOLDER],
@@ -315,7 +374,7 @@ export const typeCheck = (ast) => {
315
374
  [KEYWORDS.SET_ARRAY]: {
316
375
  [STATS]: {
317
376
  [TYPE_PROP]: [APPLY],
318
- retried: 0,
377
+ retried: RETRY_COUNT,
319
378
  [ARGS_COUNT]: 3,
320
379
  [ARGS]: [
321
380
  [COLLECTION, PLACEHOLDER],
@@ -328,7 +387,7 @@ export const typeCheck = (ast) => {
328
387
  [KEYWORDS.POP_ARRAY]: {
329
388
  [STATS]: {
330
389
  [TYPE_PROP]: [APPLY],
331
- retried: 0,
390
+ retried: RETRY_COUNT,
332
391
  [ARGS_COUNT]: 1,
333
392
  [ARGS]: [[COLLECTION, PLACEHOLDER]],
334
393
  [RETURNS]: [COLLECTION]
@@ -337,7 +396,7 @@ export const typeCheck = (ast) => {
337
396
  [KEYWORDS.ARRAY_LENGTH]: {
338
397
  [STATS]: {
339
398
  [TYPE_PROP]: [APPLY],
340
- retried: 0,
399
+ retried: RETRY_COUNT,
341
400
  [ARGS_COUNT]: 1,
342
401
  [ARGS]: [[COLLECTION, PLACEHOLDER]],
343
402
  [RETURNS]: [ATOM]
@@ -346,7 +405,7 @@ export const typeCheck = (ast) => {
346
405
  [KEYWORDS.IF]: {
347
406
  [STATS]: {
348
407
  [TYPE_PROP]: [APPLY],
349
- retried: 0,
408
+ retried: RETRY_COUNT,
350
409
  [ARGS_COUNT]: 3,
351
410
  [ARGS]: [
352
411
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -359,7 +418,7 @@ export const typeCheck = (ast) => {
359
418
  [KEYWORDS.NOT]: {
360
419
  [STATS]: {
361
420
  [TYPE_PROP]: [APPLY],
362
- retried: 0,
421
+ retried: RETRY_COUNT,
363
422
  [ARGS_COUNT]: 1,
364
423
  [ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
365
424
  [RETURNS]: [ATOM, PREDICATE]
@@ -368,7 +427,7 @@ export const typeCheck = (ast) => {
368
427
  [KEYWORDS.EQUAL]: {
369
428
  [STATS]: {
370
429
  [TYPE_PROP]: [APPLY],
371
- retried: 0,
430
+ retried: RETRY_COUNT,
372
431
  [ARGS_COUNT]: 2,
373
432
  [ARGS]: [
374
433
  [ATOM, PLACEHOLDER],
@@ -380,7 +439,7 @@ export const typeCheck = (ast) => {
380
439
  [KEYWORDS.LESS_THAN]: {
381
440
  [STATS]: {
382
441
  [TYPE_PROP]: [APPLY],
383
- retried: 0,
442
+ retried: RETRY_COUNT,
384
443
  [ARGS_COUNT]: 2,
385
444
  [ARGS]: [
386
445
  [ATOM, PLACEHOLDER],
@@ -392,7 +451,7 @@ export const typeCheck = (ast) => {
392
451
  [KEYWORDS.GREATHER_THAN]: {
393
452
  [STATS]: {
394
453
  [TYPE_PROP]: [APPLY],
395
- retried: 0,
454
+ retried: RETRY_COUNT,
396
455
  [ARGS_COUNT]: 2,
397
456
  [ARGS]: [
398
457
  [ATOM, PLACEHOLDER],
@@ -404,7 +463,7 @@ export const typeCheck = (ast) => {
404
463
  [KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
405
464
  [STATS]: {
406
465
  [TYPE_PROP]: [APPLY],
407
- retried: 0,
466
+ retried: RETRY_COUNT,
408
467
  [ARGS_COUNT]: 2,
409
468
  [ARGS]: [
410
469
  [ATOM, PLACEHOLDER],
@@ -416,7 +475,7 @@ export const typeCheck = (ast) => {
416
475
  [KEYWORDS.LESS_THAN_OR_EQUAL]: {
417
476
  [STATS]: {
418
477
  [TYPE_PROP]: [APPLY],
419
- retried: 0,
478
+ retried: RETRY_COUNT,
420
479
  [ARGS_COUNT]: 2,
421
480
  [ARGS]: [
422
481
  [ATOM, PLACEHOLDER],
@@ -428,7 +487,7 @@ export const typeCheck = (ast) => {
428
487
  [KEYWORDS.AND]: {
429
488
  [STATS]: {
430
489
  [TYPE_PROP]: [APPLY],
431
- retried: 0,
490
+ retried: RETRY_COUNT,
432
491
  [ARGS_COUNT]: 2,
433
492
  [ARGS]: [
434
493
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -440,7 +499,7 @@ export const typeCheck = (ast) => {
440
499
  [KEYWORDS.OR]: {
441
500
  [STATS]: {
442
501
  [TYPE_PROP]: [APPLY],
443
- retried: 0,
502
+ retried: RETRY_COUNT,
444
503
  [ARGS_COUNT]: 2,
445
504
  [ARGS]: [
446
505
  [ATOM, PLACEHOLDER, PREDICATE],
@@ -452,7 +511,7 @@ export const typeCheck = (ast) => {
452
511
  [KEYWORDS.IS_ATOM]: {
453
512
  [STATS]: {
454
513
  [TYPE_PROP]: [APPLY],
455
- retried: 0,
514
+ retried: RETRY_COUNT,
456
515
  [ARGS_COUNT]: 1,
457
516
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
458
517
  [RETURNS]: [ATOM, PREDICATE]
@@ -461,7 +520,7 @@ export const typeCheck = (ast) => {
461
520
  [KEYWORDS.IS_LAMBDA]: {
462
521
  [STATS]: {
463
522
  [TYPE_PROP]: [APPLY],
464
- retried: 0,
523
+ retried: RETRY_COUNT,
465
524
  [ARGS_COUNT]: 1,
466
525
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
467
526
  [RETURNS]: [ATOM, PREDICATE]
@@ -470,7 +529,7 @@ export const typeCheck = (ast) => {
470
529
  [KEYWORDS.ERROR]: {
471
530
  [STATS]: {
472
531
  [TYPE_PROP]: [APPLY],
473
- retried: 0,
532
+ retried: RETRY_COUNT,
474
533
  [ARGS_COUNT]: 1,
475
534
  [ARGS]: [[COLLECTION, PLACEHOLDER]],
476
535
  [RETURNS]: [UNKNOWN]
@@ -556,7 +615,6 @@ export const typeCheck = (ast) => {
556
615
  // const alternative = isLeaf(re[1])
557
616
  // ? env[re[1][VALUE]]
558
617
  // : env[re[1][0][VALUE]]
559
-
560
618
  env[name][STATS][prop] =
561
619
  env[re[0][0][VALUE]][STATS][RETURNS]
562
620
  if (
@@ -728,6 +786,7 @@ export const typeCheck = (ast) => {
728
786
  // if (!(name in env)) {
729
787
  if (rest[1][TYPE] === WORD) {
730
788
  env[name] = env[rest[1][VALUE]]
789
+
731
790
  if (
732
791
  getSuffix(rest[1][VALUE]) === PREDICATE_SUFFIX &&
733
792
  getSuffix(name) !== PREDICATE_SUFFIX
@@ -820,7 +879,6 @@ export const typeCheck = (ast) => {
820
879
  const body = rest.at(-1).at(-1).at(-1)
821
880
  const rem = hasBlock(body) ? body.at(-1) : body
822
881
  const returns = isLeaf(rem) ? rem : rem[0]
823
- // console.log({ returns })
824
882
  resolveRetunType(
825
883
  returns,
826
884
  rem,
@@ -885,12 +943,64 @@ export const typeCheck = (ast) => {
885
943
  retried: 0
886
944
  }
887
945
  }
888
- if (env[copy[SCOPE_NAME]]) {
889
- if (env[copy[SCOPE_NAME]][STATS][ARGS])
890
- env[copy[SCOPE_NAME]][STATS][ARGS][i] = copy[param[VALUE]]
946
+ const ref = env[copy[SCOPE_NAME]]
947
+ if (ref) {
948
+ if (ref[STATS][ARGS]) ref[STATS][ARGS][i] = copy[param[VALUE]]
891
949
  if (getSuffix(param[VALUE]) === PREDICATE_SUFFIX) {
892
950
  copy[param[VALUE]][STATS][RETURNS] = [ATOM, PREDICATE]
893
951
  } else {
952
+ const returns = deepLambdaReturn(
953
+ hasBlock(exp) ? exp.at(-1) : exp,
954
+ (result) => result[VALUE] !== KEYWORDS.IF
955
+ )
956
+ if (isLeaf(returns)) {
957
+ } else {
958
+ const ret = returns[0]
959
+ switch (ret[VALUE]) {
960
+ case KEYWORDS.IF:
961
+ const re = returns.slice(2)
962
+ // If either is an ATOM then IF returns an ATOM
963
+ if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
964
+ ref[STATS][RETURNS][0] = ATOM
965
+ // TODO check that both brancehs are predicates if one is
966
+ if (
967
+ getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
968
+ getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
969
+ ) {
970
+ ref[STATS][RETURNS][1] = PREDICATE
971
+ }
972
+ } else {
973
+ const concequent = isLeaf(re[0])
974
+ ? copy[re[0][VALUE]]
975
+ : copy[re[0][0][VALUE]]
976
+ const alternative = isLeaf(re[1])
977
+ ? copy[re[1][VALUE]]
978
+ : copy[re[1][0][VALUE]]
979
+
980
+ // todo check if condition matches alternative
981
+ if (
982
+ concequent &&
983
+ concequent[STATS][RETURNS][0] !== UNKNOWN
984
+ ) {
985
+ ref[STATS][RETURNS] = concequent[STATS][RETURNS]
986
+ } else if (
987
+ alternative &&
988
+ alternative[STATS][RETURNS][0] !== UNKNOWN
989
+ ) {
990
+ ref[STATS][RETURNS] = alternative[STATS][RETURNS]
991
+ } else if (concequent) {
992
+ ref[STATS][RETURNS] = concequent[STATS][RETURNS]
993
+ }
994
+ }
995
+
996
+ break
997
+ default:
998
+ if (copy[ret[VALUE]])
999
+ ref[STATS][RETURNS] =
1000
+ copy[ret[VALUE]][STATS][RETURNS]
1001
+ break
1002
+ }
1003
+ }
894
1004
  // TODO overwrite return type check here
895
1005
  // console.log(copy[SCOPE_NAME], env[copy[SCOPE_NAME]], copy)
896
1006
  }
@@ -925,7 +1035,6 @@ export const typeCheck = (ast) => {
925
1035
  )
926
1036
  } else {
927
1037
  const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
928
-
929
1038
  if (first[TYPE] === APPLY && !isSpecial) {
930
1039
  if (env[first[VALUE]][STATS][TYPE_PROP][0] === ATOM) {
931
1040
  errorStack.set(
@@ -939,6 +1048,7 @@ export const typeCheck = (ast) => {
939
1048
  if (env[first[VALUE]][STATS][RETURNS][0] === APPLY) {
940
1049
  env[first[VALUE]][STATS][RETURNS] = [UNKNOWN]
941
1050
  }
1051
+
942
1052
  env[first[VALUE]][STATS][TYPE_PROP] = [APPLY]
943
1053
  env[first[VALUE]][STATS][ARGS_COUNT] = rest.length
944
1054
  }
@@ -1103,17 +1213,7 @@ export const typeCheck = (ast) => {
1103
1213
  )
1104
1214
  }
1105
1215
  }
1106
-
1107
- // // console.log({ returns })
1108
- // resolveRetunType(
1109
- // returns,
1110
- // rem,
1111
- // TYPE_PROP,
1112
- // isPredicate
1113
- // )
1114
1216
  }
1115
-
1116
- // console.log(args[i], env[current[VALUE]][STATS])
1117
1217
  } else if (
1118
1218
  args[i][SUB] &&
1119
1219
  env[current[VALUE]] &&
@@ -1189,10 +1289,10 @@ export const typeCheck = (ast) => {
1189
1289
  expectedArgs[i][TYPE] !== rest[i][TYPE]
1190
1290
  ) {
1191
1291
  switch (rest[i][TYPE]) {
1192
- case UNKNOWN:
1193
- env[first[VALUE]][STATS][TYPE_PROP][0] =
1194
- expectedArgs[i][TYPE]
1195
- break
1292
+ // case UNKNOWN:
1293
+ // env[first[VALUE]][STATS][TYPE_PROP][0] =
1294
+ // expectedArgs[i][TYPE]
1295
+ // break
1196
1296
  case WORD:
1197
1297
  const T =
1198
1298
  env[rest[i][VALUE]][STATS][TYPE_PROP][0]
@@ -1230,6 +1330,7 @@ export const typeCheck = (ast) => {
1230
1330
  )
1231
1331
  break
1232
1332
  }
1333
+ } else {
1233
1334
  }
1234
1335
  }
1235
1336
  }
@@ -1274,6 +1375,12 @@ export const typeCheck = (ast) => {
1274
1375
  ) {
1275
1376
  retry[STATS].retried += 1
1276
1377
  stack.unshift(() => check(exp, env, scope))
1378
+ } else if (
1379
+ args[i][STATS][TYPE_PROP][0] === UNKNOWN &&
1380
+ args[i][STATS].retried < DEFINITON_RETRY_COUNT
1381
+ ) {
1382
+ args[i][STATS].retried += 1
1383
+ stack.unshift(() => check(exp, env, scope))
1277
1384
  }
1278
1385
  }
1279
1386
  } else if (
@@ -1315,7 +1422,6 @@ export const typeCheck = (ast) => {
1315
1422
  }
1316
1423
  }
1317
1424
  })
1318
- // console.log(env)
1319
1425
  for (const r of rest) check(r, env, scope)
1320
1426
  break
1321
1427
  }
package/src/compiler.js CHANGED
@@ -5,7 +5,8 @@ import {
5
5
  KEYWORDS,
6
6
  TYPE,
7
7
  VALUE,
8
- WORD
8
+ WORD,
9
+ STATIC_TYPES
9
10
  } from './keywords.js'
10
11
  import { OPTIMIZATIONS } from './macros.js'
11
12
  import { leaf, isLeaf, AST } from './parser.js'
@@ -262,6 +263,14 @@ const comp = (tree, Drill) => {
262
263
  Drill.Helpers.add('__error')
263
264
  return `__error(${compile(tail[0], Drill)})`
264
265
  }
266
+
267
+ case STATIC_TYPES.APPLICATION:
268
+ case STATIC_TYPES.COLLECTION:
269
+ case STATIC_TYPES.UNKNOWN:
270
+ case STATIC_TYPES.ATOM:
271
+ case STATIC_TYPES.PREDICATE:
272
+ return compile(tail[0], Drill)
273
+
265
274
  default: {
266
275
  const camelCased = lispToJavaScriptVariableName(token)
267
276
  if (camelCased in Helpers) Drill.Helpers.add(camelCased)
@@ -7,7 +7,8 @@ import {
7
7
  TRUE,
8
8
  TYPES,
9
9
  RUNTIME_TYPES,
10
- DEBUG
10
+ DEBUG,
11
+ STATIC_TYPES
11
12
  } from './keywords.js'
12
13
  import { evaluate } from './evaluator.js'
13
14
  import { isForbiddenVariableName, stringifyArgs } from './utils.js'
@@ -837,5 +838,11 @@ export const keywords = {
837
838
  }) but got (${expression}) (${KEYWORDS.ERROR} ${stringifyArgs(args)})`
838
839
  )
839
840
  throw new Error(expression.map((x) => String.fromCharCode(x)).join(''))
840
- }
841
+ },
842
+
843
+ [STATIC_TYPES.APPLICATION]: (args, env) => evaluate(args[0], env),
844
+ [STATIC_TYPES.ATOM]: (args, env) => evaluate(args[0], env),
845
+ [STATIC_TYPES.COLLECTION]: (args, env) => evaluate(args[0], env),
846
+ [STATIC_TYPES.PREDICATE]: (args, env) => evaluate(args[0], env),
847
+ [STATIC_TYPES.UNKNOWN]: (args, env) => evaluate(args[0], env)
841
848
  }
package/src/keywords.js CHANGED
@@ -8,6 +8,13 @@ export const FALSE = 0
8
8
  export const PLACEHOLDER = '.'
9
9
  export const MUTATION_SUFFIX = '!'
10
10
  export const PREDICATE_SUFFIX = '?'
11
+ export const STATIC_TYPES = {
12
+ APPLICATION: 'Application',
13
+ UNKNOWN: 'Unknown',
14
+ ATOM: 'Atom',
15
+ COLLECTION: 'Collection',
16
+ PREDICATE: 'Predicate'
17
+ }
11
18
  export const KEYWORDS = {
12
19
  LOOP: 'loop',
13
20
  CREATE_ARRAY: 'array',
@@ -53,7 +60,8 @@ export const TYPES = {
53
60
  }
54
61
  export const RUNTIME_TYPES = {
55
62
  NUMBER: 'number',
56
- ARRAY: 'array'
63
+ ARRAY: 'array',
64
+ LAMBDA: 'lambda'
57
65
  }
58
66
  export const DEBUG = {
59
67
  STRING: 'string',