fez-lisp 1.5.76 → 1.5.78
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 +82 -14
- 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
|
|
@@ -1054,6 +1097,31 @@ export const typeCheck = (ast) => {
|
|
1054
1097
|
actual[0]
|
1055
1098
|
)}) (${stringifyArgs(exp)}) (check #16)`
|
1056
1099
|
)
|
1100
|
+
else {
|
1101
|
+
switch (expected[0]) {
|
1102
|
+
case APPLY:
|
1103
|
+
{
|
1104
|
+
const argsN = rest[i].length - 2
|
1105
|
+
if (
|
1106
|
+
env[rest[i][0][VALUE]][STATS][SIGNATURE] ===
|
1107
|
+
KEYWORDS.ANONYMOUS_FUNCTION
|
1108
|
+
) {
|
1109
|
+
if (argsN !== args[i][STATS][ARG_COUNT]) {
|
1110
|
+
errorStack.add(
|
1111
|
+
`Incorrect number of arguments for (${
|
1112
|
+
first[VALUE]
|
1113
|
+
}). Expected (= ${
|
1114
|
+
env[first[VALUE]][STATS][ARG_COUNT]
|
1115
|
+
}) but got ${
|
1116
|
+
rest.length
|
1117
|
+
} (${stringifyArgs(exp)}) (check #777)`
|
1118
|
+
)
|
1119
|
+
}
|
1120
|
+
}
|
1121
|
+
}
|
1122
|
+
break
|
1123
|
+
}
|
1124
|
+
}
|
1057
1125
|
} else if (
|
1058
1126
|
expected[0] === UNKNOWN &&
|
1059
1127
|
args[i][STATS].retried < MAX_RETRY_DEFINITION
|