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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.19",
5
+ "version": "1.5.20",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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([1, 3]),
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
- alter_effect: `alter_effect=function(array,index,value){if(arguments.length===1){array.pop()}else{array[index] = value};return array}`
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
  ';)',
@@ -389,11 +389,11 @@ export const keywords = {
389
389
  return value
390
390
  },
391
391
  [KEYWORDS.SET_ARRAY]: (args, env) => {
392
- if (args.length !== 1 && args.length !== 3)
392
+ if (args.length !== 3)
393
393
  throw new RangeError(
394
394
  `Invalid number of arguments for (${
395
395
  KEYWORDS.SET_ARRAY
396
- }) (or 1 3) required\n\n(${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
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
- if (args.length === 1) {
408
- array.pop()
409
- } else {
410
- const index = evaluate(args[1], env)
411
- if (!Number.isInteger(index) || index < 0)
412
- throw new TypeError(
413
- `Second argument of (${KEYWORDS.SET_ARRAY}) must be a positive (${
414
- RUNTIME_TYPES.NUMBER
415
- } integer) (= i ${index}) but ${LISP.source(args[1])} is not\n\n(${
416
- KEYWORDS.SET_ARRAY
417
- } ${stringifyArgs(args)})`
418
- )
419
- if (index > array.length)
420
- throw new RangeError(
421
- `Second argument of (${KEYWORDS.SET_ARRAY}) is outside of the (${
422
- RUNTIME_TYPES.ARRAY
423
- }) bounds (${index}) expected (and (>= i 0) (< i ${
424
- array.length
425
- })) but ${LISP.source(args[1])} is not\n\n(${
426
- KEYWORDS.SET_ARRAY
427
- } ${stringifyArgs(args)})`
428
- )
429
- const value = evaluate(args[2], env)
430
- if (value == undefined)
431
- throw new RangeError(
432
- `Trying to set a null value in (${RUNTIME_TYPES.ARRAY}) at (${
433
- KEYWORDS.SET_ARRAY
434
- })\n\n(${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
435
- )
436
- array[index] = value
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) => {
package/src/keywords.js CHANGED
@@ -41,7 +41,8 @@ export const KEYWORDS = {
41
41
  CALL_FUNCTION: 'apply',
42
42
  DEFINE_VARIABLE: 'let',
43
43
 
44
- SET_ARRAY: 'alter!',
44
+ SET_ARRAY: 'set!',
45
+ POP_ARRAY: 'pop!',
45
46
  ERROR: 'throw'
46
47
  }
47
48