fez-lisp 1.5.76 → 1.5.79
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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +114 -22
- package/src/types.js +163 -163
- package/src/utils.js +2 -1
- package/.vscode/settings.json +0 -1
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -20,7 +20,7 @@ import { isLeaf } from './parser.js'
|
|
20
20
|
import {
|
21
21
|
SPECIAL_FORM_TYPES,
|
22
22
|
toTypeNames,
|
23
|
-
|
23
|
+
ARG_COUNT,
|
24
24
|
VARIADIC,
|
25
25
|
STATS,
|
26
26
|
ARGUMENTS,
|
@@ -65,15 +65,28 @@ const deepLambdaReturn = (rest, condition) => {
|
|
65
65
|
const rem = hasBlock(body) ? body.at(-1) : body
|
66
66
|
return condition(rem) ? rem : deepLambdaReturn(rem, condition)
|
67
67
|
}
|
68
|
-
const assign = (a, b, i) => {
|
69
|
-
|
70
|
-
}
|
68
|
+
// const assign = (a, b, i) => {
|
69
|
+
// a[i] = b[i]
|
70
|
+
// }
|
71
|
+
const fillUknownArgs = (n) =>
|
72
|
+
Array.from({ length: n })
|
73
|
+
.fill(null)
|
74
|
+
.map(() => ({
|
75
|
+
[STATS]: {
|
76
|
+
retried: 0,
|
77
|
+
[SIGNATURE]: PLACEHOLDER,
|
78
|
+
[TYPE_PROP]: [UNKNOWN],
|
79
|
+
[RETURNS]: [UNKNOWN],
|
80
|
+
[ARGUMENTS]: [],
|
81
|
+
[ARG_COUNT]: 0
|
82
|
+
}
|
83
|
+
}))
|
71
84
|
export const formatType = (name, env) => {
|
72
85
|
const stats = env[name][STATS]
|
73
86
|
return stats
|
74
87
|
? stats[TYPE_PROP][0] === APPLY
|
75
88
|
? `${name} (${
|
76
|
-
stats[
|
89
|
+
stats[ARG_COUNT] === VARIADIC
|
77
90
|
? '... ' + STATIC_TYPES.UNKNOWN
|
78
91
|
: (stats[ARGUMENTS] ?? [])
|
79
92
|
.map(
|
@@ -227,8 +240,10 @@ export const typeCheck = (ast) => {
|
|
227
240
|
case KEYWORDS.ANONYMOUS_FUNCTION:
|
228
241
|
// FN UKNONW ASSIGMENT
|
229
242
|
env[name][STATS][RETURNS] = [UNKNOWN]
|
230
|
-
env[name][STATS][
|
243
|
+
env[name][STATS][ARG_COUNT] = re[0].length - 2
|
244
|
+
env[name][STATS][ARGUMENTS] = fillUknownArgs(
|
231
245
|
re[0].length - 2
|
246
|
+
)
|
232
247
|
break
|
233
248
|
}
|
234
249
|
}
|
@@ -251,8 +266,10 @@ export const typeCheck = (ast) => {
|
|
251
266
|
// FN ASSIGMENT
|
252
267
|
env[name][STATS][TYPE_PROP] = [APPLY]
|
253
268
|
env[name][STATS][RETURNS] = [UNKNOWN]
|
254
|
-
env[name][STATS][
|
269
|
+
env[name][STATS][ARG_COUNT] = re[1].length - 2
|
270
|
+
env[name][STATS][ARGUMENTS] = fillUknownArgs(
|
255
271
|
re[1].length - 2
|
272
|
+
)
|
256
273
|
break
|
257
274
|
}
|
258
275
|
}
|
@@ -393,8 +410,8 @@ export const typeCheck = (ast) => {
|
|
393
410
|
retried: 0,
|
394
411
|
counter: 0,
|
395
412
|
[VARIABLE_ORDER_INDEX]: env[ORDER],
|
396
|
-
[
|
397
|
-
[ARGUMENTS]:
|
413
|
+
[ARG_COUNT]: n - 2,
|
414
|
+
[ARGUMENTS]: fillUknownArgs(n - 2),
|
398
415
|
[RETURNS]: [UNKNOWN]
|
399
416
|
}
|
400
417
|
}
|
@@ -687,14 +704,14 @@ export const typeCheck = (ast) => {
|
|
687
704
|
)
|
688
705
|
else if (
|
689
706
|
env[first[VALUE]][STATS][TYPE_PROP][0] === APPLY &&
|
690
|
-
env[first[VALUE]][STATS][
|
691
|
-
env[first[VALUE]][STATS][
|
707
|
+
env[first[VALUE]][STATS][ARG_COUNT] !== VARIADIC &&
|
708
|
+
env[first[VALUE]][STATS][ARG_COUNT] !== rest.length
|
692
709
|
) {
|
693
710
|
errorStack.add(
|
694
711
|
`Incorrect number of arguments for (${
|
695
712
|
first[VALUE]
|
696
713
|
}). Expected (= ${
|
697
|
-
env[first[VALUE]][STATS][
|
714
|
+
env[first[VALUE]][STATS][ARG_COUNT]
|
698
715
|
}) but got ${rest.length} (${stringifyArgs(exp)}) (check #15)`
|
699
716
|
)
|
700
717
|
} else {
|
@@ -705,14 +722,40 @@ export const typeCheck = (ast) => {
|
|
705
722
|
exp
|
706
723
|
)}) (check #12)`
|
707
724
|
)
|
708
|
-
} else if (!env[first[VALUE]][STATS][
|
725
|
+
} else if (!env[first[VALUE]][STATS][ARG_COUNT]) {
|
709
726
|
// TODO recursively take return type of applicaion
|
710
727
|
if (env[first[VALUE]][STATS][RETURNS][0] === APPLY) {
|
711
728
|
env[first[VALUE]][STATS][RETURNS] = [UNKNOWN]
|
712
729
|
}
|
713
730
|
// FN ASSIGMENT
|
714
731
|
env[first[VALUE]][STATS][TYPE_PROP] = [APPLY]
|
715
|
-
env[first[VALUE]][STATS][
|
732
|
+
env[first[VALUE]][STATS][ARG_COUNT] = rest.length
|
733
|
+
env[first[VALUE]][STATS][ARGUMENTS] = fillUknownArgs(
|
734
|
+
rest.length
|
735
|
+
)
|
736
|
+
// ASSIGMENT of paramaters of lambda that are a lambda
|
737
|
+
for (let i = 0; i < rest.length; ++i) {
|
738
|
+
const arg = env[first[VALUE]][STATS][ARGUMENTS]
|
739
|
+
arg[i] = {
|
740
|
+
[STATS]: {
|
741
|
+
retried: 0,
|
742
|
+
[SIGNATURE]: PLACEHOLDER,
|
743
|
+
[TYPE_PROP]: [UNKNOWN],
|
744
|
+
[RETURNS]: [UNKNOWN],
|
745
|
+
[ARGUMENTS]: [],
|
746
|
+
[ARG_COUNT]: 0
|
747
|
+
}
|
748
|
+
}
|
749
|
+
switch (rest[i][TYPE]) {
|
750
|
+
case ATOM:
|
751
|
+
arg[i][STATS][TYPE_PROP][0] = ATOM
|
752
|
+
break
|
753
|
+
case WORD:
|
754
|
+
case APPLY:
|
755
|
+
arg[i][STATS] = env[rest[i][VALUE]][STATS]
|
756
|
+
break
|
757
|
+
}
|
758
|
+
}
|
716
759
|
}
|
717
760
|
}
|
718
761
|
|
@@ -993,8 +1036,30 @@ export const typeCheck = (ast) => {
|
|
993
1036
|
exp
|
994
1037
|
)}) (check #13)`
|
995
1038
|
)
|
1039
|
+
} else if (
|
1040
|
+
T === APPLY &&
|
1041
|
+
args[i][STATS][TYPE_PROP][0] !== UNKNOWN &&
|
1042
|
+
env[rest[i][VALUE]][STATS][TYPE_PROP][0] !== UNKNOWN &&
|
1043
|
+
env[rest[i][VALUE]][STATS][ARG_COUNT] !== VARIADIC
|
1044
|
+
) {
|
1045
|
+
// Handles words that are Lambdas
|
1046
|
+
if (
|
1047
|
+
env[rest[i][VALUE]][STATS][ARG_COUNT] !==
|
1048
|
+
args[i][STATS][ARG_COUNT]
|
1049
|
+
) {
|
1050
|
+
errorStack.add(
|
1051
|
+
`Incorrect number of arguments for (${
|
1052
|
+
args[i][STATS][SIGNATURE]
|
1053
|
+
}) the (lambda) argument of (${
|
1054
|
+
first[VALUE]
|
1055
|
+
}) at position (${i}). Expected (= ${
|
1056
|
+
args[i][STATS][ARG_COUNT]
|
1057
|
+
}) but got ${
|
1058
|
+
env[rest[i][VALUE]][STATS][ARG_COUNT]
|
1059
|
+
} (${stringifyArgs(exp)}) (check #778)`
|
1060
|
+
)
|
1061
|
+
}
|
996
1062
|
}
|
997
|
-
|
998
1063
|
if (
|
999
1064
|
env[rest[i][VALUE]] &&
|
1000
1065
|
env[rest[i][VALUE]][STATS][TYPE_PROP][0] !== UNKNOWN &&
|
@@ -1031,11 +1096,7 @@ export const typeCheck = (ast) => {
|
|
1031
1096
|
args[i][STATS][RETURNS]
|
1032
1097
|
}
|
1033
1098
|
}
|
1034
|
-
} else if (
|
1035
|
-
rest[i].length &&
|
1036
|
-
rest[i][0][TYPE] === APPLY &&
|
1037
|
-
env[rest[i][0][VALUE]]
|
1038
|
-
) {
|
1099
|
+
} else if (env[rest[i][0][VALUE]]) {
|
1039
1100
|
const match = () => {
|
1040
1101
|
const actual = env[rest[i][0][VALUE]][STATS][RETURNS]
|
1041
1102
|
const expected = args[i][STATS][TYPE_PROP]
|
@@ -1054,6 +1115,39 @@ export const typeCheck = (ast) => {
|
|
1054
1115
|
actual[0]
|
1055
1116
|
)}) (${stringifyArgs(exp)}) (check #16)`
|
1056
1117
|
)
|
1118
|
+
else {
|
1119
|
+
switch (expected[0]) {
|
1120
|
+
// almost exclusively for anonymous lambdas
|
1121
|
+
case APPLY:
|
1122
|
+
{
|
1123
|
+
const argsN = rest[i].length - 2
|
1124
|
+
if (
|
1125
|
+
env[rest[i][0][VALUE]][STATS][SIGNATURE] ===
|
1126
|
+
KEYWORDS.ANONYMOUS_FUNCTION
|
1127
|
+
) {
|
1128
|
+
if (argsN !== args[i][STATS][ARG_COUNT]) {
|
1129
|
+
errorStack.add(
|
1130
|
+
`Incorrect number of arguments for (${
|
1131
|
+
args[i][STATS][SIGNATURE]
|
1132
|
+
}) the (lambda) argument of (${
|
1133
|
+
first[VALUE]
|
1134
|
+
}) at position (${i}). Expected (= ${
|
1135
|
+
args[i][STATS][ARG_COUNT]
|
1136
|
+
}) but got ${argsN} (${stringifyArgs(
|
1137
|
+
exp
|
1138
|
+
)}) (check #777)`
|
1139
|
+
)
|
1140
|
+
}
|
1141
|
+
} else {
|
1142
|
+
// TODO fix curry: lambdas enter here as undefined
|
1143
|
+
}
|
1144
|
+
}
|
1145
|
+
break
|
1146
|
+
// case ATOM:
|
1147
|
+
// case COLLECTION:
|
1148
|
+
// break
|
1149
|
+
}
|
1150
|
+
}
|
1057
1151
|
} else if (
|
1058
1152
|
expected[0] === UNKNOWN &&
|
1059
1153
|
args[i][STATS].retried < MAX_RETRY_DEFINITION
|
@@ -1062,7 +1156,6 @@ export const typeCheck = (ast) => {
|
|
1062
1156
|
stack.unshift(() => match())
|
1063
1157
|
}
|
1064
1158
|
}
|
1065
|
-
|
1066
1159
|
match()
|
1067
1160
|
}
|
1068
1161
|
}
|
@@ -1081,7 +1174,6 @@ export const typeCheck = (ast) => {
|
|
1081
1174
|
)
|
1082
1175
|
}
|
1083
1176
|
}
|
1084
|
-
|
1085
1177
|
check(r, env, scope)
|
1086
1178
|
}
|
1087
1179
|
break
|