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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +25 -11
- package/src/macros.js +11 -0
package/package.json
CHANGED
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
|
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 (
|
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]
|
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 #
|
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
|
-
|
950
|
-
|
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()
|