fez-lisp 1.5.94 → 1.5.98
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 +702 -687
- package/src/evaluator.js +1 -3
- package/src/types.js +68 -24
package/src/evaluator.js
CHANGED
@@ -13,10 +13,8 @@ export const evaluate = (exp, env = keywords) => {
|
|
13
13
|
switch (head[TYPE]) {
|
14
14
|
case WORD: {
|
15
15
|
const word = env[value]
|
16
|
-
if (word == undefined)
|
16
|
+
if (word == undefined)
|
17
17
|
throw new ReferenceError(`Accessing undefined variable ${value}`)
|
18
|
-
}
|
19
|
-
|
20
18
|
return word
|
21
19
|
}
|
22
20
|
case APPLY: {
|
package/src/types.js
CHANGED
@@ -5,8 +5,10 @@ import {
|
|
5
5
|
DEBUG,
|
6
6
|
KEYWORDS,
|
7
7
|
PLACEHOLDER,
|
8
|
-
STATIC_TYPES
|
8
|
+
STATIC_TYPES,
|
9
|
+
VALUE
|
9
10
|
} from './keywords.js'
|
11
|
+
import { stringifyArgs } from './utils.js'
|
10
12
|
export const ARG_COUNT = 'argumentsN'
|
11
13
|
export const VARIADIC = Infinity
|
12
14
|
export const STATS = '__stats__'
|
@@ -19,7 +21,7 @@ export const UNKNOWN = -1
|
|
19
21
|
export const COLLECTION = 3
|
20
22
|
export const PREDICATE = 4
|
21
23
|
export const ANY = 5
|
22
|
-
|
24
|
+
export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
|
23
25
|
export const MAX_ARGUMENT_RETRY = 1
|
24
26
|
export const MAX_RETRY_DEFINITION = 10
|
25
27
|
export const toTypeNames = (type) => {
|
@@ -29,7 +31,6 @@ export const toTypeNames = (type) => {
|
|
29
31
|
case ATOM:
|
30
32
|
return 'Atom'
|
31
33
|
case UNKNOWN:
|
32
|
-
// case ANY:
|
33
34
|
return 'Unknown'
|
34
35
|
case PREDICATE:
|
35
36
|
return 'Predicate'
|
@@ -44,10 +45,10 @@ export const toTypeNames = (type) => {
|
|
44
45
|
export const SPECIAL_FORM_TYPES = {
|
45
46
|
[SCOPE_NAME]: ';',
|
46
47
|
// [ORDER]: 0,
|
47
|
-
[
|
48
|
+
[STATIC_TYPES.ABSTRACTION]: {
|
48
49
|
[STATS]: {
|
49
50
|
[TYPE_PROP]: [APPLY],
|
50
|
-
[SIGNATURE]:
|
51
|
+
[SIGNATURE]: STATIC_TYPES.ABSTRACTION,
|
51
52
|
retried: Infinity,
|
52
53
|
[ARG_COUNT]: 1,
|
53
54
|
[ARGUMENTS]: [
|
@@ -66,10 +67,10 @@ export const SPECIAL_FORM_TYPES = {
|
|
66
67
|
[RETURNS]: [APPLY]
|
67
68
|
}
|
68
69
|
},
|
69
|
-
[
|
70
|
+
[STATIC_TYPES.ATOM]: {
|
70
71
|
[STATS]: {
|
71
72
|
[TYPE_PROP]: [APPLY],
|
72
|
-
[SIGNATURE]:
|
73
|
+
[SIGNATURE]: STATIC_TYPES.ATOM,
|
73
74
|
retried: Infinity,
|
74
75
|
[ARG_COUNT]: 1,
|
75
76
|
[ARGUMENTS]: [
|
@@ -88,10 +89,10 @@ export const SPECIAL_FORM_TYPES = {
|
|
88
89
|
[RETURNS]: [ATOM]
|
89
90
|
}
|
90
91
|
},
|
91
|
-
[
|
92
|
+
[STATIC_TYPES.PREDICATE]: {
|
92
93
|
[STATS]: {
|
93
94
|
[TYPE_PROP]: [APPLY, PREDICATE],
|
94
|
-
[SIGNATURE]:
|
95
|
+
[SIGNATURE]: STATIC_TYPES.PREDICATE,
|
95
96
|
retried: Infinity,
|
96
97
|
[ARG_COUNT]: 1,
|
97
98
|
[ARGUMENTS]: [
|
@@ -110,10 +111,10 @@ export const SPECIAL_FORM_TYPES = {
|
|
110
111
|
[RETURNS]: [ATOM, PREDICATE]
|
111
112
|
}
|
112
113
|
},
|
113
|
-
[
|
114
|
+
[STATIC_TYPES.COLLECTION]: {
|
114
115
|
[STATS]: {
|
115
116
|
[TYPE_PROP]: [APPLY],
|
116
|
-
[SIGNATURE]:
|
117
|
+
[SIGNATURE]: STATIC_TYPES.COLLECTION,
|
117
118
|
retried: Infinity,
|
118
119
|
[ARG_COUNT]: 1,
|
119
120
|
[ARGUMENTS]: [
|
@@ -132,10 +133,10 @@ export const SPECIAL_FORM_TYPES = {
|
|
132
133
|
[RETURNS]: [COLLECTION]
|
133
134
|
}
|
134
135
|
},
|
135
|
-
[
|
136
|
+
[STATIC_TYPES.UNKNOWN]: {
|
136
137
|
[STATS]: {
|
137
138
|
[TYPE_PROP]: [APPLY],
|
138
|
-
[SIGNATURE]:
|
139
|
+
[SIGNATURE]: STATIC_TYPES.UNKNOWN,
|
139
140
|
retried: Infinity,
|
140
141
|
[ARG_COUNT]: 1,
|
141
142
|
[ARGUMENTS]: [
|
@@ -154,6 +155,28 @@ export const SPECIAL_FORM_TYPES = {
|
|
154
155
|
[RETURNS]: [UNKNOWN]
|
155
156
|
}
|
156
157
|
},
|
158
|
+
[STATIC_TYPES.ANY]: {
|
159
|
+
[STATS]: {
|
160
|
+
[TYPE_PROP]: [APPLY],
|
161
|
+
[SIGNATURE]: STATIC_TYPES.ANY,
|
162
|
+
retried: Infinity,
|
163
|
+
[ARG_COUNT]: 1,
|
164
|
+
[ARGUMENTS]: [
|
165
|
+
{
|
166
|
+
[STATS]: {
|
167
|
+
retried: Infinity,
|
168
|
+
[SIGNATURE]: PLACEHOLDER,
|
169
|
+
[TYPE_PROP]: [UNKNOWN],
|
170
|
+
[RETURNS]: [UNKNOWN],
|
171
|
+
|
172
|
+
[ARGUMENTS]: [],
|
173
|
+
[ARG_COUNT]: 0
|
174
|
+
}
|
175
|
+
}
|
176
|
+
],
|
177
|
+
[RETURNS]: [ANY]
|
178
|
+
}
|
179
|
+
},
|
157
180
|
[DEBUG.LOG]: {
|
158
181
|
[STATS]: {
|
159
182
|
[TYPE_PROP]: [APPLY],
|
@@ -1167,20 +1190,41 @@ export const formatType = (name, env) => {
|
|
1167
1190
|
? `${isAnonymous ? '' : `(let ${name} `}(lambda ${
|
1168
1191
|
stats[ARG_COUNT] === VARIADIC
|
1169
1192
|
? '... ' + STATIC_TYPES.UNKNOWN
|
1170
|
-
:
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1193
|
+
: stats[ARGUMENTS]?.length
|
1194
|
+
? stats[ARGUMENTS].map(
|
1195
|
+
(x, i) =>
|
1196
|
+
`${
|
1197
|
+
getType(x[STATS]) === APPLY
|
1198
|
+
? `${formatType(i, stats[ARGUMENTS])}`
|
1199
|
+
: `${toTypeNames(getType(x[STATS]))}`
|
1200
|
+
}`
|
1201
|
+
).join(' ') + ' '
|
1202
|
+
: ''
|
1180
1203
|
// TODO format returned functions when type support is added
|
1181
|
-
}
|
1204
|
+
}(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
|
1182
1205
|
isAnonymous ? '' : ')'
|
1183
1206
|
})`
|
1184
1207
|
: `(let ${name} ${toTypeNames(getType(stats))})`
|
1185
1208
|
: name
|
1186
1209
|
}
|
1210
|
+
|
1211
|
+
export const validateLambda = (exp, name) => {
|
1212
|
+
if (exp.length === 1)
|
1213
|
+
throw new TypeError(
|
1214
|
+
`Incorrect number of arguments for (${
|
1215
|
+
KEYWORDS.ANONYMOUS_FUNCTION
|
1216
|
+
}). Expected at least 1 (the lambda body) but got 1 (${stringifyArgs(
|
1217
|
+
exp
|
1218
|
+
)})`
|
1219
|
+
)
|
1220
|
+
if (name)
|
1221
|
+
for (let i = 0; i < exp.length - 1; ++i)
|
1222
|
+
if (exp[i][VALUE] === name)
|
1223
|
+
throw new TypeError(
|
1224
|
+
`Arguments of (${
|
1225
|
+
KEYWORDS.ANONYMOUS_FUNCTION
|
1226
|
+
}) Should not have the same name as they were declared (${stringifyArgs(
|
1227
|
+
exp
|
1228
|
+
)})`
|
1229
|
+
)
|
1230
|
+
}
|