fez-lisp 1.5.20 → 1.5.22

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.20",
5
+ "version": "1.5.22",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -117,7 +117,7 @@ export const typeCheck = (ast) => {
117
117
  [KEYWORDS.SUBTRACTION]: {
118
118
  [STATS]: {
119
119
  type: APPLY,
120
- [ARGS_COUNT]: new Set([1, 2]),
120
+ [ARGS_COUNT]: new Set([2]),
121
121
  [ARGS]: [
122
122
  [ATOM, PLACEHOLDER],
123
123
  [ATOM, PLACEHOLDER]
@@ -252,7 +252,7 @@ export const typeCheck = (ast) => {
252
252
  [KEYWORDS.IF]: {
253
253
  [STATS]: {
254
254
  type: APPLY,
255
- [ARGS_COUNT]: new Set([2, 3]),
255
+ [ARGS_COUNT]: new Set([3]),
256
256
  [ARGS]: [
257
257
  [ATOM, PLACEHOLDER, PREDICATE],
258
258
  [UNKNOWN, PLACEHOLDER],
package/src/compiler.js CHANGED
@@ -88,7 +88,7 @@ const lispToJavaScriptVariableName = (name) =>
88
88
  )
89
89
  const Helpers = {
90
90
  __add: `__add=(a,b)=>{return a+b}`,
91
- __sub: `__sub=function(a,b){return arguments.length===1?-a:a-b}`,
91
+ __sub: `__sub=(a,b)=>{return a-b}`,
92
92
  __mult: `__mult=(a,b)=>{return a*b}`,
93
93
  __div: `__div=(a,b)=>{return a/b}`,
94
94
  __gteq: '__gteq=(a,b)=>+(a>=b)',
@@ -226,12 +226,10 @@ const comp = (tree, Drill) => {
226
226
  case KEYWORDS.LESS_THAN:
227
227
  return `+(${parseArgs(tail, Drill, token)});`
228
228
  case KEYWORDS.SUBTRACTION:
229
- return tail.length === 1
230
- ? `(-${comp(tail[0], Drill)});`
231
- : `(${parse(tail, Drill)
232
- // Add space so it doesn't consider it 2--1 but 2- -1
233
- .map((x) => (typeof x === 'number' && x < 0 ? ` ${x}` : x))
234
- .join(token)});`
229
+ return `(${parse(tail, Drill)
230
+ // Add space so it doesn't consider it 2--1 but 2- -1
231
+ .map((x) => (typeof x === 'number' && x < 0 ? ` ${x}` : x))
232
+ .join(token)});`
235
233
  case KEYWORDS.MULTIPLICATION:
236
234
  return `(${parseArgs(tail, Drill, token)});`
237
235
  case KEYWORDS.DIVISION:
@@ -251,9 +249,10 @@ const comp = (tree, Drill) => {
251
249
  case KEYWORDS.NOT:
252
250
  return `(+!${comp(tail[0], Drill)})`
253
251
  case KEYWORDS.IF: {
254
- return `(${comp(tail[0], Drill)}?${comp(tail[1], Drill)}:${
255
- tail.length === 3 ? comp(tail[2], Drill) : 0
256
- });`
252
+ return `(${comp(tail[0], Drill)}?${comp(tail[1], Drill)}:${comp(
253
+ tail[2],
254
+ Drill
255
+ )});`
257
256
  }
258
257
  case KEYWORDS.LOOP: {
259
258
  return `(()=>{while(${comp(tail[0], Drill)}){${comp(
@@ -78,11 +78,11 @@ export const keywords = {
78
78
  return a * b
79
79
  },
80
80
  [KEYWORDS.SUBTRACTION]: (args, env) => {
81
- if (args.length !== 1 && args.length !== 2)
81
+ if (args.length !== 2)
82
82
  throw new RangeError(
83
83
  `Invalid number of arguments for (${
84
84
  KEYWORDS.SUBTRACTION
85
- }), expected (or (= 1) (= 2)) but got ${args.length}\n\n(${
85
+ }), expected (= 2) but got ${args.length}\n\n(${
86
86
  KEYWORDS.SUBTRACTION
87
87
  } ${stringifyArgs(args)})`
88
88
  )
@@ -95,7 +95,6 @@ export const keywords = {
95
95
  KEYWORDS.SUBTRACTION
96
96
  } ${stringifyArgs(args)})`
97
97
  )
98
- if (args.length === 1) return -a
99
98
  const b = evaluate(args[1], env)
100
99
  if (typeof b !== 'number')
101
100
  throw new TypeError(
@@ -471,11 +470,11 @@ export const keywords = {
471
470
  return array.length
472
471
  },
473
472
  [KEYWORDS.IF]: (args, env) => {
474
- if (args.length > 3 || args.length < 2)
473
+ if (args.length !== 3)
475
474
  throw new RangeError(
476
475
  `Invalid number of arguments for (${
477
476
  KEYWORDS.IF
478
- }), expected (or (= 3) (= 2)) but got ${args.length}\n\n(${
477
+ }), expected (= 3) but got ${args.length}\n\n(${
479
478
  KEYWORDS.IF
480
479
  } ${stringifyArgs(args)})`
481
480
  )
@@ -488,11 +487,7 @@ export const keywords = {
488
487
  KEYWORDS.IF
489
488
  } ${stringifyArgs(args)})`
490
489
  )
491
- return condition
492
- ? evaluate(args[1], env)
493
- : args.length === 3
494
- ? evaluate(args[2], env)
495
- : FALSE
490
+ return condition ? evaluate(args[1], env) : evaluate(args[2], env)
496
491
  },
497
492
  [KEYWORDS.NOT]: (args, env) => {
498
493
  if (args.length !== 1)
package/src/macros.js CHANGED
@@ -286,6 +286,21 @@ export const deSuggarAst = (ast, scope) => {
286
286
  }
287
287
  }
288
288
  deSuggarAst(exp, scope)
289
+ } else {
290
+ if (rest.length !== 1 && rest.length !== 2)
291
+ throw new RangeError(
292
+ `Invalid number of arguments for (${
293
+ KEYWORDS.SUBTRACTION
294
+ }), expected (or (= 1) (= 2)) but got ${
295
+ rest.length
296
+ }\n\n(${KEYWORDS.SUBTRACTION} ${stringifyArgs(rest)})`
297
+ )
298
+
299
+ if (rest.length === 1) {
300
+ exp[0][VALUE] = KEYWORDS.MULTIPLICATION
301
+ exp.push([ATOM, -1])
302
+ deSuggarAst(exp, scope)
303
+ }
289
304
  }
290
305
  break
291
306
  case KEYWORDS.DIVISION:
@@ -362,6 +377,20 @@ export const deSuggarAst = (ast, scope) => {
362
377
  }
363
378
  deSuggarAst(exp, scope)
364
379
  break
380
+ case KEYWORDS.IF:
381
+ {
382
+ if (rest.length > 3 || rest.length < 2)
383
+ throw new RangeError(
384
+ `Invalid number of arguments for (${
385
+ KEYWORDS.IF
386
+ }), expected (or (= 3) (= 2)) but got ${rest.length} (${
387
+ KEYWORDS.IF
388
+ } ${stringifyArgs(rest)})`
389
+ )
390
+ if (rest.length === 2) exp.push([ATOM, FALSE])
391
+ }
392
+ deSuggarAst(exp[1], scope)
393
+ break
365
394
  case SUGGAR.REMAINDER_OF_DIVISION_1:
366
395
  {
367
396
  if (rest.length !== 2)