fez-lisp 1.2.58 → 1.2.60

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.2.58",
5
+ "version": "1.2.60",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/compiler.js CHANGED
@@ -53,6 +53,8 @@ const keywordToHelper = (name) => {
53
53
  return '__add'
54
54
  case KEYWORDS.MULTIPLICATION:
55
55
  return '__mult'
56
+ case KEYWORDS.DIVISION:
57
+ return '__div'
56
58
  case KEYWORDS.SUBTRACTION:
57
59
  return '__sub'
58
60
  case KEYWORDS.GREATHER_THAN:
@@ -83,8 +85,9 @@ const lispToJavaScriptVariableName = (name) =>
83
85
  )
84
86
  const Helpers = {
85
87
  __add: `__add=(...numbers)=>{return numbers.reduce((a,b)=>a+b,0)}`,
86
- __sub: `__sub=(...numbers)=>{return numbers.reduce((a,b)=>a-b,0)}`,
88
+ __sub: `__sub=(...numbers)=>{return numbers.length===1?-numbers[0]:numbers.reduce((a,b)=>a-b,0)}`,
87
89
  __mult: `__mult=(...numbers)=>{return numbers.reduce((a,b)=>a*b,1)}`,
90
+ __div: `__div=(...numbers)=>{return numbers.length===1?1/numbers[0]:numbers.reduce((a, b)=>a/b)}`,
88
91
  __gteq: '__gteq=(a,b)=>+(a>=b)',
89
92
  __gt: '__gt=(a,b)=>+(a>b)',
90
93
  __eq: '__eq=(a,b)=>+(a===b)',
@@ -11,7 +11,8 @@ export const keywords = {
11
11
  KEYWORDS.REMAINDER_OF_DIVISION
12
12
  } ${stringifyArgs(args)})`
13
13
  )
14
- const [a, b] = args.map((x) => evaluate(x, env))
14
+ const a = evaluate(args[0], env)
15
+ const b = evaluate(args[1], env)
15
16
  if (typeof a !== 'number' || typeof b !== 'number')
16
17
  throw new TypeError(
17
18
  `Not all arguments of (${KEYWORDS.REMAINDER_OF_DIVISION}) are (${
@@ -501,7 +502,6 @@ export const keywords = {
501
502
  })
502
503
  return env[name]
503
504
  },
504
- [KEYWORDS.NUMBER_TYPE]: () => 0,
505
505
  [KEYWORDS.BITWISE_AND]: (args, env) => {
506
506
  if (args.length < 2)
507
507
  throw new RangeError(
package/src/utils.js CHANGED
@@ -381,6 +381,38 @@ export const deSuggar = (ast) => {
381
381
  if (first != undefined) {
382
382
  switch (first[TYPE]) {
383
383
  case WORD:
384
+ {
385
+ switch (first[VALUE]) {
386
+ case SUGGAR.POWER:
387
+ throw new TypeError(
388
+ `(${
389
+ SUGGAR.POWER
390
+ }), can't be used as a word (hint use math:power instead) (${
391
+ SUGGAR.POWER
392
+ } ${stringifyArgs(rest)})`
393
+ )
394
+ break
395
+ case SUGGAR.INTEGER_DEVISION:
396
+ exp.length = 0
397
+ exp.push(
398
+ ...[
399
+ [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
400
+ [WORD, 'a'],
401
+ [WORD, 'b'],
402
+ [
403
+ [APPLY, KEYWORDS.BITWISE_OR],
404
+ [
405
+ [APPLY, KEYWORDS.DIVISION],
406
+ [WORD, 'a'],
407
+ [WORD, 'b']
408
+ ],
409
+ [ATOM, 0]
410
+ ]
411
+ ]
412
+ )
413
+ break
414
+ }
415
+ }
384
416
  break
385
417
  case ATOM:
386
418
  break
@@ -478,7 +510,15 @@ export const deSuggar = (ast) => {
478
510
  break
479
511
  case SUGGAR.INTEGER_DEVISION:
480
512
  {
481
- if (rest.some((x) => x[TYPE] === APPLY))
513
+ if (rest.length !== 2)
514
+ throw new RangeError(
515
+ `Invalid number of arguments for (${
516
+ SUGGAR.INTEGER_DEVISION
517
+ }), expected (= 2) but got ${rest.length} (${
518
+ SUGGAR.INTEGER_DEVISION
519
+ } ${stringifyArgs(rest)})`
520
+ )
521
+ else if (rest.some((x) => x[TYPE] === APPLY))
482
522
  throw new TypeError(
483
523
  `Arguments of (${
484
524
  SUGGAR.INTEGER_DEVISION
@@ -492,7 +532,7 @@ export const deSuggar = (ast) => {
492
532
  exp.length = 1
493
533
  exp[0] = [APPLY, KEYWORDS.BITWISE_OR]
494
534
  exp.push([[APPLY, KEYWORDS.DIVISION], ...rest])
495
- exp.push([ATOM, FALSE])
535
+ exp.push([ATOM, 0])
496
536
  }
497
537
  }
498
538
  break