fez-lisp 1.5.144 → 1.5.145

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/check.js +66 -28
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.144",
5
+ "version": "1.5.145",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -127,6 +127,7 @@ export const castReturn = (stats, type) => {
127
127
  stats[RETURNS][1] && (stats[RETURNS][1] = type[RETURNS][1])
128
128
  )
129
129
  }
130
+ export const isGenericReturn = (stats) => stats[RETURNS].length === 3
130
131
  export const isTypeAbstraction = (stats) => stats[TYPE_PROP] === APPLY
131
132
  export const setPropToAtom = (stats, prop) => {
132
133
  return (
@@ -690,7 +691,16 @@ const initArrayType = ({ rem, env }) => {
690
691
  [RETURNS]: [COLLECTION, new Set([])]
691
692
  }
692
693
  }
693
- const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
694
+ const resolveReturnType = ({
695
+ returns,
696
+ rem,
697
+ stack,
698
+ prop,
699
+ exp,
700
+ name,
701
+ env,
702
+ check
703
+ }) => {
694
704
  if (returns[TYPE] === ATOM) setPropToAtom(env[name][STATS], prop)
695
705
  else {
696
706
  switch (returns[VALUE]) {
@@ -714,7 +724,8 @@ const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
714
724
  prop,
715
725
  exp,
716
726
  name,
717
- env
727
+ env,
728
+ check
718
729
  })
719
730
  })
720
731
  checkPredicateNameDeep(name, exp, exp.slice(1), returns)
@@ -737,7 +748,7 @@ const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
737
748
 
738
749
  if (isUnknownType(env[name][STATS]))
739
750
  stagger(stack, 'prepend', exp, () => {
740
- if (env[returns[VALUE]][STATS][RETURNS].length === 3) {
751
+ if (isGenericReturn(env[returns[VALUE]][STATS])) {
741
752
  // env[name][STATS][TYPE_PROP] =
742
753
  const genericReturn =
743
754
  rem.slice(1)[env[returns[VALUE]][STATS][RETURNS][2]]
@@ -753,27 +764,50 @@ const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
753
764
  setStatsRef(env[name], env[head[VALUE]])
754
765
  break
755
766
  case APPLY:
756
- case KEYWORDS.ANONYMOUS_FUNCTION:
757
- {
758
- setTypeToAbstraction(env[name][STATS])
759
- checkReturnType({
760
- exp: [genericReturn],
761
- stack,
762
- name,
763
- env
764
- })
765
- }
766
- break
767
- case KEYWORDS.CREATE_ARRAY:
768
- {
769
- setTypeToCollection(env[name][STATS])
770
- setPropToSubReturn(
771
- env[name][STATS],
772
- TYPE_PROP,
773
- initArrayType({ rem: genericReturn, env })
774
- )
767
+ switch (head[VALUE]) {
768
+ case KEYWORDS.ANONYMOUS_FUNCTION:
769
+ {
770
+ // TODO figure out a better way to do this
771
+ // This is insitialisation of identity or any other
772
+ // function that returns it's argument
773
+ // Redifine the variable but since it's an error doing that
774
+ // Delete it
775
+ delete env[name]
776
+ check(
777
+ [
778
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
779
+ [WORD, name],
780
+ genericReturn
781
+ ],
782
+ env,
783
+ exp
784
+ )
785
+ // const n = genericReturn.length
786
+ // setTypeToAbstraction(env[name][STATS])
787
+ // env[name][STATS][ARG_COUNT] = n - 2
788
+ // env[name][STATS][ARGUMENTS] = fillUknownArgs(
789
+ // n - 2
790
+ // )
791
+ // checkReturnType({
792
+ // exp: [genericReturn],
793
+ // stack,
794
+ // name,
795
+ // env,
796
+ // check
797
+ // })
798
+ }
799
+ break
800
+ case KEYWORDS.CREATE_ARRAY:
801
+ {
802
+ setTypeToCollection(env[name][STATS])
803
+ setPropToSubReturn(
804
+ env[name][STATS],
805
+ TYPE_PROP,
806
+ initArrayType({ rem: genericReturn, env })
807
+ )
808
+ }
809
+ break
775
810
  }
776
- break
777
811
  default:
778
812
  if (env[head[VALUE]])
779
813
  setTypeToReturn(
@@ -797,7 +831,7 @@ const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
797
831
  }
798
832
  return true
799
833
  }
800
- const checkReturnType = ({ exp, stack, name, env }) => {
834
+ const checkReturnType = ({ exp, stack, name, env, check }) => {
801
835
  const last = exp.at(-1).at(-1)
802
836
  const body = hasApplyLambdaBlock(last) ? last.at(-1).at(-1) : last
803
837
  const rem = hasBlock(body) ? body.at(-1) : body
@@ -809,7 +843,8 @@ const checkReturnType = ({ exp, stack, name, env }) => {
809
843
  exp,
810
844
  name,
811
845
  env,
812
- stack
846
+ stack,
847
+ check
813
848
  })
814
849
  }
815
850
  const stagger = (stack, method, data, fn) => {
@@ -1062,7 +1097,8 @@ export const typeCheck = (ast) => {
1062
1097
  stack,
1063
1098
  exp,
1064
1099
  env,
1065
- name
1100
+ name,
1101
+ check
1066
1102
  }) ||
1067
1103
  isUnknownReturn(env[name][STATS])
1068
1104
  ) {
@@ -1071,7 +1107,8 @@ export const typeCheck = (ast) => {
1071
1107
  stack,
1072
1108
  exp,
1073
1109
  env,
1074
- name
1110
+ name,
1111
+ check
1075
1112
  })
1076
1113
  check(rightHand, env, exp)
1077
1114
  })
@@ -1133,7 +1170,8 @@ export const typeCheck = (ast) => {
1133
1170
  prop: TYPE_PROP,
1134
1171
  exp,
1135
1172
  env,
1136
- name
1173
+ name,
1174
+ check
1137
1175
  })
1138
1176
  }
1139
1177
  check(rightHand, env, scope)