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/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.18",
5
+ "version": "1.5.20",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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([1, 3]),
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
- 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