fez-lisp 1.3.0 → 1.3.1

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.
@@ -0,0 +1,144 @@
1
+ export const EXPONENTIATION = [
2
+ [0, 'lambda'],
3
+ [1, 'base'],
4
+ [1, 'exp'],
5
+ [
6
+ [0, 'do'],
7
+ [
8
+ [0, 'let'],
9
+ [1, 'power'],
10
+ [
11
+ [0, 'lambda'],
12
+ [1, 'base'],
13
+ [1, 'exp'],
14
+ [
15
+ [0, 'if'],
16
+ [
17
+ [0, '<'],
18
+ [1, 'exp'],
19
+ [2, 0]
20
+ ],
21
+ [
22
+ [0, 'if'],
23
+ [
24
+ [0, '='],
25
+ [1, 'base'],
26
+ [2, 0]
27
+ ],
28
+ [
29
+ [0, 'throw'],
30
+ [
31
+ [0, 'array'],
32
+ [2, 66],
33
+ [2, 97],
34
+ [2, 115],
35
+ [2, 101],
36
+ [2, 32],
37
+ [2, 99],
38
+ [2, 97],
39
+ [2, 110],
40
+ [2, 39],
41
+ [2, 116],
42
+ [2, 32],
43
+ [2, 98],
44
+ [2, 101],
45
+ [2, 32],
46
+ [2, 48],
47
+ [2, 32],
48
+ [2, 105],
49
+ [2, 102],
50
+ [2, 32],
51
+ [2, 101],
52
+ [2, 120],
53
+ [2, 112],
54
+ [2, 111],
55
+ [2, 110],
56
+ [2, 101],
57
+ [2, 110],
58
+ [2, 116],
59
+ [2, 32],
60
+ [2, 105],
61
+ [2, 115],
62
+ [2, 32],
63
+ [2, 60],
64
+ [2, 32],
65
+ [2, 48]
66
+ ]
67
+ ],
68
+ [
69
+ [0, '/'],
70
+ [
71
+ [0, '*'],
72
+ [1, 'base'],
73
+ [
74
+ [0, 'power'],
75
+ [1, 'base'],
76
+ [
77
+ [0, '-'],
78
+ [
79
+ [0, '*'],
80
+ [1, 'exp'],
81
+ [2, -1]
82
+ ],
83
+ [2, 1]
84
+ ]
85
+ ]
86
+ ]
87
+ ]
88
+ ],
89
+ [
90
+ [0, 'if'],
91
+ [
92
+ [0, '='],
93
+ [1, 'exp'],
94
+ [2, 0]
95
+ ],
96
+ [2, 1],
97
+ [
98
+ [0, 'if'],
99
+ [
100
+ [0, '='],
101
+ [1, 'exp'],
102
+ [2, 1]
103
+ ],
104
+ [1, 'base'],
105
+ [
106
+ [0, 'if'],
107
+ [[2, 1]],
108
+ [
109
+ [0, '*'],
110
+ [1, 'base'],
111
+ [
112
+ [0, 'power'],
113
+ [1, 'base'],
114
+ [
115
+ [0, '-'],
116
+ [1, 'exp'],
117
+ [2, 1]
118
+ ]
119
+ ]
120
+ ]
121
+ ]
122
+ ]
123
+ ]
124
+ ]
125
+ ]
126
+ ],
127
+ [
128
+ [0, 'power'],
129
+ [1, 'base'],
130
+ [1, 'exp']
131
+ ]
132
+ ]
133
+ ]
134
+ export const FLOOR = [
135
+ [
136
+ [0, 'lambda'],
137
+ [1, 'n'],
138
+ [
139
+ [0, '|'],
140
+ [1, 'n'],
141
+ [2, 0]
142
+ ]
143
+ ]
144
+ ]
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.3.0",
5
+ "version": "1.3.1",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/compiler.js CHANGED
@@ -86,24 +86,8 @@ const Helpers = {
86
86
  __lt: '__lt=(a,b)=>+(a<b)',
87
87
  array: 'array=(...args)=>args',
88
88
  not: 'not=(a)=>+!a',
89
- and: `and=(...args)=>{
90
- let circuit;
91
- for(let i=0; i<args.length-1;++i){
92
- circuit=args[i]
93
- if(circuit) continue
94
- else return 0
95
- }
96
- return args.at(-1) ? 1 : 0
97
- }`,
98
- or: `or=(...args)=>{
99
- let circuit;
100
- for(let i=0;i<args.length-1;++i) {
101
- circuit = args[i]
102
- if(circuit) return 1
103
- else continue
104
- }
105
- return args.at(-1) ? 1 : 0
106
- }`,
89
+ and: `and=(a, b)=>+(a&&b)`,
90
+ or: `or=(a, b)=>+(a||b)`,
107
91
  log_effect: `log_effect=(msg)=>{console.log(msg);return msg}`,
108
92
  log_char_effect: `log_char_effect=(msg)=>{console.log(String.fromCharCode(msg));return msg}`,
109
93
  log_string_effect: `log_string_effect=(msg)=>{console.log(msg.map(x=>String.fromCharCode(x)).join(''));return msg}`,
@@ -432,28 +432,22 @@ export const keywords = {
432
432
  KEYWORDS.AND
433
433
  } ${stringifyArgs(args)})`
434
434
  )
435
- let circuit
436
- for (let i = 0; i < args.length - 1; ++i) {
437
- circuit = evaluate(args[i], env)
438
- if (circuit !== FALSE && circuit !== TRUE)
439
- throw new TypeError(
440
- `Condition of (${
441
- KEYWORDS.AND
442
- }) must be ${TRUE} or ${FALSE} but got (${
443
- KEYWORDS.AND
444
- } ${stringifyArgs(args)})`
445
- )
446
- if (circuit) continue
447
- else return 0
448
- }
449
- const end = evaluate(args.at(-1), env)
450
- if (end !== FALSE && end !== TRUE)
435
+ const a = evaluate(args[0], env)
436
+ if (a !== FALSE && a !== TRUE)
451
437
  throw new TypeError(
452
- `Condition of (${KEYWORDS.AND}) must be ${TRUE} or ${FALSE} but got (${
453
- KEYWORDS.AND
438
+ `Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
439
+ KEYWORDS.OR
454
440
  } ${stringifyArgs(args)})`
455
441
  )
456
- return end
442
+ if (!a) return 0
443
+ const b = evaluate(args[1], env)
444
+ if (b !== FALSE && b !== TRUE)
445
+ throw new TypeError(
446
+ `Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
447
+ KEYWORDS.OR
448
+ } ${stringifyArgs(args)})`
449
+ )
450
+ return b
457
451
  },
