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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +2 -2
- package/src/compiler.js +9 -10
- package/src/interpreter.js +5 -10
- package/src/macros.js +29 -0
package/package.json
CHANGED
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([
|
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([
|
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=
|
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
|
230
|
-
|
231
|
-
|
232
|
-
|
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
|
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(
|
package/src/interpreter.js
CHANGED
@@ -78,11 +78,11 @@ export const keywords = {
|
|
78
78
|
return a * b
|
79
79
|
},
|
80
80
|
[KEYWORDS.SUBTRACTION]: (args, env) => {
|
81
|
-
if (args.length !==
|
81
|
+
if (args.length !== 2)
|
82
82
|
throw new RangeError(
|
83
83
|
`Invalid number of arguments for (${
|
84
84
|
KEYWORDS.SUBTRACTION
|
85
|
-
}), expected (
|
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
|
473
|
+
if (args.length !== 3)
|
475
474
|
throw new RangeError(
|
476
475
|
`Invalid number of arguments for (${
|
477
476
|
KEYWORDS.IF
|
478
|
-
}), expected (
|
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)
|