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/logo.svg CHANGED
@@ -1,6 +1,16 @@
1
- <svg width="144" height="128" viewBox="0 0 144 128" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M128 0H0V128H128V0Z" fill="#B44637"/>
3
- <path d="M128 0H96V128H128V0Z" fill="#8E2F22"/>
4
- <path d="M112 0H128V64H112V0Z" fill="#D6C096"/>
5
- <path d="M128 64H144V80H128V64Z" fill="#D6C096"/>
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
@@ -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.50",
5
+ "version": "1.5.52",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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]: [ATOM]
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
- // if (
605
- // re[0][VALUE] === FALSE ||
606
- // re[0][VALUE] === TRUE ||
607
- // re[1][VALUE] === FALSE ||
608
- // re[1][VALUE] === TRUE
609
- // ) {
610
- // env[name][STATS][RETURNS][1] = PREDICATE
611
- // }
612
- } else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
613
- // const concequent = isLeaf(re[0])
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
- if (env[re[0][VALUE]]) {
651
- env[name][STATS][prop][0] =
652
- env[re[0][VALUE]][STATS][TYPE_PROP][0]
653
- env[name][STATS][RETURNS][1] =
654
- env[re[0][VALUE]][STATS][RETURNS][1]
655
- // env[name][STATS] = env[name][STATS]
656
- // env[re[0][VALUE]][STATS][SUB_TYPE]
657
- } else {
658
- env[name][STATS][prop] = [UNKNOWN]
659
- // env[name][STATS][RETURNS] = APPLY
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 why we don't need this anymore
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(`Undefined variable ${value}`)
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 (${KEYWORDS.ANONYMOUS_FUNCTION}) (${value})`
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:
@@ -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}*${performance
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, KEYWORDS.CALL_FUNCTION],
553
+ [APPLY, STATIC_TYPES.UNKNOWN],
553
554
  [
554
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
555
+ [APPLY, KEYWORDS.CALL_FUNCTION],
555
556
  [
556
- [APPLY, KEYWORDS.BLOCK],
557
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
557
558
  [
558
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
559
- [WORD, newName],
560
- last
561
- ],
562
- args.length < 5
563
- ? [
564
- [
565
- APPLY,
566
- `optimization:tail-calls-${args.length}`
567
- ],
568
- [WORD, newName]
569
- ]
570
- : [
571
- [APPLY, KEYWORDS.CALL_FUNCTION],
572
- [WORD, newName],
573
- [
574
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
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
- ...args,
578
+ [WORD, '*fn*'],
579
579
  [
580
- [APPLY, KEYWORDS.BLOCK],
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.LOOP],
583
+ [APPLY, KEYWORDS.BLOCK],
591
584
  [
592
- [APPLY, KEYWORDS.IS_LAMBDA],
585
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
586
+ [WORD, '*res*'],
593
587
  [
594
- [APPLY, KEYWORDS.GET_ARRAY],
595
- [WORD, '*res*'],
596
- [ATOM, 0]
588
+ [APPLY, KEYWORDS.CREATE_ARRAY],
589
+ [[APPLY, '*fn*'], ...args]
597
590
  ]
598
591
  ],
599
592
  [
600
- [APPLY, KEYWORDS.SET_ARRAY],
601
- [WORD, '*res*'],
602
- [ATOM, 0],
593
+ [APPLY, KEYWORDS.LOOP],
603
594
  [
604
- [APPLY, KEYWORDS.CALL_FUNCTION],
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}*${performance
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, KEYWORDS.CALL_FUNCTION],
654
+ [APPLY, STATIC_TYPES.UNKNOWN],
651
655
  [
652
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
656
+ [APPLY, KEYWORDS.CALL_FUNCTION],
653
657
  [
654
- [APPLY, KEYWORDS.BLOCK],
655
- [
656
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
657
- [WORD, memoName],
658
- [[APPLY, 'new:map64']]
659
- ],
658
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
660
659
  [
661
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
662
- [WORD, newName],
660
+ [APPLY, KEYWORDS.BLOCK],
661
+ [
662
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
663
+ [WORD, memoName],
664
+ [[APPLY, 'new:map64']]
665
+ ],
663
666
  [
664
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
665
- ...args,
667
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
668
+ [WORD, newName],
666
669
  [
667
- [APPLY, KEYWORDS.BLOCK],
670
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
671
+ ...args,
668
672
  [
669
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
670
- [WORD, keyName],
673
+ [APPLY, KEYWORDS.BLOCK],
671
674
  [
672
- [APPLY, 'from:string-or-number->key'],
673
- [[APPLY, KEYWORDS.CREATE_ARRAY], ...args]
674
- ]
675
- ],
676
- [
677
- [APPLY, KEYWORDS.IF],
678
- [
679
- [APPLY, 'map:exists?'],
680
- [WORD, memoName],
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, 'map:set-and-get!'],
690
- [WORD, memoName],
691
- [WORD, keyName],
692
- last.at(-1)
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
- [WORD, newName]
706
+ ],
707
+ [WORD, newName]
708
+ ]
699
709
  ]
700
710
  ]
701
711
  ]