458
452
  [KEYWORDS.OR]: (args, env) => {
459
453
  if (args.length !== 2)
@@ -462,26 +456,22 @@ export const keywords = {
462
456
  KEYWORDS.OR
463
457
  } ${stringifyArgs(args)})`
464
458
  )
465
- let circuit
466
- for (let i = 0; i < args.length - 1; ++i) {
467
- circuit = evaluate(args[i], env)
468
- if (circuit !== FALSE && circuit !== TRUE)
469
- throw new TypeError(
470
- `Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
471
- KEYWORDS.OR
472
- } ${stringifyArgs(args)})`
473
- )
474
- if (circuit) return 1
475
- else continue
476
- }
477
- const end = evaluate(args.at(-1), env)
478
- if (end !== FALSE && end !== TRUE)
459
+ const a = evaluate(args[0], env)
460
+ if (a !== FALSE && a !== TRUE)
461
+ throw new TypeError(
462
+ `Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
463
+ KEYWORDS.OR
464
+ } ${stringifyArgs(args)})`
465
+ )
466
+ if (a) return 1
467
+ const b = evaluate(args[1], env)
468
+ if (b !== FALSE && b !== TRUE)
479
469
  throw new TypeError(
480
470
  `Condition of (${KEYWORDS.OR}) must be ${TRUE} or ${FALSE} but got (${
481
471
  KEYWORDS.OR
482
472
  } ${stringifyArgs(args)})`
483
473
  )
484
- return end
474
+ return b
485
475
  },
486
476
  [KEYWORDS.CALL_FUNCTION]: (args, env) => {
487
477
  if (!args.length)
package/src/utils.js CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  } from './keywords.js'
14
14
  import { evaluate, run } from './evaluator.js'
15
15
  import { AST, isLeaf, LISP } from './parser.js'
16
+ import { EXPONENTIATION, FLOOR } from '../lib/baked/macros.js'
16
17
  export const logError = (error) =>
17
18
  console.log('\x1b[31m', `\n${error}\n`, '\x1b[0m')
18
19
  export const logSuccess = (output) => console.log(output, '\x1b[0m')
@@ -362,139 +363,7 @@ export const js = (source, deps) => {
362
363
  ])
363
364
  return `${top}${program}`
364
365
  }
365
- const EXPONENTIATION = [
366
- [0, 'lambda'],
367
- [1, 'base'],
368
- [1, 'exp'],
369
- [
370
- [0, 'do'],
371
- [
372
- [0, 'let'],
373
- [1, 'power'],
374
- [
375
- [0, 'lambda'],
376
- [1, 'base'],
377
- [1, 'exp'],
378
- [
379
- [0, 'if'],
380
- [
381
- [0, '<'],
382
- [1, 'exp'],
383
- [2, 0]
384
- ],
385
- [
386
- [0, 'if'],
387
- [
388
- [0, '='],
389
- [1, 'base'],
390
- [2, 0]
391
- ],
392
- [
393
- [0, 'throw'],
394
- [
395
- [0, 'array'],
396
- [2, 66],
397
- [2, 97],
398
- [2, 115],
399
- [2, 101],
400
- [2, 32],
401
- [2, 99],
402
- [2, 97],
403
- [2, 110],
404
- [2, 39],
405
- [2, 116],
406
- [2, 32],
407
- [2, 98],
408
- [2, 101],
409
- [2, 32],
410
- [2, 48],
411
- [2, 32],
412
- [2, 105],
413
- [2, 102],
414
- [2, 32],
415
- [2, 101],
416
- [2, 120],
417
- [2, 112],
418
- [2, 111],
419
- [2, 110],
420
- [2, 101],
421
- [2, 110],
422
- [2, 116],
423
- [2, 32],
424
- [2, 105],
425
- [2, 115],
426
- [2, 32],
427
- [2, 60],
428
- [2, 32],
429
- [2, 48]
430
- ]
431
- ],
432
- [
433
- [0, '/'],
434
- [
435
- [0, '*'],
436
- [1, 'base'],
437
- [
438
- [0, 'power'],
439
- [1, 'base'],
440
- [
441
- [0, '-'],
442
- [
443
- [0, '*'],
444
- [1, 'exp'],
445
- [2, -1]
446
- ],
447
- [2, 1]
448
- ]
449
- ]
450
- ]
451
- ]
452
- ],
453
- [
454
- [0, 'if'],
455
- [
456
- [0, '='],
457
- [1, 'exp'],
458
- [2, 0]
459
- ],
460
- [2, 1],
461
- [
462
- [0, 'if'],
463
- [
464
- [0, '='],
465
- [1, 'exp'],
466
- [2, 1]
467
- ],
468
- [1, 'base'],
469
- [
470
- [0, 'if'],
471
- [[2, 1]],
472
- [
473
- [0, '*'],
474
- [1, 'base'],
475
- [
476
- [0, 'power'],
477
- [1, 'base'],
478
- [
479
- [0, '-'],
480
- [1, 'exp'],
481
- [2, 1]
482
- ]
483
- ]
484
- ]
485
- ]
486
- ]
487
- ]
488
- ]
489
- ]
490
- ],
491
- [
492
- [0, 'power'],
493
- [1, 'base'],
494
- [1, 'exp']
495
- ]
496
- ]
497
- ]
366
+
498
367
  export const deSuggar = (ast) => {
499
368
  if (ast.length === 0) throw new SyntaxError(`No expressions to evaluate`)
500
369
  // for (const node of ast)
@@ -514,22 +383,7 @@ export const deSuggar = (ast) => {
514
383
  break
515
384
  case SUGGAR.INTEGER_DEVISION:
516
385
  exp.length = 0
517
- exp.push(
518
- ...[
519
- [APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
520
- [WORD, 'a'],
521
- [WORD, 'b'],
522
- [
523
- [APPLY, KEYWORDS.BITWISE_OR],
524
- [
525
- [APPLY, KEYWORDS.DIVISION],
526
- [WORD, 'a'],
527
- [WORD, 'b']
528
- ],
529
- [ATOM, 0]
530
- ]
531
- ]
532
- )
386
+ exp.push(...FLOOR)
533
387
  break
534
388
  }
535
389
  }
@@ -638,17 +492,10 @@ export const deSuggar = (ast) => {
638
492
  SUGGAR.INTEGER_DEVISION
639
493
  } ${stringifyArgs(rest)})`
