fez-lisp 1.5.50 → 1.5.52
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/README.md +19 -87
- package/favicon.svg +5 -0
- package/lib/baked/std.js +1 -1
- package/logo.svg +15 -5
- package/package.json +1 -1
- package/src/check.js +42 -140
- package/src/evaluator.js +10 -16
- package/src/interpreter.js +0 -7
- package/src/keywords.js +1 -2
- package/src/macros.js +95 -85
package/logo.svg
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
<svg width="
|
2
|
-
<path d="
|
3
|
-
<
|
4
|
-
<
|
5
|
-
<
|
1
|
+
<svg width="61" height="79" viewBox="0 0 61 79" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<path d="M58.8257 55.7684C63.4688 62.5468 57.2431 75.2357 42.5 78C34.5 79.5 2.00013 79.4982 2 64.3957C1.99984 45.77 28.6339 50.3503 39.5543 55.7684C56.8985 61.3234 54.329 49.2038 58.8257 55.7684Z" fill="#F9B949"/>
|
3
|
+
<circle cx="25.5" cy="35.5" r="25.5" fill="#F9B949"/>
|
4
|
+
<circle cx="36.5" cy="31.5" r="2.5" fill="#1F1B1B"/>
|
5
|
+
<circle cx="9.5" cy="21.5" r="2.5" fill="#1F1B1B"/>
|
6
|
+
<circle cx="10" cy="21" r="1" fill="#EBEBEB"/>
|
7
|
+
<circle cx="10" cy="21" r="1" fill="#EBEBEB"/>
|
8
|
+
<circle cx="10" cy="21" r="1" fill="#EBEBEB"/>
|
9
|
+
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
10
|
+
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
11
|
+
<circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
|
12
|
+
<path d="M11.6564 26.818C17.5013 31.4502 17.7946 23.2377 23.0134 28.6252C28.2321 34.0127 30.2289 37.3689 19.8597 35.7179C9.49045 34.0669 5.8115 22.1858 11.6564 26.818Z" fill="#B44637"/>
|
13
|
+
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
|
14
|
+
<path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
|
15
|
+
<path d="M51 15C46 13.5 54.6472 7.06417 48.8171 5" stroke="#F9B949" stroke-width="2" stroke-linecap="round"/>
|
6
16
|
</svg>
|
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -415,7 +415,7 @@ export const typeCheck = (ast) => {
|
|
415
415
|
[UNKNOWN, PLACEHOLDER],
|
416
416
|
[UNKNOWN, PLACEHOLDER]
|
417
417
|
],
|
418
|
-
[RETURNS]: [
|
418
|
+
[RETURNS]: [UNKNOWN]
|
419
419
|
}
|
420
420
|
},
|
421
421
|
[KEYWORDS.NOT]: {
|
@@ -541,13 +541,6 @@ export const typeCheck = (ast) => {
|
|
541
541
|
}
|
542
542
|
const errorStack = new Set()
|
543
543
|
const warningStack = new Set()
|
544
|
-
|
545
|
-
// const isDefinitionOfAFunction = (head, tail) =>
|
546
|
-
// head[TYPE] === APPLY &&
|
547
|
-
// head[VALUE] === KEYWORDS.DEFINE_VARIABLE &&
|
548
|
-
// tail.at(-1)[0][TYPE] === APPLY &&
|
549
|
-
// tail.at(-1)[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
|
550
|
-
|
551
544
|
const stack = []
|
552
545
|
const check = (exp, env, scope) => {
|
553
546
|
const [first, ...rest] = isLeaf(exp) ? [exp] : exp
|
@@ -563,12 +556,6 @@ export const typeCheck = (ast) => {
|
|
563
556
|
if (env[first[VALUE]] === undefined) {
|
564
557
|
errorStack.add(
|
565
558
|
`Trying to access undefined variable ${first[VALUE]} (check #11)`
|
566
|
-
|
567
|
-
// `Trying to access undefined variable ${
|
568
|
-
// first[VALUE]
|
569
|
-
// }\n${formatCallstack(
|
570
|
-
// key.chain.filter((x) => isNaN(Number(x[0])))
|
571
|
-
// )}\n(check #11)`
|
572
559
|
)
|
573
560
|
}
|
574
561
|
})
|
@@ -598,67 +585,64 @@ export const typeCheck = (ast) => {
|
|
598
585
|
case KEYWORDS.IF:
|
599
586
|
{
|
600
587
|
const re = rem.slice(2)
|
601
|
-
// If either is an ATOM then IF returns an ATOM
|
602
588
|
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
|
603
589
|
env[name][STATS][prop][0] = ATOM
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
// ? env[re[0][VALUE]]
|
615
|
-
// : env[re[0][0][VALUE]]
|
616
|
-
// const alternative = isLeaf(re[1])
|
617
|
-
// ? env[re[1][VALUE]]
|
618
|
-
// : env[re[1][0][VALUE]]
|
590
|
+
if (
|
591
|
+
getSuffix(re[0][VALUE]) === PREDICATE_SUFFIX ||
|
592
|
+
getSuffix(re[1][VALUE]) === PREDICATE_SUFFIX
|
593
|
+
)
|
594
|
+
env[name][STATS][RETURNS] = [ATOM, PREDICATE]
|
595
|
+
} else if (
|
596
|
+
!isLeaf(re[0]) &&
|
597
|
+
env[re[0][0][VALUE]] &&
|
598
|
+
env[re[0][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
|
599
|
+
) {
|
619
600
|
env[name][STATS][prop] =
|
620
601
|
env[re[0][0][VALUE]][STATS][RETURNS]
|
621
602
|
if (
|
622
603
|
re[0][0][TYPE] === APPLY &&
|
623
|
-
// turn off typechecks for optimized functions
|
624
604
|
!name.startsWith(OPTIMIZED_PREFIX)
|
625
605
|
) {
|
626
606
|
switch (re[0][0][VALUE]) {
|
627
607
|
case KEYWORDS.ANONYMOUS_FUNCTION:
|
628
|
-
// env[name][STATS][prop] =
|
629
|
-
// env[re[0][0][VALUE]][STATS][RETURNS]
|
630
|
-
// env[name][STATS][SUB_TYPE] =
|
631
|
-
// env[re[0][0][VALUE]][STATS][SUB_TYPE]
|
632
|
-
|
633
608
|
env[name][STATS][RETURNS] = [UNKNOWN]
|
634
609
|
env[name][STATS][ARGS_COUNT] =
|
635
610
|
re[0].length - 2
|
636
|
-
// check(
|
637
|
-
// [
|
638
|
-
// [APPLY, KEYWORDS.DEFINE_VARIABLE],
|
639
|
-
// [WORD, name],
|
640
|
-
// re[0]
|
641
|
-
// ],
|
642
|
-
// env,
|
643
|
-
// scope
|
644
|
-
// )
|
645
611
|
break
|
646
612
|
}
|
647
613
|
}
|
648
614
|
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
649
|
-
} else
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
615
|
+
} else if (
|
616
|
+
!isLeaf(re[1]) &&
|
617
|
+
env[re[1][0][VALUE]] &&
|
618
|
+
env[re[1][0][VALUE]][STATS][RETURNS][0] !== UNKNOWN
|
619
|
+
) {
|
620
|
+
env[name][STATS][prop] =
|
621
|
+
env[re[1][0][VALUE]][STATS][RETURNS]
|
622
|
+
if (
|
623
|
+
re[1][0][TYPE] === APPLY &&
|
624
|
+
!name.startsWith(OPTIMIZED_PREFIX)
|
625
|
+
) {
|
626
|
+
switch (re[1][0][VALUE]) {
|
627
|
+
case KEYWORDS.ANONYMOUS_FUNCTION:
|
628
|
+
env[name][STATS][RETURNS] = [UNKNOWN]
|
629
|
+
env[name][STATS][ARGS_COUNT] =
|
630
|
+
re[1].length - 2
|
631
|
+
break
|
632
|
+
}
|
660
633
|
}
|
661
|
-
|
634
|
+
// env[name][STATS] = env[re[0][0][VALUE]][STATS]
|
635
|
+
} else if (env[re[0][VALUE]]) {
|
636
|
+
env[name][STATS][prop][0] =
|
637
|
+
env[re[0][VALUE]][STATS][TYPE_PROP][0]
|
638
|
+
env[name][STATS][RETURNS][1] =
|
639
|
+
env[re[0][VALUE]][STATS][RETURNS][1]
|
640
|
+
} else if (env[re[1][VALUE]]) {
|
641
|
+
env[name][STATS][prop][1] =
|
642
|
+
env[re[1][VALUE]][STATS][TYPE_PROP][0]
|
643
|
+
env[name][STATS][RETURNS][1] =
|
644
|
+
env[re[1][VALUE]][STATS][RETURNS][1]
|
645
|
+
} else env[name][STATS][prop] = [UNKNOWN]
|
662
646
|
}
|
663
647
|
break
|
664
648
|
default:
|
@@ -690,9 +674,6 @@ export const typeCheck = (ast) => {
|
|
690
674
|
env[name][STATS][RETURNS][1] =
|
691
675
|
fn[STATS][RETURNS][1]
|
692
676
|
} else {
|
693
|
-
// const body = rest.at(-1).at(-1).at(-1).at(-1)
|
694
|
-
// const rem = hasBlock(body) ? body.at(-1) : body
|
695
|
-
// const returns = isLeaf(rem) ? rem : rem[0]
|
696
677
|
const [returns, rem] = drillReturnType(
|
697
678
|
rest.at(-1).at(-1).at(-1),
|
698
679
|
(returns) =>
|
@@ -977,7 +958,6 @@ export const typeCheck = (ast) => {
|
|
977
958
|
const alternative = isLeaf(re[1])
|
978
959
|
? copy[re[1][VALUE]]
|
979
960
|
: copy[re[1][0][VALUE]]
|
980
|
-
|
981
961
|
// todo check if condition matches alternative
|
982
962
|
if (
|
983
963
|
concequent &&
|
@@ -1003,7 +983,6 @@ export const typeCheck = (ast) => {
|
|
1003
983
|
}
|
1004
984
|
}
|
1005
985
|
// TODO overwrite return type check here
|
1006
|
-
// console.log(copy[SCOPE_NAME], env[copy[SCOPE_NAME]], copy)
|
1007
986
|
}
|
1008
987
|
}
|
1009
988
|
}
|
@@ -1056,15 +1035,9 @@ export const typeCheck = (ast) => {
|
|
1056
1035
|
if (args) {
|
1057
1036
|
for (let i = 0; i < args.length; ++i) {
|
1058
1037
|
// type check
|
1059
|
-
// todo finish this
|
1060
|
-
|
1061
1038
|
if (args[i][SUB] != undefined) {
|
1062
|
-
// first[TYPE] === APPLY &&
|
1063
|
-
// env[first[VALUE]][STATS][SUB_TYPE] === PREDICATE
|
1064
|
-
// args[i][SUB] = env[rest[i][VALUE]][SUB_TYPE]
|
1065
1039
|
if (isLeaf(rest[i])) {
|
1066
1040
|
if (rest[i][TYPE] === WORD) {
|
1067
|
-
// TODO finish this
|
1068
1041
|
if (
|
1069
1042
|
env[rest[i][VALUE]] &&
|
1070
1043
|
args[i][SUB] !==
|
@@ -1308,17 +1281,6 @@ export const typeCheck = (ast) => {
|
|
1308
1281
|
}
|
1309
1282
|
}
|
1310
1283
|
break
|
1311
|
-
// case APPLY:
|
1312
|
-
// errorStack.add(
|
1313
|
-
// `Incorrect type of arguments for (${
|
1314
|
-
// first[VALUE]
|
1315
|
-
// }). Expected (${toTypeNames(
|
1316
|
-
// expectedArgs[i][TYPE]
|
1317
|
-
// )}) but got (${toTypeNames(
|
1318
|
-
// rest[i][TYPE]
|
1319
|
-
// )}) (${stringifyArgs(exp)}) (check #5)`
|
1320
|
-
// )
|
1321
|
-
// break
|
1322
1284
|
case ATOM: {
|
1323
1285
|
if (rest[i][TYPE] !== expectedArgs[i][TYPE]) {
|
1324
1286
|
errorStack.add(
|
@@ -1335,53 +1297,6 @@ export const typeCheck = (ast) => {
|
|
1335
1297
|
}
|
1336
1298
|
}
|
1337
1299
|
}
|
1338
|
-
// if (
|
1339
|
-
// env[rest[i][VALUE]] &&
|
1340
|
-
// expectedArgs[i][TYPE] !== rest[i][TYPE]
|
1341
|
-
// ) {
|
1342
|
-
// switch (rest[i][TYPE]) {
|
1343
|
-
// // case UNKNOWN:
|
1344
|
-
// // env[first[VALUE]][STATS][TYPE_PROP][0] =
|
1345
|
-
// // expectedArgs[i][TYPE]
|
1346
|
-
// // break
|
1347
|
-
// case WORD:
|
1348
|
-
// const T =
|
1349
|
-
// env[rest[i][VALUE]][STATS][TYPE_PROP][0]
|
1350
|
-
// if (
|
1351
|
-
// T !== UNKNOWN &&
|
1352
|
-
// expectedArgs[i][TYPE] !== UNKNOWN &&
|
1353
|
-
// expectedArgs[i][TYPE] !== T
|
1354
|
-
// ) {
|
1355
|
-
// errorStack.add(
|
1356
|
-
// `Incorrect type of argument (${i}) for special form (${
|
1357
|
-
// first[VALUE]
|
1358
|
-
// }). Expected (${toTypeNames(
|
1359
|
-
// expectedArgs[i][TYPE]
|
1360
|
-
// )}) but got (${toTypeNames(
|
1361
|
-
// T
|
1362
|
-
// )}) (${stringifyArgs(exp)}) (check #3.1)`
|
1363
|
-
// )
|
1364
|
-
// } else {
|
1365
|
-
// env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
|
1366
|
-
// expectedArgs[i][TYPE]
|
1367
|
-
// }
|
1368
|
-
// break
|
1369
|
-
// case APPLY:
|
1370
|
-
// case ATOM:
|
1371
|
-
// errorStack.add(
|
1372
|
-
// `Incorrect type of arguments for (${
|
1373
|
-
// first[VALUE]
|
1374
|
-
// }). Expected (${toTypeNames(
|
1375
|
-
// expectedArgs[i][TYPE]
|
1376
|
-
// )}) but got (${toTypeNames(
|
1377
|
-
// rest[i][TYPE]
|
1378
|
-
// )}) (${stringifyArgs(exp)}) (check #5)`
|
1379
|
-
// )
|
1380
|
-
// break
|
1381
|
-
// }
|
1382
|
-
// } else {
|
1383
|
-
// // TIDI fugyre iyt wgat ti di gere
|
1384
|
-
// }
|
1385
1300
|
}
|
1386
1301
|
}
|
1387
1302
|
// type checking
|
@@ -1452,20 +1367,7 @@ export const typeCheck = (ast) => {
|
|
1452
1367
|
)}) (${stringifyArgs(exp)}) (check #4)`
|
1453
1368
|
)
|
1454
1369
|
}
|
1455
|
-
// TODO figure out
|
1456
|
-
// else {
|
1457
|
-
// if (
|
1458
|
-
// rest[i].length &&
|
1459
|
-
// env[rest[i][0][VALUE]] &&
|
1460
|
-
// args[i][STATS][TYPE_PROP][0] === UNKNOWN &&
|
1461
|
-
// env[rest[i][0][VALUE]][STATS].retried < RETRY_COUNT
|
1462
|
-
// ) {
|
1463
|
-
// env[rest[i][0][VALUE]][STATS].retried += 1
|
1464
|
-
// if (!scope[SCOPE_NAME])
|
1465
|
-
// scope[SCOPE_NAME] = scope[1][VALUE]
|
1466
|
-
// stack.unshift(() => check(exp, env, scope))
|
1467
|
-
// }
|
1468
|
-
// }
|
1370
|
+
// TODO figure out what cann we do in this else ?
|
1469
1371
|
}
|
1470
1372
|
}
|
1471
1373
|
}
|
package/src/evaluator.js
CHANGED
@@ -1,14 +1,5 @@
|
|
1
1
|
import { keywords } from './interpreter.js'
|
2
|
-
import {
|
3
|
-
APPLY,
|
4
|
-
ATOM,
|
5
|
-
DEBUG,
|
6
|
-
KEYWORDS,
|
7
|
-
SPECIAL_FORMS_SET,
|
8
|
-
TYPE,
|
9
|
-
VALUE,
|
10
|
-
WORD
|
11
|
-
} from './keywords.js'
|
2
|
+
import { APPLY, ATOM, KEYWORDS, TYPE, VALUE, WORD } from './keywords.js'
|
12
3
|
import { isLeaf } from './parser.js'
|
13
4
|
import { stringifyArgs } from './utils.js'
|
14
5
|
export const evaluate = (exp, env = keywords) => {
|
@@ -23,23 +14,26 @@ export const evaluate = (exp, env = keywords) => {
|
|
23
14
|
case WORD: {
|
24
15
|
const word = env[value]
|
25
16
|
if (word == undefined)
|
26
|
-
throw new ReferenceError(
|
17
|
+
throw new ReferenceError(
|
18
|
+
`Undefined variable ${value} (${stringifyArgs(exp)})`
|
19
|
+
)
|
27
20
|
return word
|
28
21
|
}
|
29
22
|
case APPLY: {
|
30
23
|
const apply = env[value]
|
31
24
|
if (apply == undefined)
|
32
25
|
throw new ReferenceError(
|
33
|
-
`Undefined (${
|
26
|
+
`Undefined (${
|
27
|
+
KEYWORDS.ANONYMOUS_FUNCTION
|
28
|
+
}) (${value}) (${stringifyArgs(exp)})`
|
34
29
|
)
|
35
30
|
if (typeof apply !== 'function')
|
36
31
|
throw new TypeError(
|
37
|
-
`${value} is not a (${KEYWORDS.ANONYMOUS_FUNCTION})
|
32
|
+
`${value} is not a (${KEYWORDS.ANONYMOUS_FUNCTION}) (${stringifyArgs(
|
33
|
+
exp
|
34
|
+
)})`
|
38
35
|
)
|
39
|
-
const isSpecial = SPECIAL_FORMS_SET.has(value)
|
40
36
|
const result = apply(tail, env, value)
|
41
|
-
if (!isSpecial && Array.isArray(env[DEBUG.CALLSTACK]))
|
42
|
-
env[DEBUG.CALLSTACK].pop()
|
43
37
|
return result
|
44
38
|
}
|
45
39
|
case ATOM:
|
package/src/interpreter.js
CHANGED
@@ -7,7 +7,6 @@ import {
|
|
7
7
|
TRUE,
|
8
8
|
TYPES,
|
9
9
|
RUNTIME_TYPES,
|
10
|
-
DEBUG,
|
11
10
|
STATIC_TYPES
|
12
11
|
} from './keywords.js'
|
13
12
|
import { evaluate } from './evaluator.js'
|
@@ -755,12 +754,6 @@ export const keywords = {
|
|
755
754
|
const value = evaluate(props[i], scope)
|
756
755
|
localEnv[params[i][VALUE]] = value
|
757
756
|
}
|
758
|
-
if (
|
759
|
-
name &&
|
760
|
-
Array.isArray(env[DEBUG.CALLSTACK]) &&
|
761
|
-
name !== env[DEBUG.CALLSTACK].at(-1)
|
762
|
-
)
|
763
|
-
env[DEBUG.CALLSTACK].push(name)
|
764
757
|
return evaluate(body, localEnv)
|
765
758
|
}
|
766
759
|
},
|
package/src/keywords.js
CHANGED
@@ -69,8 +69,7 @@ export const DEBUG = {
|
|
69
69
|
ASSERT: 'assert',
|
70
70
|
SIGNATURE: '?',
|
71
71
|
LIST_THEMES: 'theme?',
|
72
|
-
SET_THEME: 'theme!'
|
73
|
-
CALLSTACK: '(CALLSTACK)' // so that you can't use it in the code
|
72
|
+
SET_THEME: 'theme!'
|
74
73
|
}
|
75
74
|
|
76
75
|
export const SPECIAL_FORMS_SET = new Set(Object.values(KEYWORDS))
|
package/src/macros.js
CHANGED
@@ -11,6 +11,7 @@ import {
|
|
11
11
|
KEYWORDS,
|
12
12
|
PLACEHOLDER,
|
13
13
|
PREDICATE_SUFFIX,
|
14
|
+
STATIC_TYPES,
|
14
15
|
TRUE,
|
15
16
|
TYPE,
|
16
17
|
VALUE,
|
@@ -529,7 +530,7 @@ export const deSuggarAst = (ast, scope) => {
|
|
529
530
|
)
|
530
531
|
}
|
531
532
|
const args = last.slice(1, -1)
|
532
|
-
const newName = `${OPTIMIZED_PREFIX}
|
533
|
+
const newName = `${OPTIMIZED_PREFIX}${name}::*${performance
|
533
534
|
.now()
|
534
535
|
.toString()
|
535
536
|
.replace('.', 0)}*`
|
@@ -549,76 +550,79 @@ export const deSuggarAst = (ast, scope) => {
|
|
549
550
|
)
|
550
551
|
|
551
552
|
exp[exp.length - 1] = [
|
552
|
-
[APPLY,
|
553
|
+
[APPLY, STATIC_TYPES.UNKNOWN],
|
553
554
|
[
|
554
|
-
[APPLY, KEYWORDS.
|
555
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
555
556
|
[
|
556
|
-
[APPLY, KEYWORDS.
|
557
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
557
558
|
[
|
558
|
-
[APPLY, KEYWORDS.
|
559
|
-
[
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
[
|
575
|
-
[WORD, '*fn*'],
|
559
|
+
[APPLY, KEYWORDS.BLOCK],
|
560
|
+
[
|
561
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
562
|
+
[WORD, newName],
|
563
|
+
last
|
564
|
+
],
|
565
|
+
args.length < 5
|
566
|
+
? [
|
567
|
+
[
|
568
|
+
APPLY,
|
569
|
+
`optimization:tail-calls-${args.length}`
|
570
|
+
],
|
571
|
+
[WORD, newName]
|
572
|
+
]
|
573
|
+
: [
|
574
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
575
|
+
[WORD, newName],
|
576
576
|
[
|
577
577
|
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
578
|
-
|
578
|
+
[WORD, '*fn*'],
|
579
579
|
[
|
580
|
-
[APPLY, KEYWORDS.
|
581
|
-
|
582
|
-
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
583
|
-
[WORD, '*res*'],
|
584
|
-
[
|
585
|
-
[APPLY, KEYWORDS.CREATE_ARRAY],
|
586
|
-
[[APPLY, '*fn*'], ...args]
|
587
|
-
]
|
588
|
-
],
|
580
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
581
|
+
...args,
|
589
582
|
[
|
590
|
-
[APPLY, KEYWORDS.
|
583
|
+
[APPLY, KEYWORDS.BLOCK],
|
591
584
|
[
|
592
|
-
[APPLY, KEYWORDS.
|
585
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
586
|
+
[WORD, '*res*'],
|
593
587
|
[
|
594
|
-
[APPLY, KEYWORDS.
|
595
|
-
[
|
596
|
-
[ATOM, 0]
|
588
|
+
[APPLY, KEYWORDS.CREATE_ARRAY],
|
589
|
+
[[APPLY, '*fn*'], ...args]
|
597
590
|
]
|
598
591
|
],
|
599
592
|
[
|
600
|
-
[APPLY, KEYWORDS.
|
601
|
-
[WORD, '*res*'],
|
602
|
-
[ATOM, 0],
|
593
|
+
[APPLY, KEYWORDS.LOOP],
|
603
594
|
[
|
604
|
-
[APPLY, KEYWORDS.
|
595
|
+
[APPLY, KEYWORDS.IS_LAMBDA],
|
605
596
|
[
|
606
597
|
[APPLY, KEYWORDS.GET_ARRAY],
|
607
598
|
[WORD, '*res*'],
|
608
599
|
[ATOM, 0]
|
609
600
|
]
|
601
|
+
],
|
602
|
+
[
|
603
|
+
[APPLY, KEYWORDS.SET_ARRAY],
|
604
|
+
[WORD, '*res*'],
|
605
|
+
[ATOM, 0],
|
606
|
+
[
|
607
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
608
|
+
[
|
609
|
+
[APPLY, KEYWORDS.GET_ARRAY],
|
610
|
+
[WORD, '*res*'],
|
611
|
+
[ATOM, 0]
|
612
|
+
]
|
613
|
+
]
|
610
614
|
]
|
615
|
+
],
|
616
|
+
[
|
617
|
+
[APPLY, KEYWORDS.GET_ARRAY],
|
618
|
+
[WORD, '*res*'],
|
619
|
+
[ATOM, 0]
|
611
620
|
]
|
612
|
-
],
|
613
|
-
[
|
614
|
-
[APPLY, KEYWORDS.GET_ARRAY],
|
615
|
-
[WORD, '*res*'],
|
616
|
-
[ATOM, 0]
|
617
621
|
]
|
618
622
|
]
|
619
623
|
]
|
620
624
|
]
|
621
|
-
|
625
|
+
]
|
622
626
|
]
|
623
627
|
]
|
624
628
|
]
|
@@ -630,7 +634,7 @@ export const deSuggarAst = (ast, scope) => {
|
|
630
634
|
)
|
631
635
|
}
|
632
636
|
const args = last.slice(1, -1)
|
633
|
-
const newName = `${OPTIMIZED_PREFIX}
|
637
|
+
const newName = `${OPTIMIZED_PREFIX}${name}::*${performance
|
634
638
|
.now()
|
635
639
|
.toString()
|
636
640
|
.replace('.', 0)}*`
|
@@ -647,55 +651,61 @@ export const deSuggarAst = (ast, scope) => {
|
|
647
651
|
const keyName = newName + ':key'
|
648
652
|
|
649
653
|
exp[exp.length - 1] = [
|
650
|
-
[APPLY,
|
654
|
+
[APPLY, STATIC_TYPES.UNKNOWN],
|
651
655
|
[
|
652
|
-
[APPLY, KEYWORDS.
|
656
|
+
[APPLY, KEYWORDS.CALL_FUNCTION],
|
653
657
|
[
|
654
|
-
[APPLY, KEYWORDS.
|
655
|
-
[
|
656
|
-
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
657
|
-
[WORD, memoName],
|
658
|
-
[[APPLY, 'new:map64']]
|
659
|
-
],
|
658
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
660
659
|
[
|
661
|
-
[APPLY, KEYWORDS.
|
662
|
-
[
|
660
|
+
[APPLY, KEYWORDS.BLOCK],
|
661
|
+
[
|
662
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
663
|
+
[WORD, memoName],
|
664
|
+
[[APPLY, 'new:map64']]
|
665
|
+
],
|
663
666
|
[
|
664
|
-
[APPLY, KEYWORDS.
|
665
|
-
|
667
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
668
|
+
[WORD, newName],
|
666
669
|
[
|
667
|
-
[APPLY, KEYWORDS.
|
670
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
671
|
+
...args,
|
668
672
|
[
|
669
|
-
[APPLY, KEYWORDS.
|
670
|
-
[WORD, keyName],
|
673
|
+
[APPLY, KEYWORDS.BLOCK],
|
671
674
|
[
|
672
|
-
[APPLY,
|
673
|
-
[
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
[WORD, keyName]
|
682
|
-
],
|
683
|
-
[
|
684
|
-
[APPLY, 'map:get'],
|
685
|
-
[WORD, memoName],
|
686
|
-
[WORD, keyName]
|
675
|
+
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
676
|
+
[WORD, keyName],
|
677
|
+
[
|
678
|
+
[APPLY, 'from:string-or-number->key'],
|
679
|
+
[
|
680
|
+
[APPLY, KEYWORDS.CREATE_ARRAY],
|
681
|
+
...args
|
682
|
+
]
|
683
|
+
]
|
687
684
|
],
|
688
685
|
[
|
689
|
-
[APPLY,
|
690
|
-
[
|
691
|
-
|
692
|
-
|
686
|
+
[APPLY, KEYWORDS.IF],
|
687
|
+
[
|
688
|
+
[APPLY, 'map:exists?'],
|
689
|
+
[WORD, memoName],
|
690
|
+
[WORD, keyName]
|
691
|
+
],
|
692
|
+
[
|
693
|
+
[APPLY, 'map:get'],
|
694
|
+
[WORD, memoName],
|
695
|
+
[WORD, keyName]
|
696
|
+
],
|
697
|
+
[
|
698
|
+
[APPLY, 'map:set-and-get!'],
|
699
|
+
[WORD, memoName],
|
700
|
+
[WORD, keyName],
|
701
|
+
last.at(-1)
|
702
|
+
]
|
693
703
|
]
|
694
704
|
]
|
695
705
|
]
|
696
|
-
]
|
697
|
-
|
698
|
-
|
706
|
+
],
|
707
|
+
[WORD, newName]
|
708
|
+
]
|
699
709
|
]
|
700
710
|
]
|
701
711
|
]
|