fez-lisp 1.5.38 → 1.5.40

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.38",
5
+ "version": "1.5.40",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -571,7 +571,10 @@ export const typeCheck = (ast) => {
571
571
  env[re[0][VALUE]][STATS].type
572
572
  env[name][STATS][SUB_RETURN_TYPE] =
573
573
  env[re[0][VALUE]][STATS][SUB_RETURN_TYPE]
574
- } else env[name][STATS][RETURNS] = UNKNOWN
574
+ } else {
575
+ env[name][STATS][RETURNS] = UNKNOWN
576
+ // env[name][STATS][RETURNS] = APPLY
577
+ }
575
578
  }
576
579
  break
577
580
  default:
@@ -589,6 +592,7 @@ export const typeCheck = (ast) => {
589
592
  }
590
593
  } else {
591
594
  env[name][STATS][RETURNS] = UNKNOWN
595
+ // env[name][STATS][RETURNS] = APPLY
592
596
  }
593
597
  break
594
598
  }
@@ -599,16 +603,20 @@ export const typeCheck = (ast) => {
599
603
  env[name][STATS][SUB_RETURN_TYPE] !== PREDICATE
600
604
  ) {
601
605
  warningStack.add(
602
- `${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (check #7)`
606
+ `${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (try wrapping it in a (true?) or (false?)) (check #7)`
603
607
  )
604
608
  } else if (
605
609
  !isPredicate &&
606
610
  env[name][STATS][SUB_RETURN_TYPE] === PREDICATE
607
611
  ) {
608
612
  warningStack.add(
609
- `${name} should end in (${PREDICATE_SUFFIX}) because it return (Predicate) (check #8)`
613
+ `${name} should end in (${PREDICATE_SUFFIX}) because it return (Predicate) (try adding ? at the end of the lambda name) (check #8)`
610
614
  )
611
615
  }
616
+ if (isPredicate) {
617
+ env[name][STATS][RETURNS] = ATOM
618
+ env[name][STATS][SUB_RETURN_TYPE] = PREDICATE
619
+ }
612
620
  // }
613
621
  // if (
614
622
  // env[name][STATS][RETURNS] === UNKNOWN &&
@@ -675,12 +683,20 @@ export const typeCheck = (ast) => {
675
683
  .toString()
676
684
  .replace('.', 0)
677
685
  }
678
- for (const param of params) {
686
+ for (let i = 0; i < params.length; ++i) {
687
+ const param = params[i]
679
688
  copy[param[VALUE]] = {
680
689
  [STATS]: { type: UNKNOWN, retried: 0 }
681
690
  }
682
- if (env[copy[SCOPE_NAME]])
683
- env[copy[SCOPE_NAME]][STATS][ARGS].push(copy[param[VALUE]])
691
+ if (env[copy[SCOPE_NAME]]) {
692
+ env[copy[SCOPE_NAME]][STATS][ARGS][i] = copy[param[VALUE]]
693
+ if (
694
+ param[VALUE][param[VALUE].length - 1] === PREDICATE_SUFFIX
695
+ ) {
696
+ copy[param[VALUE]][STATS][RETURNS] = ATOM
697
+ copy[param[VALUE]][STATS][SUB_RETURN_TYPE] = PREDICATE
698
+ }
699
+ }
684
700
  }
685
701
  check(rest.at(-1), copy, copy)
686
702
  }
@@ -707,7 +723,7 @@ export const typeCheck = (ast) => {
707
723
  env[first[VALUE]][STATS][ARGS_COUNT]
708
724
  }) but got ${rest.length} (${stringifyArgs(
709
725
  exp
710
- )}) (check #8)`
726
+ )}) (check #15)`
711
727
  )
712
728
  } else {
713
729
  const isSpecial = SPECIAL_FORMS_SET.has(first[VALUE])
@@ -946,9 +962,7 @@ export const typeCheck = (ast) => {
946
962
  copy[SCOPE_NAME] = 'root'
947
963
  check(copy, root, copy)
948
964
  while (stack.length) stack.pop()()
949
- if (errorStack.size)
950
- throw new TypeError(
951
- [...new Set(errorStack.values()), ...warningStack].join('\n')
952
- )
965
+ const issues = [...new Set(errorStack.values()), ...warningStack]
966
+ if (issues.length) throw new TypeError(issues.join('\n'))
953
967
  return ast
954
968
  }
package/src/macros.js CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  FALSE,
11
11
  KEYWORDS,
12
12
  PLACEHOLDER,
13
+ PREDICATE_SUFFIX,
13
14
  TRUE,
14
15
  TYPE,
15
16
  VALUE,
@@ -523,6 +524,11 @@ export const deSuggarAst = (ast, scope) => {
523
524
  const name = exp[1][VALUE]
524
525
  const prefix = name.split(':')[0]
525
526
  if (prefix === OPTIMIZATIONS.RECURSION) {
527
+ if (name[name.length - 1] === PREDICATE_SUFFIX) {
528
+ throw new TypeError(
529
+ `Optimized (lambda) ${name} can't be a (Predicate) as it will return a (lambda). Remove the (${PREDICATE_SUFFIX}) from the name`
530
+ )
531
+ }
526
532
  const args = last.slice(1, -1)
527
533
  const newName = `*${performance
528
534
  .now()
@@ -619,6 +625,11 @@ export const deSuggarAst = (ast, scope) => {
619
625
  ]
620
626
  deSuggarAst(exp[exp.length - 1])
621
627
  } else if (prefix === OPTIMIZATIONS.CACHE) {
628
+ if (name[name.length - 1] === PREDICATE_SUFFIX) {
629
+ throw new TypeError(
630
+ `Optimized (lambda) ${name} can't be a (Predicate) as it will return a (lambda). Remove the (${PREDICATE_SUFFIX}) from the name`
631
+ )
632
+ }
622
633
  const args = last.slice(1, -1)
623
634
  const newName = `*${performance
624
635
  .now()