fez-lisp 1.5.19 → 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 +9 -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
@@ -224,7 +224,7 @@ export const typeCheck = (ast) => {
|
|
224
224
|
[KEYWORDS.SET_ARRAY]: {
|
225
225
|
[STATS]: {
|
226
226
|
type: APPLY,
|
227
|
-
[ARGS_COUNT]: new Set([
|
227
|
+
[ARGS_COUNT]: new Set([3]),
|
228
228
|
[ARGS]: [
|
229
229
|
[UNKNOWN, PLACEHOLDER],
|
230
230
|
[ATOM, PLACEHOLDER],
|
@@ -233,6 +233,14 @@ export const typeCheck = (ast) => {
|
|
233
233
|
[RETURNS]: UNKNOWN
|
234
234
|
}
|
235
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
|
+
},
|
236
244
|
[KEYWORDS.ARRAY_LENGTH]: {
|
237
245
|
[STATS]: {
|
238
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) => {
|