fez-lisp 1.6.67 → 1.6.69

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.67",
5
+ "version": "1.6.69",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -612,11 +612,63 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
612
612
  break
613
613
  }
614
614
  }
615
+ const resolveGetterRec = ([head, tail], env, times = 0) => {
616
+ if (GET_ARRAY_INFERENCE_SET.has(head[VALUE])) {
617
+ return resolveGetterRec(tail, env, ++times)
618
+ } else {
619
+ switch (head) {
620
+ case APPLY:
621
+ break
622
+ case WORD:
623
+ {
624
+ if (env[tail][STATS][TYPE_PROP][0] === UNKNOWN) return
625
+ const types = env[tail][STATS][TYPE_PROP][1].types
626
+ const sub = types.at(-1)
627
+ const type =
628
+ sub === ATOM || sub === NUMBER || sub === BOOLEAN
629
+ ? ATOM
630
+ : sub === APPLY
631
+ ? APPLY
632
+ : COLLECTION
633
+ const len = types.length ? types.length + 1 : times + 1
634
+ return [times, len, type, types]
635
+ }
636
+ break
637
+ }
638
+ }
639
+ }
615
640
  const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
616
641
  const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
617
642
  if (!env[array[VALUE]] || !env[name]) return true
618
643
  switch (array[TYPE]) {
619
644
  case APPLY:
645
+ // TODO: figure out recursively what is the inner type of all nested getters
646
+ if (GET_ARRAY_INFERENCE_SET.has(array[VALUE])) {
647
+ const rec = resolveGetterRec(rem, env)
648
+ if (!rec) return true
649
+ const [times, level, type, types] = resolveGetterRec(rem, env)
650
+ if (times >= level)
651
+ throw new RangeError(
652
+ `(${caller}) is trying to access nested structure at level (${level}) which is deeper than it's (${times}) levels at (${stringifyArgs(
653
+ exp
654
+ )}) (check #1003)`
655
+ )
656
+ if (times === level - 1) {
657
+ setPropToType(env[name][STATS], prop, {
658
+ [TYPE_PROP]: types.length
659
+ ? [type, new SubType([types.at(-1)])]
660
+ : [UNKNOWN]
661
+ })
662
+ } else {
663
+ setPropToType(env[name][STATS], prop, {
664
+ [TYPE_PROP]: types.length
665
+ ? [COLLECTION, new SubType(types.slice(times))]
666
+ : [UNKNOWN]
667
+ })
668
+ }
669
+ return true
670
+ }
671
+
620
672
  if (
621
673
  getReturn(env[array[VALUE]][STATS]) === UNKNOWN ||
622
674
  getReturn(env[array[VALUE]][STATS]) === ANY
@@ -642,8 +694,12 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
642
694
  setPropToReturn(env[name][STATS], prop, {
643
695
  [RETURNS]: [f, new SubType(r)]
644
696
  })
645
- } else return false
646
- } else return false
697
+ } else if (rightSub.has(APPLY)) {
698
+ // TODOD: abstractions go here but what can we do with them
699
+ // perhaps show the signature?
700
+ setPropToAbstraction(env[name][STATS], prop)
701
+ }
702
+ }
647
703
  break
648
704
  case WORD:
649
705
  {
@@ -673,8 +729,12 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
673
729
  setPropToType(env[name][STATS], prop, {
674
730
  [TYPE_PROP]: [f, new SubType(r)]
675
731
  })
676
- } else return false
677
- } else return false
732
+ } else if (rightSub.has(APPLY)) {
733
+ // TODOD: abstractions go here but what can we do with them
734
+ // perhaps show the signature?
735
+ setPropToAbstraction(env[name][STATS], prop)
736
+ }
737
+ }
678
738
  }
679
739
  break
680
740
  }
@@ -835,11 +895,13 @@ const initArrayType = ({ rem, env }) => {
835
895
  ret[0].length = 0
836
896
  const subT = new SubType([COLLECTION])
837
897
  ret[0].push(COLLECTION, subT)
838
- while (head && !isSubType(head[1])) {
839
- subT.add(COLLECTION)
898
+ while (Array.isArray(head) && !isSubType(head[1])) {
899
+ if (head[0] === APPLY) subT.types.push(APPLY)
900
+ else subT.add(COLLECTION)
840
901
  head = head[0]
841
902
  }
842
- if (head && head[1].types.length) subT.add(head[1].types[0])
903
+ if (Array.isArray(head) && head[1].types.length)
904
+ subT.add(head[1].types[0])
843
905
  }
844
906
  const [main, sub] = ret[0]
845
907
  if (isSubType(sub) && sub.types.at(-1) === COLLECTION) sub.types.pop()
package/src/macros.js CHANGED
@@ -114,10 +114,35 @@ export const deSuggarAst = (ast, scope) => {
114
114
  // }
115
115
  // }
116
116
  // break
117
+ case PLACEHOLDER:
118
+ {
119
+ exp.length = 0
120
+ rest.reverse()
121
+ let temp = exp
122
+ for (let i = 0; i < rest.length; i += 1) {
123
+ if (i < rest.length - 1) {
124
+ temp.push([APPLY, SUGGAR.GET_ARRAY], [], rest[i])
125
+ temp = temp.at(-2)
126
+ } else temp.push(...rest[i])
127
+ }
128
+ deSuggarAst(exp, scope)
129
+ }
130
+ break
117
131
  case KEYWORDS.GET_ARRAY:
118
132
  if (rest.length === 1) {
119
133
  exp[0][VALUE] = 'math:var-get'
120
134
  // exp.push([ATOM, 0])
135
+ } else if (rest.length > 2) {
136
+ exp.length = 0
137
+ rest.reverse()
138
+ let temp = exp
139
+ for (let i = 0; i < rest.length; i += 1) {
140
+ if (i < rest.length - 1) {
141
+ temp.push([APPLY, SUGGAR.GET_ARRAY], [], rest[i])
142
+ temp = temp.at(-2)
143
+ } else temp.push(...rest[i])
144
+ }
145
+ deSuggarAst(exp, scope)
121
146
  }
122
147
  break
123
148
  case SUGGAR.INCREMENT: