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.
- package/package.json +1 -1
- package/src/check.js +66 -28
package/package.json
CHANGED
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 = ({
|
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]
|
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
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
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)
|