fez-lisp 1.5.18 → 1.5.20
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/README.md +3 -3
- package/lib/baked/macros.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +36 -1
- package/src/compiler.js +2 -1
- package/src/interpreter.js +48 -33
- package/src/keywords.js +2 -1
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
APPLY,
|
3
3
|
ATOM,
|
4
|
+
DEBUG,
|
4
5
|
KEYWORDS,
|
5
6
|
PLACEHOLDER,
|
6
7
|
PREDICATE_SUFFIX,
|
@@ -40,6 +41,32 @@ const toTypeNames = (type) => {
|
|
40
41
|
}
|
41
42
|
export const typeCheck = (ast) => {
|
42
43
|
const root = {
|
44
|
+
[DEBUG.LOG]: {
|
45
|
+
[STATS]: {
|
46
|
+
type: APPLY,
|
47
|
+
[ARGS]: [
|
48
|
+
[UNKNOWN, PLACEHOLDER],
|
49
|
+
[APPLY, PLACEHOLDER]
|
50
|
+
],
|
51
|
+
[ARGS_COUNT]: new Set([2]),
|
52
|
+
[RETURNS]: UNKNOWN
|
53
|
+
}
|
54
|
+
},
|
55
|
+
[DEBUG.STRING]: {
|
56
|
+
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: APPLY }
|
57
|
+
},
|
58
|
+
[DEBUG.ASSERT]: {
|
59
|
+
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
|
60
|
+
},
|
61
|
+
[DEBUG.SIGNATURE]: {
|
62
|
+
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
|
63
|
+
},
|
64
|
+
[DEBUG.LIST_THEMES]: {
|
65
|
+
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
|
66
|
+
},
|
67
|
+
[DEBUG.SET_THEME]: {
|
68
|
+
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
|
69
|
+
},
|
43
70
|
[SCOPE_NAME]: performance.now().toString().replace('.', 0),
|
44
71
|
[KEYWORDS.BLOCK]: {
|
45
72
|
[STATS]: { type: APPLY, [ARGS_COUNT]: VARIADIC, [RETURNS]: UNKNOWN }
|
@@ -197,7 +224,7 @@ export const typeCheck = (ast) => {
|
|
197
224
|
[KEYWORDS.SET_ARRAY]: {
|
198
225
|
[STATS]: {
|
199
226
|
type: APPLY,
|
200
|
-
[ARGS_COUNT]: new Set([
|
227
|
+
[ARGS_COUNT]: new Set([3]),
|
201
228
|
[ARGS]: [
|
202
229
|
[UNKNOWN, PLACEHOLDER],
|
203
230
|
[ATOM, PLACEHOLDER],
|
@@ -206,6 +233,14 @@ export const typeCheck = (ast) => {
|
|
206
233
|
[RETURNS]: UNKNOWN
|
207
234
|
}
|
208
235
|
},
|
236
|
+
[KEYWORDS.POP_ARRAY]: {
|
237
|
+
[STATS]: {
|
238
|
+
type: APPLY,
|
239
|
+
[ARGS_COUNT]: new Set([1]),
|
240
|
+
[ARGS]: [[UNKNOWN, PLACEHOLDER]],
|
241
|
+
[RETURNS]: UNKNOWN
|
242
|
+
}
|
243
|
+
},
|
209
244
|
[KEYWORDS.ARRAY_LENGTH]: {
|
210
245
|
[STATS]: {
|
211
246
|
type: APPLY,
|
package/src/compiler.js
CHANGED
@@ -112,7 +112,8 @@ const Helpers = {
|
|
112
112
|
atom_predicate: `atom_predicate=(number)=>+(typeof number==='number')`,
|
113
113
|
lambda_predicate: `lambda_predicate=(fn)=>+(typeof fn==='function')`,
|
114
114
|
__error: `__error=(error)=>{throw new Error(error.map((x)=>String.fromCharCode(x)).join(''))}`,
|
115
|
-
|
115
|
+
set_effect: `set_effect=(array,index,value)=>{array[index] = value;return array}`,
|
116
|
+
pop_effect: `pop_effect=(array)=>{array.pop();return array}`
|
116
117
|
}
|
117
118
|
const semiColumnEdgeCases = new Set([
|
118
119
|
';)',
|
package/src/interpreter.js
CHANGED
@@ -389,11 +389,11 @@ export const keywords = {
|
|
389
389
|
return value
|
390
390
|
},
|
391
391
|
[KEYWORDS.SET_ARRAY]: (args, env) => {
|
392
|
-
if (args.length !==
|
392
|
+
if (args.length !== 3)
|
393
393
|
throw new RangeError(
|
394
394
|
`Invalid number of arguments for (${
|
395
395
|
KEYWORDS.SET_ARRAY
|
396
|
-
}) (
|
396
|
+
}) (= 3) required\n\n(${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
|
397
397
|
)
|
398
398
|
const array = evaluate(args[0], env)
|
399
399
|
if (!Array.isArray(array))
|
@@ -404,37 +404,52 @@ export const keywords = {
|
|
404
404
|
KEYWORDS.SET_ARRAY
|
405
405
|
} ${stringifyArgs(args)})`
|
406
406
|
)
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
)
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
407
|
+
const index = evaluate(args[1], env)
|
408
|
+
if (!Number.isInteger(index) || index < 0)
|
409
|
+
throw new TypeError(
|
410
|
+
`Second argument of (${KEYWORDS.SET_ARRAY}) must be a positive (${
|
411
|
+
RUNTIME_TYPES.NUMBER
|
412
|
+
} integer) (= i ${index}) but ${LISP.source(args[1])} is not\n\n(${
|
413
|
+
KEYWORDS.SET_ARRAY
|
414
|
+
} ${stringifyArgs(args)})`
|
415
|
+
)
|
416
|
+
if (index > array.length)
|
417
|
+
throw new RangeError(
|
418
|
+
`Second argument of (${KEYWORDS.SET_ARRAY}) is outside of the (${
|
419
|
+
RUNTIME_TYPES.ARRAY
|
420
|
+
}) bounds (${index}) expected (and (>= i 0) (< i ${
|
421
|
+
array.length
|
422
|
+
})) but ${LISP.source(args[1])} is not\n\n(${
|
423
|
+
KEYWORDS.SET_ARRAY
|
424
|
+
} ${stringifyArgs(args)})`
|
425
|
+
)
|
426
|
+
const value = evaluate(args[2], env)
|
427
|
+
if (value == undefined)
|
428
|
+
throw new RangeError(
|
429
|
+
`Trying to set a null value in (${RUNTIME_TYPES.ARRAY}) at (${
|
430
|
+
KEYWORDS.SET_ARRAY
|
431
|
+
})\n\n(${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
|
432
|
+
)
|
433
|
+
array[index] = value
|
434
|
+
return array
|
435
|
+
},
|
436
|
+
[KEYWORDS.POP_ARRAY]: (args, env) => {
|
437
|
+
if (args.length !== 1)
|
438
|
+
throw new RangeError(
|
439
|
+
`Invalid number of arguments for (${
|
440
|
+
KEYWORDS.POP_ARRAY
|
441
|
+
}) (= 1) required\n\n(${KEYWORDS.POP_ARRAY} ${stringifyArgs(args)})`
|
442
|
+
)
|
443
|
+
const array = evaluate(args[0], env)
|
444
|
+
if (!Array.isArray(array))
|
445
|
+
throw new TypeError(
|
446
|
+
`First argument of (${KEYWORDS.POP_ARRAY}) must be an (${
|
447
|
+
RUNTIME_TYPES.ARRAY
|
448
|
+
}) but ${LISP.source(args[0])} is not\n\n(${
|
449
|
+
KEYWORDS.POP_ARRAY
|
450
|
+
} ${stringifyArgs(args)})`
|
451
|
+
)
|
452
|
+
array.pop()
|
438
453
|
return array
|
439
454
|
},
|
440
455
|
[KEYWORDS.ARRAY_LENGTH]: (args, env) => {
|