fez-lisp 1.5.21 → 1.5.23

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.21",
5
+ "version": "1.5.23",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -21,12 +21,6 @@ const RETURNS = 'returns'
21
21
  const SCOPE_NAME = '__scope__'
22
22
  const SUBTYPE = 'subtype'
23
23
  const PREDICATE = 3
24
- const xor = (A, B) => {
25
- const out = new Set()
26
- B.forEach((element) => !A.has(element) && out.add(element))
27
- A.forEach((element) => !B.has(element) && out.add(element))
28
- return out
29
- }
30
24
  const toTypeNames = (type) => {
31
25
  switch (type) {
32
26
  case APPLY:
@@ -48,7 +42,7 @@ export const typeCheck = (ast) => {
48
42
  [UNKNOWN, PLACEHOLDER],
49
43
  [APPLY, PLACEHOLDER]
50
44
  ],
51
- [ARGS_COUNT]: new Set([2]),
45
+ [ARGS_COUNT]: 2,
52
46
  [RETURNS]: UNKNOWN
53
47
  }
54
48
  },
@@ -83,7 +77,7 @@ export const typeCheck = (ast) => {
83
77
  [KEYWORDS.LOOP]: {
84
78
  [STATS]: {
85
79
  type: APPLY,
86
- [ARGS_COUNT]: new Set([2]),
80
+ [ARGS_COUNT]: 2,
87
81
  [ARGS]: [
88
82
  [ATOM, PLACEHOLDER, PREDICATE],
89
83
  [UNKNOWN, PLACEHOLDER]
@@ -95,7 +89,7 @@ export const typeCheck = (ast) => {
95
89
  [KEYWORDS.ADDITION]: {
96
90
  [STATS]: {
97
91
  type: APPLY,
98
- [ARGS_COUNT]: new Set([2]),
92
+ [ARGS_COUNT]: 2,
99
93
  [ARGS]: [
100
94
  [ATOM, PLACEHOLDER],
101
95
  [ATOM, PLACEHOLDER]
@@ -106,7 +100,7 @@ export const typeCheck = (ast) => {
106
100
  [KEYWORDS.MULTIPLICATION]: {
107
101
  [STATS]: {
108
102
  type: APPLY,
109
- [ARGS_COUNT]: new Set([2]),
103
+ [ARGS_COUNT]: 2,
110
104
  [ARGS]: [
111
105
  [ATOM, PLACEHOLDER],
112
106
  [ATOM, PLACEHOLDER]
@@ -117,7 +111,7 @@ export const typeCheck = (ast) => {
117
111
  [KEYWORDS.SUBTRACTION]: {
118
112
  [STATS]: {
119
113
  type: APPLY,
120
- [ARGS_COUNT]: new Set([1, 2]),
114
+ [ARGS_COUNT]: 2,
121
115
  [ARGS]: [
122
116
  [ATOM, PLACEHOLDER],
123
117
  [ATOM, PLACEHOLDER]
@@ -128,7 +122,7 @@ export const typeCheck = (ast) => {
128
122
  [KEYWORDS.DIVISION]: {
129
123
  [STATS]: {
130
124
  type: APPLY,
131
- [ARGS_COUNT]: new Set([2]),
125
+ [ARGS_COUNT]: 2,
132
126
  [ARGS]: [
133
127
  [ATOM, PLACEHOLDER],
134
128
  [ATOM, PLACEHOLDER]
@@ -139,7 +133,7 @@ export const typeCheck = (ast) => {
139
133
  [KEYWORDS.REMAINDER_OF_DIVISION]: {
140
134
  [STATS]: {
141
135
  type: APPLY,
142
- [ARGS_COUNT]: new Set([2]),
136
+ [ARGS_COUNT]: 2,
143
137
  [ARGS]: [
144
138
  [ATOM, PLACEHOLDER],
145
139
  [ATOM, PLACEHOLDER]
@@ -150,7 +144,7 @@ export const typeCheck = (ast) => {
150
144
  [KEYWORDS.BITWISE_AND]: {
151
145
  [STATS]: {
152
146
  type: APPLY,
153
- [ARGS_COUNT]: new Set([2]),
147
+ [ARGS_COUNT]: 2,
154
148
  [ARGS]: [
155
149
  [ATOM, PLACEHOLDER],
156
150
  [ATOM, PLACEHOLDER]
@@ -161,7 +155,7 @@ export const typeCheck = (ast) => {
161
155
  [KEYWORDS.BITWISE_NOT]: {
162
156
  [STATS]: {
163
157
  type: APPLY,
164
- [ARGS_COUNT]: new Set([1]),
158
+ [ARGS_COUNT]: 1,
165
159
  [ARGS]: [[ATOM, PLACEHOLDER]],
166
160
  [RETURNS]: ATOM
167
161
  }
@@ -169,7 +163,7 @@ export const typeCheck = (ast) => {
169
163
  [KEYWORDS.BITWISE_OR]: {
170
164
  [STATS]: {
171
165
  type: APPLY,
172
- [ARGS_COUNT]: new Set([2]),
166
+ [ARGS_COUNT]: 2,
173
167
  [ARGS]: [
174
168
  [ATOM, PLACEHOLDER],
175
169
  [ATOM, PLACEHOLDER]
@@ -180,7 +174,7 @@ export const typeCheck = (ast) => {
180
174
  [KEYWORDS.BITWISE_XOR]: {
181
175
  [STATS]: {
182
176
  type: APPLY,
183
- [ARGS_COUNT]: new Set([2]),
177
+ [ARGS_COUNT]: 2,
184
178
  [ARGS]: [
185
179
  [ATOM, PLACEHOLDER],
186
180
  [ATOM, PLACEHOLDER]
@@ -191,7 +185,7 @@ export const typeCheck = (ast) => {
191
185
  [KEYWORDS.BITWISE_LEFT_SHIFT]: {
192
186
  [STATS]: {
193
187
  type: APPLY,
194
- [ARGS_COUNT]: new Set([2]),
188
+ [ARGS_COUNT]: 2,
195
189
  [ARGS]: [
196
190
  [ATOM, PLACEHOLDER],
197
191
  [ATOM, PLACEHOLDER]
@@ -202,7 +196,7 @@ export const typeCheck = (ast) => {
202
196
  [KEYWORDS.BITWISE_RIGHT_SHIFT]: {
203
197
  [STATS]: {
204
198
  type: APPLY,
205
- [ARGS_COUNT]: new Set([2]),
199
+ [ARGS_COUNT]: 2,
206
200
  [ARGS]: [
207
201
  [ATOM, PLACEHOLDER],
208
202
  [ATOM, PLACEHOLDER]
@@ -213,7 +207,7 @@ export const typeCheck = (ast) => {
213
207
  [KEYWORDS.GET_ARRAY]: {
214
208
  [STATS]: {
215
209
  type: APPLY,
216
- [ARGS_COUNT]: new Set([2]),
210
+ [ARGS_COUNT]: 2,
217
211
  [ARGS]: [
218
212
  [UNKNOWN, PLACEHOLDER],
219
213
  [ATOM, PLACEHOLDER]
@@ -224,7 +218,7 @@ export const typeCheck = (ast) => {
224
218
  [KEYWORDS.SET_ARRAY]: {
225
219
  [STATS]: {
226
220
  type: APPLY,
227
- [ARGS_COUNT]: new Set([3]),
221
+ [ARGS_COUNT]: 3,
228
222
  [ARGS]: [
229
223
  [UNKNOWN, PLACEHOLDER],
230
224
  [ATOM, PLACEHOLDER],
@@ -236,7 +230,7 @@ export const typeCheck = (ast) => {
236
230
  [KEYWORDS.POP_ARRAY]: {
237
231
  [STATS]: {
238
232
  type: APPLY,
239
- [ARGS_COUNT]: new Set([1]),
233
+ [ARGS_COUNT]: 1,
240
234
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
241
235
  [RETURNS]: UNKNOWN
242
236
  }
@@ -244,7 +238,7 @@ export const typeCheck = (ast) => {
244
238
  [KEYWORDS.ARRAY_LENGTH]: {
245
239
  [STATS]: {
246
240
  type: APPLY,
247
- [ARGS_COUNT]: new Set([1]),
241
+ [ARGS_COUNT]: 1,
248
242
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
249
243
  [RETURNS]: ATOM
250
244
  }
@@ -252,7 +246,7 @@ export const typeCheck = (ast) => {
252
246
  [KEYWORDS.IF]: {
253
247
  [STATS]: {
254
248
  type: APPLY,
255
- [ARGS_COUNT]: new Set([3]),
249
+ [ARGS_COUNT]: 3,
256
250
  [ARGS]: [
257
251
  [ATOM, PLACEHOLDER, PREDICATE],
258
252
  [UNKNOWN, PLACEHOLDER],
@@ -264,7 +258,7 @@ export const typeCheck = (ast) => {
264
258
  [KEYWORDS.NOT]: {
265
259
  [STATS]: {
266
260
  type: APPLY,
267
- [ARGS_COUNT]: new Set([1]),
261
+ [ARGS_COUNT]: 1,
268
262
  [ARGS]: [[ATOM, PLACEHOLDER, PREDICATE]],
269
263
  [RETURNS]: ATOM,
270
264
  [SUBTYPE]: PREDICATE
@@ -273,7 +267,7 @@ export const typeCheck = (ast) => {
273
267
  [KEYWORDS.EQUAL]: {
274
268
  [STATS]: {
275
269
  type: APPLY,
276
- [ARGS_COUNT]: new Set([2]),
270
+ [ARGS_COUNT]: 2,
277
271
  [ARGS]: [
278
272
  [ATOM, PLACEHOLDER],
279
273
  [ATOM, PLACEHOLDER]
@@ -285,7 +279,7 @@ export const typeCheck = (ast) => {
285
279
  [KEYWORDS.LESS_THAN]: {
286
280
  [STATS]: {
287
281
  type: APPLY,
288
- [ARGS_COUNT]: new Set([2]),
282
+ [ARGS_COUNT]: 2,
289
283
  [ARGS]: [
290
284
  [ATOM, PLACEHOLDER],
291
285
  [ATOM, PLACEHOLDER]
@@ -297,7 +291,7 @@ export const typeCheck = (ast) => {
297
291
  [KEYWORDS.GREATHER_THAN]: {
298
292
  [STATS]: {
299
293
  type: APPLY,
300
- [ARGS_COUNT]: new Set([2]),
294
+ [ARGS_COUNT]: 2,
301
295
  [ARGS]: [
302
296
  [ATOM, PLACEHOLDER],
303
297
  [ATOM, PLACEHOLDER]
@@ -309,7 +303,7 @@ export const typeCheck = (ast) => {
309
303
  [KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
310
304
  [STATS]: {
311
305
  type: APPLY,
312
- [ARGS_COUNT]: new Set([2]),
306
+ [ARGS_COUNT]: 2,
313
307
  [ARGS]: [
314
308
  [ATOM, PLACEHOLDER],
315
309
  [ATOM, PLACEHOLDER]
@@ -321,7 +315,7 @@ export const typeCheck = (ast) => {
321
315
  [KEYWORDS.LESS_THAN_OR_EQUAL]: {
322
316
  [STATS]: {
323
317
  type: APPLY,
324
- [ARGS_COUNT]: new Set([2]),
318
+ [ARGS_COUNT]: 2,
325
319
  [ARGS]: [
326
320
  [ATOM, PLACEHOLDER],
327
321
  [ATOM, PLACEHOLDER]
@@ -333,7 +327,7 @@ export const typeCheck = (ast) => {
333
327
  [KEYWORDS.AND]: {
334
328
  [STATS]: {
335
329
  type: APPLY,
336
- [ARGS_COUNT]: new Set([2]),
330
+ [ARGS_COUNT]: 2,
337
331
  [ARGS]: [
338
332
  [ATOM, PLACEHOLDER, PREDICATE],
339
333
  [ATOM, PLACEHOLDER, PREDICATE]
@@ -345,7 +339,7 @@ export const typeCheck = (ast) => {
345
339
  [KEYWORDS.OR]: {
346
340
  [STATS]: {
347
341
  type: APPLY,
348
- [ARGS_COUNT]: new Set([2]),
342
+ [ARGS_COUNT]: 2,
349
343
  [ARGS]: [
350
344
  [ATOM, PLACEHOLDER, PREDICATE],
351
345
  [ATOM, PLACEHOLDER, PREDICATE]
@@ -357,7 +351,7 @@ export const typeCheck = (ast) => {
357
351
  [KEYWORDS.IS_ATOM]: {
358
352
  [STATS]: {
359
353
  type: APPLY,
360
- [ARGS_COUNT]: new Set([1]),
354
+ [ARGS_COUNT]: 1,
361
355
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
362
356
  [RETURNS]: ATOM,
363
357
  [SUBTYPE]: PREDICATE
@@ -366,7 +360,7 @@ export const typeCheck = (ast) => {
366
360
  [KEYWORDS.IS_LAMBDA]: {
367
361
  [STATS]: {
368
362
  type: APPLY,
369
- [ARGS_COUNT]: new Set([1]),
363
+ [ARGS_COUNT]: 1,
370
364
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
371
365
  [RETURNS]: ATOM,
372
366
  [SUBTYPE]: PREDICATE
@@ -375,7 +369,7 @@ export const typeCheck = (ast) => {
375
369
  [KEYWORDS.ERROR]: {
376
370
  [STATS]: {
377
371
  type: APPLY,
378
- [ARGS_COUNT]: new Set([1]),
372
+ [ARGS_COUNT]: 1,
379
373
  [ARGS]: [[UNKNOWN, PLACEHOLDER]],
380
374
  [RETURNS]: UNKNOWN
381
375
  }
@@ -419,7 +413,7 @@ export const typeCheck = (ast) => {
419
413
  env[name] = {
420
414
  [STATS]: {
421
415
  type: APPLY,
422
- [ARGS_COUNT]: new Set([n - 2]),
416
+ [ARGS_COUNT]: n - 2,
423
417
  [ARGS]: []
424
418
  }
425
419
  }
@@ -494,18 +488,15 @@ export const typeCheck = (ast) => {
494
488
  else if (
495
489
  env[first[VALUE]][STATS].type === APPLY &&
496
490
  env[first[VALUE]][STATS][ARGS_COUNT] !== VARIADIC &&
497
- !env[first[VALUE]][STATS][ARGS_COUNT].has(rest.length)
491
+ env[first[VALUE]][STATS][ARGS_COUNT] !== rest.length
498
492
  ) {
499
- const argCount = [...env[first[VALUE]][STATS][ARGS_COUNT]]
500
493
  errorStack.set(
501
494
  key,
502
495
  `Incorrect number of arguments for (${
503
496
  first[VALUE]
504
- }). Expected ${
505
- argCount.length > 1
506
- ? `(or ${argCount.map((x) => `(= ${x})`).join(' ')})`
507
- : `(= ${argCount[0]})`
508
- } but got ${rest.length} (${stringifyArgs(exp)})`
497
+ }). Expected (= ${
498
+ env[first[VALUE]][STATS][ARGS_COUNT]
499
+ }) but got ${rest.length} (${stringifyArgs(exp)})`
509
500
  )
510
501
  } else {
511
502
  const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
@@ -514,9 +505,7 @@ export const typeCheck = (ast) => {
514
505
  if (!env[first[VALUE]][STATS][ARGS_COUNT]) {
515
506
  env[first[VALUE]][STATS][RETURNS] = UNKNOWN
516
507
  env[first[VALUE]][STATS].type = APPLY
517
- env[first[VALUE]][STATS][ARGS_COUNT] = new Set([
518
- rest.length
519
- ])
508
+ env[first[VALUE]][STATS][ARGS_COUNT] = rest.length
520
509
  }
521
510
  }
522
511
  // also type of arg
@@ -532,24 +521,17 @@ export const typeCheck = (ast) => {
532
521
  args[i][STATS][ARGS_COUNT] !== VARIADIC &&
533
522
  env[rest[i][VALUE]][STATS][ARGS_COUNT] !== VARIADIC
534
523
  ) {
535
- const argCount = [...args[i][STATS][ARGS_COUNT]]
536
524
  if (
537
- xor(
538
- args[i][STATS][ARGS_COUNT],
539
- env[rest[i][VALUE]][STATS][ARGS_COUNT]
540
- ).size !== 0
525
+ args[i][STATS][ARGS_COUNT] !==
526
+ env[rest[i][VALUE]][STATS][ARGS_COUNT]
541
527
  ) {
542
528
  errorStack.set(
543
529
  key,
544
530
  `Incorrect number of arguments for (${
545
531
  first[VALUE]
546
- }). Expected ${
547
- argCount.length > 1
548
- ? `(or ${argCount
549
- .map((x) => `(= ${x})`)
550
- .join(' ')})`
551
- : `(= ${argCount[0]})`
552
- } but got ${rest.length} (${stringifyArgs(exp)})`
532
+ }). Expected (= ${
533
+ args[i][STATS][ARGS_COUNT]
534
+ }) but got ${rest.length} (${stringifyArgs(exp)})`
553
535
  )
554
536
  }
555
537
  } else if (
@@ -559,19 +541,14 @@ export const typeCheck = (ast) => {
559
541
  rest[i][0][TYPE] === APPLY &&
560
542
  rest[i][0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
561
543
  ) {
562
- const argCount = [...args[i][STATS][ARGS_COUNT]]
563
- if (!args[i][STATS][ARGS_COUNT].has(rest[i].length - 2))
544
+ if (args[i][STATS][ARGS_COUNT] !== rest[i].length - 2)
564
545
  errorStack.set(
565
546
  key,
566
547
  `Incorrect number of arguments for (${
567
548
  first[VALUE]
568
- }). Expected ${
569
- argCount.length > 1
570
- ? `(or ${argCount
571
- .map((x) => `(= ${x})`)
572
- .join(' ')})`
573
- : `(= ${argCount[0]})`
574
- } but got ${rest.length} (${stringifyArgs(exp)})`
549
+ }). Expected (= ${
550
+ args[i][STATS][ARGS_COUNT]
551
+ }) but got ${rest.length} (${stringifyArgs(exp)})`
575
552
  )
576
553
  }
577
554
 
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:
@@ -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(
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: