whenLet, unlessLet

This commit is contained in:
2021-01-16 21:36:29 -07:00
parent 5be8276c42
commit 4fa26c0b9b
2 changed files with 28 additions and 9 deletions

View File

@@ -421,7 +421,7 @@ class Macros {
// Macros that null-check and extract patterns from enums (inspired by Rust)
function ifLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
wholeExp.checkNumArgs(2, null, "(ifLet [[enum bindings...]] [thenExp] [?elseExp])");
wholeExp.checkNumArgs(2, 3, "(ifLet [[enum bindings...]] [thenExp] [?elseExp])");
var b = wholeExp.expBuilder();
var thenExp = exps[1];
@@ -462,10 +462,27 @@ class Macros {
macros["ifLet"] = ifLet;
// TODO whenLet
// wholeExp.checkNumArgs(2, null, "(whenLet [[enum bindings...]] [body...])");
// TODO unlessLet
// wholeExp.checkNumArgs(2, null, "(unlessLet [[enum bindings...]] [body...])");
macros["whenLet"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, null, "(whenLet [[enum bindings...]] [body...])");
var b = wholeExp.expBuilder();
b.call(
b.symbol("ifLet"), [
exps[0],
b.begin(exps.slice(1)),
b.symbol("null")
]);
};
macros["unlessLet"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, null, "(unlessLet [[enum bindings...]] [body...])");
var b = wholeExp.expBuilder();
b.call(
b.symbol("ifLet"), [
exps[0],
b.symbol("null"),
b.begin(exps.slice(1))
]);
};
// TODO use expBuilder()
function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {

View File

@@ -447,9 +447,11 @@
(Some b) some6]
(Assert.equals 11 (+ a b))
(Assert.fail))
(ifLet [(Some a) oops]
(Assert.fail))
(ifLet [(Some (or 5 6)) some5]
(Assert.pass))
(ifLet [(Some a) none]
(Assert.fail))
(whenLet [(Some a) oops]
(print "something went wrong!")
(Assert.fail))
(unlessLet [(Some (or 5 6)) some5]
(print "something else went wrong!")
(Assert.fail))))