fez-lisp 1.6.53 → 1.6.54

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.6.53",
5
+ "version": "1.6.54",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -599,6 +599,56 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
599
599
  break
600
600
  }
601
601
  }
602
+ const resolveGetter = ({ rem, prop, name, env }) => {
603
+ const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
604
+ if (!env[array[VALUE]] || !env[name]) return true
605
+
606
+ switch (array[TYPE]) {
607
+ case APPLY:
608
+ if (hasSubType(env[array[VALUE]][STATS])) {
609
+ const rightSub = getSubReturn(env[array[VALUE]][STATS])
610
+ const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
611
+ const isCollection = rightSub.has(COLLECTION)
612
+ if (isAtom && !isCollection) {
613
+ setPropToAtom(env[name][STATS], prop)
614
+ setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
615
+ } else if (!isAtom && isCollection) {
616
+ setPropToReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
617
+ // TODO: handle this nested array overwrite better
618
+ if (getSubReturn(env[array[VALUE]][STATS]).has(COLLECTION))
619
+ setPropToSubReturn(env[name][STATS], prop, {
620
+ [RETURNS]: [COLLECTION, UNKNOWN_SUBTYPE()]
621
+ })
622
+ } else return false
623
+ } else return false
624
+ break
625
+ case WORD:
626
+ {
627
+ if (hasSubType(env[array[VALUE]][STATS])) {
628
+ const rightSub = getSubType(env[array[VALUE]][STATS])
629
+ const isAtom =
630
+ rightSub.has(ATOM) || rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
631
+ const isCollection = rightSub.has(COLLECTION)
632
+ if (isAtom && !isCollection) {
633
+ setPropToAtom(env[name][STATS], prop)
634
+ setPropToSubType(env[name][STATS], prop, env[array[VALUE]][STATS])
635
+ } else if (!isAtom && isCollection) {
636
+ setPropToType(env[name][STATS], prop, {
637
+ [TYPE_PROP]: [
638
+ env[array[VALUE]][STATS][TYPE_PROP][1].types[0],
639
+ new SubType(
640
+ env[array[VALUE]][STATS][TYPE_PROP][1].types.slice(1)
641
+ )
642
+ ]
643
+ })
644
+ } else return false
645
+ } else return false
646
+ }
647
+ break
648
+ }
649
+ return true
650
+ }
651
+
602
652
  const resolveSetter = (first, rest, env, stack) => {
603
653
  if (
604
654
  getSuffix(first[VALUE]) === MUTATION_SUFFIX &&
@@ -661,7 +711,7 @@ const resolveSetter = (first, rest, env, stack) => {
661
711
  break
662
712
  case APPLY:
663
713
  if (env[right[VALUE]]) {
664
- if (right[VALUE] === KEYWORDS.CREATE_ARRAY) {
714
+ if (right[VALUE] === 'array:get') {
665
715
  current[STATS][TYPE_PROP][1] = initArrayType({
666
716
  rem: rest.at(-1),
667
717
  env
@@ -798,6 +848,8 @@ const resolveReturnType = ({
798
848
  break
799
849
  default:
800
850
  {
851
+ if (returns[VALUE] === KEYWORDS.GET_ARRAY)
852
+ resolveGetter({ rem, prop, name, env })
801
853
  // if (
802
854
  // !GETTERS_SET.has(name) &&
803
855
  // GETTERS_SET.has(returns[VALUE]) &&
@@ -1483,6 +1535,14 @@ export const typeCheck = (
1483
1535
  // Setters are just like DEFINE_VARIABLE as they are essentially the Var case for Collections
1484
1536
  // So they MUST happen before Judgement
1485
1537
  resolveSetter(first, rest, env, stack)
1538
+ if (first[VALUE] === 'array:get-infer' && first[TYPE] === APPLY) {
1539
+ resolveGetter({
1540
+ rem: rest[0],
1541
+ prop: TYPE_PROP,
1542
+ name: rest[0],
1543
+ env
1544
+ })
1545
+ }
1486
1546
  // end of Var ---------------
1487
1547
  // Judgement
1488
1548
  const judge = () => {