diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 917c750a..2172be05 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -421,7 +421,7 @@ class Macros { // Macros that null-check and extract patterns from enums (inspired by Rust) function ifLet(wholeExp:ReaderExp, exps:Array, 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, 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, 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, k:KissState) { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 34e59939..0ec51f1d 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -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)))) \ No newline at end of file