fez-lisp 1.5.43 → 1.5.44
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 +82 -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,64 @@ 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
|
-
env[
|
550
|
-
env[
|
551
|
-
|
552
|
-
env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
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 (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
545
|
+
env[name][STATS][prop] = ATOM
|
546
|
+
// if (
|
547
|
+
// re[0][VALUE] === FALSE ||
|
548
|
+
// re[0][VALUE] === TRUE ||
|
549
|
+
// re[1][VALUE] === FALSE ||
|
550
|
+
// re[1][VALUE] === TRUE
|
551
|
+
// ) {
|
552
|
+
// env[name][STATS][SUB_TYPE] = PREDICATE
|
553
|
+
// }
|
554
|
+
} else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
|
555
|
+
env[name][STATS][prop] =
|
556
|
+
env[re[0][0][VALUE]][STATS][RETURNS]
|
557
557
|
env[name][STATS][SUB_TYPE] =
|
558
|
-
env[re[0][VALUE]][STATS][SUB_TYPE]
|
558
|
+
env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
559
|
+
|
560
|
+
if (
|
561
|
+
re[0][0][TYPE] === APPLY &&
|
562
|
+
// turn off typechecks for optimized functions
|
563
|
+
!name.startsWith(OPTIMIZED_PREFIX)
|
564
|
+
) {
|
565
|
+
switch (re[0][0][VALUE]) {
|
566
|
+
case KEYWORDS.ANONYMOUS_FUNCTION:
|
567
|
+
// env[name][STATS][prop] =
|
568
|
+
// env[re[0][0][VALUE]][STATS][RETURNS]
|
569
|
+
// env[name][STATS][SUB_TYPE] =
|
570
|
+
// env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
571
|
+
|
572
|
+
env[name][STATS][RETURNS] = UNKNOWN
|
573
|
+
env[name][STATS][ARGS_COUNT] =
|
574
|
+
re[0].length - 2
|
575
|
+
// check(
|
576
|
+
// [
|
577
|
+
// [APPLY, KEYWORDS.DEFINE_VARIABLE],
|
578
|
+
// [WORD, name],
|
579
|
+
// re[0]
|
580
|
+
// ],
|
581
|
+
// env,
|
582
|
+
// scope
|
583
|
+
// )
|
584
|
+
break
|
585
|
+
}
|
586
|
+
}
|
587
|
+
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
559
588
|
} else {
|
560
|
-
env[
|
561
|
-
|
589
|
+
if (env[re[0][VALUE]]) {
|
590
|
+
env[name][STATS][prop] =
|
591
|
+
env[re[0][VALUE]][STATS].type
|
592
|
+
env[name][STATS][SUB_TYPE] =
|
593
|
+
env[re[0][VALUE]][STATS][SUB_TYPE]
|
594
|
+
// env[name][STATS] = env[name][STATS]
|
595
|
+
// env[re[0][VALUE]][STATS][SUB_TYPE]
|
596
|
+
} else {
|
597
|
+
env[name][STATS][prop] = UNKNOWN
|
598
|
+
// env[name][STATS][RETURNS] = APPLY
|
599
|
+
}
|
562
600
|
}
|
563
601
|
}
|
564
602
|
break
|
@@ -789,6 +827,13 @@ export const typeCheck = (ast) => {
|
|
789
827
|
isPredicate
|
790
828
|
)
|
791
829
|
}
|
830
|
+
} else {
|
831
|
+
// TIODO finish this
|
832
|
+
const body = rest.at(-1)
|
833
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
834
|
+
const returns = isLeaf(rem) ? rem : rem[0]
|
835
|
+
resolveRetunType(returns, rem, TYPE_PROP, isPredicate)
|
836
|
+
// console.log({ name })
|
792
837
|
}
|
793
838
|
if (env[right[VALUE]]?.[STATS]?.[SUB_TYPE]) {
|
794
839
|
if (
|
@@ -1105,7 +1150,7 @@ export const typeCheck = (ast) => {
|
|
1105
1150
|
// console.log(env[CAR][STATS], expectedArgs[i][TYPE])
|
1106
1151
|
errorStack.set(
|
1107
1152
|
key.str,
|
1108
|
-
`Incorrect type of
|
1153
|
+
`Incorrect type of argument (${i}) for special form (${
|
1109
1154
|
first[VALUE]
|
1110
1155
|
}). Expected (${toTypeNames(
|
1111
1156
|
expectedArgs[i][TYPE]
|
@@ -1226,7 +1271,7 @@ export const typeCheck = (ast) => {
|
|
1226
1271
|
args[i][STATS].type
|
1227
1272
|
)}) but got (${toTypeNames(T)}) (${stringifyArgs(
|
1228
1273
|
exp
|
1229
|
-
)})`
|
1274
|
+
)}) (check #30)`
|
1230
1275
|
)
|
1231
1276
|
} else {
|
1232
1277
|
// env[rest[i][VALUE]][STATS] THiss SHOULD BE
|
@@ -1284,6 +1329,7 @@ export const typeCheck = (ast) => {
|
|
1284
1329
|
}
|
1285
1330
|
}
|
1286
1331
|
})
|
1332
|
+
// console.log(env)
|
1287
1333
|
for (const r of rest) check(r, env, scope)
|
1288
1334
|
break
|
1289
1335
|
}
|
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)}*`
|