fez-lisp 1.5.43 → 1.5.45
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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +83 -36
- package/src/macros.js +3 -2
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -13,6 +13,7 @@ import {
|
|
13
13
|
VALUE,
|
14
14
|
WORD
|
15
15
|
} from './keywords.js'
|
16
|
+
import { OPTIMIZED_PREFIX } from './macros.js'
|
16
17
|
import { isLeaf } from './parser.js'
|
17
18
|
import {
|
18
19
|
getSuffix,
|
@@ -30,6 +31,7 @@ const SCOPE_NAME = '__scope__'
|
|
30
31
|
const SUB_TYPE = 'subType'
|
31
32
|
const TYPE_PROP = 'type'
|
32
33
|
const PREDICATE = 3
|
34
|
+
const COLLECTION = 4
|
33
35
|
const RETRY_COUNT = 1
|
34
36
|
const DEFINITON_RETRY_COUNT = 1
|
35
37
|
const SUB = 2
|
@@ -43,6 +45,8 @@ const toTypeNames = (type) => {
|
|
43
45
|
return 'Uknown'
|
44
46
|
case PREDICATE:
|
45
47
|
return 'Predicate'
|
48
|
+
case COLLECTION:
|
49
|
+
return 'Collection'
|
46
50
|
}
|
47
51
|
}
|
48
52
|
export const typeCheck = (ast) => {
|
@@ -53,7 +57,7 @@ export const typeCheck = (ast) => {
|
|
53
57
|
retried: 0,
|
54
58
|
[ARGS]: [
|
55
59
|
[UNKNOWN, PLACEHOLDER],
|
56
|
-
[
|
60
|
+
[COLLECTION, PLACEHOLDER]
|
57
61
|
],
|
58
62
|
[ARGS_COUNT]: 2,
|
59
63
|
[RETURNS]: UNKNOWN
|
@@ -63,8 +67,9 @@ export const typeCheck = (ast) => {
|
|
63
67
|
[STATS]: {
|
64
68
|
type: APPLY,
|
65
69
|
retried: 0,
|
66
|
-
[ARGS_COUNT]:
|
67
|
-
[
|
70
|
+
[ARGS_COUNT]: 1,
|
71
|
+
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
72
|
+
[RETURNS]: COLLECTION
|
68
73
|
}
|
69
74
|
},
|
70
75
|
[DEBUG.ASSERT]: {
|
@@ -128,7 +133,7 @@ export const typeCheck = (ast) => {
|
|
128
133
|
type: APPLY,
|
129
134
|
retried: 0,
|
130
135
|
[ARGS_COUNT]: VARIADIC,
|
131
|
-
[RETURNS]:
|
136
|
+
[RETURNS]: COLLECTION
|
132
137
|
}
|
133
138
|
},
|
134
139
|
[KEYWORDS.LOOP]: {
|
@@ -278,7 +283,7 @@ export const typeCheck = (ast) => {
|
|
278
283
|
retried: 0,
|
279
284
|
[ARGS_COUNT]: 2,
|
280
285
|
[ARGS]: [
|
281
|
-
[
|
286
|
+
[COLLECTION, PLACEHOLDER],
|
282
287
|
[ATOM, PLACEHOLDER]
|
283
288
|
],
|
284
289
|
[RETURNS]: UNKNOWN
|
@@ -290,11 +295,11 @@ export const typeCheck = (ast) => {
|
|
290
295
|
retried: 0,
|
291
296
|
[ARGS_COUNT]: 3,
|
292
297
|
[ARGS]: [
|
293
|
-
[
|
298
|
+
[COLLECTION, PLACEHOLDER],
|
294
299
|
[ATOM, PLACEHOLDER],
|
295
300
|
[UNKNOWN, PLACEHOLDER]
|
296
301
|
],
|
297
|
-
[RETURNS]:
|
302
|
+
[RETURNS]: COLLECTION
|
298
303
|
}
|
299
304
|
},
|
300
305
|
[KEYWORDS.POP_ARRAY]: {
|
@@ -302,8 +307,8 @@ export const typeCheck = (ast) => {
|
|
302
307
|
type: APPLY,
|
303
308
|
retried: 0,
|
304
309
|
[ARGS_COUNT]: 1,
|
305
|
-
[ARGS]: [[
|
306
|
-
[RETURNS]:
|
310
|
+
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
311
|
+
[RETURNS]: COLLECTION
|
307
312
|
}
|
308
313
|
},
|
309
314
|
[KEYWORDS.ARRAY_LENGTH]: {
|
@@ -311,7 +316,7 @@ export const typeCheck = (ast) => {
|
|
311
316
|
type: APPLY,
|
312
317
|
retried: 0,
|
313
318
|
[ARGS_COUNT]: 1,
|
314
|
-
[ARGS]: [[
|
319
|
+
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
315
320
|
[RETURNS]: ATOM
|
316
321
|
}
|
317
322
|
},
|
@@ -454,7 +459,7 @@ export const typeCheck = (ast) => {
|
|
454
459
|
type: APPLY,
|
455
460
|
retried: 0,
|
456
461
|
[ARGS_COUNT]: 1,
|
457
|
-
[ARGS]: [[
|
462
|
+
[ARGS]: [[COLLECTION, PLACEHOLDER]],
|
458
463
|
[RETURNS]: UNKNOWN
|
459
464
|
}
|
460
465
|
}
|
@@ -534,31 +539,65 @@ export const typeCheck = (ast) => {
|
|
534
539
|
} else {
|
535
540
|
switch (returns[VALUE]) {
|
536
541
|
case KEYWORDS.IF:
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
} else {
|
554
|
-
if (env[re[0][VALUE]]) {
|
555
|
-
env[name][STATS][RETURNS] =
|
556
|
-
env[re[0][VALUE]][STATS].type
|
542
|
+
{
|
543
|
+
const re = rem.slice(2)
|
544
|
+
// If either is an ATOM then IF returns an ATOM
|
545
|
+
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
546
|
+
env[name][STATS][prop] = ATOM
|
547
|
+
// if (
|
548
|
+
// re[0][VALUE] === FALSE ||
|
549
|
+
// re[0][VALUE] === TRUE ||
|
550
|
+
// re[1][VALUE] === FALSE ||
|
551
|
+
// re[1][VALUE] === TRUE
|
552
|
+
// ) {
|
553
|
+
// env[name][STATS][SUB_TYPE] = PREDICATE
|
554
|
+
// }
|
555
|
+
} else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
|
556
|
+
env[name][STATS][prop] =
|
557
|
+
env[re[0][0][VALUE]][STATS][RETURNS]
|
557
558
|
env[name][STATS][SUB_TYPE] =
|
558
|
-
env[re[0][VALUE]][STATS][SUB_TYPE]
|
559
|
+
env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
560
|
+
|
561
|
+
if (
|
562
|
+
re[0][0][TYPE] === APPLY &&
|
563
|
+
// turn off typechecks for optimized functions
|
564
|
+
!name.startsWith(OPTIMIZED_PREFIX)
|
565
|
+
) {
|
566
|
+
switch (re[0][0][VALUE]) {
|
567
|
+
case KEYWORDS.ANONYMOUS_FUNCTION:
|
568
|
+
// env[name][STATS][prop] =
|
569
|
+
// env[re[0][0][VALUE]][STATS][RETURNS]
|
570
|
+
// env[name][STATS][SUB_TYPE] =
|
571
|
+
// env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
572
|
+
|
573
|
+
env[name][STATS][RETURNS] = UNKNOWN
|
574
|
+
env[name][STATS][ARGS_COUNT] =
|
575
|
+
re[0].length - 2
|
576
|
+
// check(
|
577
|
+
// [
|
578
|
+
// [APPLY, KEYWORDS.DEFINE_VARIABLE],
|
579
|
+
// [WORD, name],
|
580
|
+
// re[0]
|
581
|
+
// ],
|
582
|
+
// env,
|
583
|
+
// scope
|
584
|
+
// )
|
585
|
+
break
|
586
|
+
}
|
587
|
+
}
|
588
|
+
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
559
589
|
} else {
|
560
|
-
env[
|
561
|
-
|
590
|
+
if (env[re[0][VALUE]]) {
|
591
|
+
env[name][STATS][prop] =
|
592
|
+
env[re[0][VALUE]][STATS].type
|
593
|
+
env[name][STATS][SUB_TYPE] =
|
594
|
+
env[re[0][VALUE]][STATS][SUB_TYPE]
|
595
|
+
// env[name][STATS] = env[name][STATS]
|
596
|
+
// env[re[0][VALUE]][STATS][SUB_TYPE]
|
597
|
+
} else {
|
598
|
+
env[name][STATS][prop] = UNKNOWN
|
599
|
+
// env[name][STATS][RETURNS] = APPLY
|
600
|
+
}
|
562
601
|
}
|
563
602
|
}
|
564
603
|
break
|
@@ -789,6 +828,13 @@ export const typeCheck = (ast) => {
|
|
789
828
|
isPredicate
|
790
829
|
)
|
791
830
|
}
|
831
|
+
} else {
|
832
|
+
// TIODO finish this
|
833
|
+
const body = rest.at(-1)
|
834
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
835
|
+
const returns = isLeaf(rem) ? rem : rem[0]
|
836
|
+
resolveRetunType(returns, rem, TYPE_PROP, isPredicate)
|
837
|
+
// console.log({ name })
|
792
838
|
}
|
793
839
|
if (env[right[VALUE]]?.[STATS]?.[SUB_TYPE]) {
|
794
840
|
if (
|
@@ -1105,7 +1151,7 @@ export const typeCheck = (ast) => {
|
|
1105
1151
|
// console.log(env[CAR][STATS], expectedArgs[i][TYPE])
|
1106
1152
|
errorStack.set(
|
1107
1153
|
key.str,
|
1108
|
-
`Incorrect type of
|
1154
|
+
`Incorrect type of argument (${i}) for special form (${
|
1109
1155
|
first[VALUE]
|
1110
1156
|
}). Expected (${toTypeNames(
|
1111
1157
|
expectedArgs[i][TYPE]
|
@@ -1226,7 +1272,7 @@ export const typeCheck = (ast) => {
|
|
1226
1272
|
args[i][STATS].type
|
1227
1273
|
)}) but got (${toTypeNames(T)}) (${stringifyArgs(
|
1228
1274
|
exp
|
1229
|
-
)})`
|
1275
|
+
)}) (check #30)`
|
1230
1276
|
)
|
1231
1277
|
} else {
|
1232
1278
|
// env[rest[i][VALUE]][STATS] THiss SHOULD BE
|
@@ -1284,6 +1330,7 @@ export const typeCheck = (ast) => {
|
|
1284
1330
|
}
|
1285
1331
|
}
|
1286
1332
|
})
|
1333
|
+
// console.log(env)
|
1287
1334
|
for (const r of rest) check(r, env, scope)
|
1288
1335
|
break
|
1289
1336
|
}
|
package/src/macros.js
CHANGED
@@ -33,6 +33,7 @@ export const OPTIMIZATIONS = {
|
|
33
33
|
RECURSION: 'recursive',
|
34
34
|
CACHE: 'memoized'
|
35
35
|
}
|
36
|
+
export const OPTIMIZED_PREFIX = 'optimized-lambda::'
|
36
37
|
const deepTransform = (predicate, transform, tree) => {
|
37
38
|
if (!isLeaf(tree))
|
38
39
|
for (const leaf of tree) {
|
@@ -530,7 +531,7 @@ export const deSuggarAst = (ast, scope) => {
|
|
530
531
|
)
|
531
532
|
}
|
532
533
|
const args = last.slice(1, -1)
|
533
|
-
const newName =
|
534
|
+
const newName = `${OPTIMIZED_PREFIX}*${performance
|
534
535
|
.now()
|
535
536
|
.toString()
|
536
537
|
.replace('.', 0)}*`
|
@@ -631,7 +632,7 @@ export const deSuggarAst = (ast, scope) => {
|
|
631
632
|
)
|
632
633
|
}
|
633
634
|
const args = last.slice(1, -1)
|
634
|
-
const newName =
|
635
|
+
const newName = `${OPTIMIZED_PREFIX}*${performance
|
635
636
|
.now()
|
636
637
|
.toString()
|
637
638
|
.replace('.', 0)}*`
|