640
494
  )
641
- else if (rest.some((x) => x[TYPE] === APPLY))
642
- throw new TypeError(
643
- `Arguments of (${
644
- SUGGAR.INTEGER_DEVISION
645
- }), must be (or atom word) (hint use (math:floor (${
646
- KEYWORDS.DIVISION
647
- } a b)) instead) (${
648
- SUGGAR.INTEGER_DEVISION
649
- } ${stringifyArgs(rest)})`
650
- )
651
- else {
495
+ else if (rest.some((x) => x[TYPE] === APPLY)) {
496
+ exp.length = 0
497
+ exp.push([0, KEYWORDS.CALL_FUNCTION], FLOOR, ...rest)
498
+ } else {
652
499
  exp.length = 1
653
500
  exp[0] = [APPLY, KEYWORDS.BITWISE_OR]
654
501
  exp.push([[APPLY, KEYWORDS.DIVISION], ...rest])
@@ -680,13 +527,23 @@ export const deSuggar = (ast) => {
680
527
  const exponent = exp[1]
681
528
  const power = exp[2]
682
529
  exp.length = 0
683
- exp.push([0, 'apply'], EXPONENTIATION, exponent, power)
530
+ exp.push(
531
+ [0, KEYWORDS.CALL_FUNCTION],
532
+ EXPONENTIATION,
533
+ exponent,
534
+ power
535
+ )
684
536
  }
685
537
  } else {
686
538
  const exponent = exp[1]
687
539
  const power = exp[2]
688
540
  exp.length = 0
689
- exp.push([0, 'apply'], EXPONENTIATION, exponent, power)
541
+ exp.push(
542
+ [0, KEYWORDS.CALL_FUNCTION],
543
+ EXPONENTIATION,
544
+ exponent,
545
+ power
546
+ )
690
547
  }
691
548
  deSuggar(exp)
692
549
  }
@@ -798,7 +655,6 @@ export const deSuggar = (ast) => {
798
655
  }
799
656
  deSuggar(exp)
800
657
  break
801
-
802
658
  case SUGGAR.NOT_EQUAL_1:
803
659
  case SUGGAR.NOT_EQUAL_2:
804
660
  {