fez-lisp 1.3.14 → 1.3.16

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/macros.js +95 -52
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.14",
5
+ "version": "1.3.16",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/macros.js CHANGED
@@ -59,6 +59,8 @@ export const deSuggarAst = (ast, scope) => {
59
59
  exp.length = 0
60
60
  exp.push(...INTEGER_DIVISION)
61
61
  break
62
+ default:
63
+ break
62
64
  }
63
65
  }
64
66
  break
@@ -369,70 +371,111 @@ export const deSuggarAst = (ast, scope) => {
369
371
  break
370
372
  case KEYWORDS.DEFINE_VARIABLE:
371
373
  {
372
- if (!isLeaf(exp[VALUE])) {
374
+ if (!isLeaf(exp[VALUE]) && exp[VALUE][0][TYPE] === APPLY) {
373
375
  const left = exp[VALUE]
374
376
  const right = exp.at(-1)
375
- // const key = AST.stringify(exp)
376
- // const index = scope.findIndex(
377
- // (x) => AST.stringify(x) === key
378
- // )
379
377
  const lastLeft = left.pop()
380
378
  const isSlicing = lastLeft[VALUE] !== PLACEHOLDER
381
- const vars = left.slice(1)
379
+ const vars = left
382
380
  const indexes = vars
383
381
  .map((x, i) => (x[VALUE] === PLACEHOLDER ? -1 : i))
384
382
  .filter((x) => x !== -1)
385
383
  let newScope
384
+ vars[0][TYPE] = WORD
386
385
  exp.length = 0
387
- switch (left[0][VALUE]) {
388
- case KEYWORDS.CREATE_ARRAY:
389
- {
390
- if (
391
- !isLeaf(right) &&
392
- right[0][TYPE] === APPLY &&
393
- right[0][VALUE] === KEYWORDS.CREATE_ARRAY
394
- ) {
395
- const values = right.slice(1)
396
- newScope = indexes.map((i) => [
397
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
398
- vars[i],
399
- values[i]
400
- ])
401
- if (isSlicing)
402
- newScope.push([
403
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
404
- lastLeft,
405
- [
406
- [APPLY, KEYWORDS.CREATE_ARRAY],
407
- ...values.slice(indexes.at(-1) + 1)
408
- ]
409
- ])
410
- } else {
411
- newScope = indexes.map((i) => [
412
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
413
- vars[i],
414
- [[APPLY, KEYWORDS.GET_ARRAY], right, [ATOM, i]]
415
- ])
416
- if (isSlicing)
417
- newScope.push([
418
- [APPLY, KEYWORDS.DEFINE_VARIABLE],
419
- lastLeft,
420
- [
421
- [APPLY, KEYWORDS.CALL_FUNCTION],
422
- SLICE,
423
- right,
424
- [ATOM, indexes.at(-1) + 1]
425
- ]
426
- ])
427
- }
428
- exp.iron = true
429
- exp.push(newScope)
430
- deSuggarAst(exp)
431
- }
432
- break
386
+ if (
387
+ !isLeaf(right) &&
388
+ right[0][TYPE] === APPLY &&
389
+ right[0][VALUE] === KEYWORDS.CREATE_ARRAY
390
+ ) {
391
+ const values = right.slice(1)
392
+ newScope = indexes.map((i) => [
393
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
394
+ vars[i],
395
+ values[i]
396
+ ])
397
+ if (isSlicing)
398
+ newScope.push([
399
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
400
+ lastLeft,
401
+ [
402
+ [APPLY, KEYWORDS.CREATE_ARRAY],
403
+ ...values.slice(indexes.at(-1) + 1)
404
+ ]
405
+ ])
406
+ } else {
407
+ newScope = indexes.map((i) => [
408
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
409
+ vars[i],
410
+ [[APPLY, KEYWORDS.GET_ARRAY], right, [ATOM, i]]
411
+ ])
412
+ if (isSlicing)
413
+ newScope.push([
414
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
415
+ lastLeft,
416
+ [
417
+ [APPLY, KEYWORDS.CALL_FUNCTION],
418
+ SLICE,
419
+ right,
420
+ [ATOM, indexes.at(-1) + 1]
421
+ ]
422
+ ])
423
+ }
424
+ exp.iron = true
425
+ exp.push(newScope)
426
+ deSuggarAst(exp)
427
+ }
428
+ }
429
+ break
430
+ case KEYWORDS.ANONYMOUS_FUNCTION:
431
+ {
432
+ const body = exp.at(-1)
433
+ const block =
434
+ body[0][TYPE] === APPLY && body[0][VALUE] === KEYWORDS.BLOCK
435
+ ? body[1]
436
+ : body
437
+ const newBlock = [[APPLY, KEYWORDS.BLOCK]]
438
+ for (let i = 1; i < exp.length - 1; ++i) {
439
+ if (!isLeaf(exp[i]) && exp[i][0][TYPE] === APPLY) {
440
+ const left = exp[i]
441
+ const right = [WORD, `_arg${i}`]
442
+ left[0][TYPE] = WORD
443
+ const lastLeft = left.pop()
444
+ const isSlicing = lastLeft[VALUE] !== PLACEHOLDER
445
+ const vars = left
446
+ const indexes = vars
447
+ .map((x, i) => (x[VALUE] === PLACEHOLDER ? -1 : i))
448
+ .filter((x) => x !== -1)
449
+
450
+ {
451
+ // const tempBlcok = [...block[VALUE]]
452
+ newBlock.push(
453
+ ...indexes.map((i) => [
454
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
455
+ vars[i],
456
+ [[APPLY, KEYWORDS.GET_ARRAY], right, [ATOM, i]]
457
+ ])
458
+ )
459
+ if (isSlicing)
460
+ newBlock.push([
461
+ [APPLY, KEYWORDS.DEFINE_VARIABLE],
462
+ lastLeft,
463
+ [
464
+ [APPLY, KEYWORDS.CALL_FUNCTION],
465
+ SLICE,
466
+ right,
467
+ [ATOM, indexes.at(-1) + 1]
468
+ ]
469
+ ])
470
+ exp[i] = right
471
+ exp[i].length = 2
472
+ }
473
+ exp[exp.length - 1] = newBlock.concat([block])
474
+ deSuggarAst(block)
433
475
  }
434
476
  }
435
477
  }
478
+
436
479
  break
437
480
  }
438
481
  prev = first