From 33b4399c3b6c0aada55e574baa37beab899f73d1 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 12 Jul 2021 20:33:54 -0600 Subject: [PATCH] Close #5 --- kiss/src/kiss/Macros.hx | 35 +++++++++++++------------- kiss/src/test/cases/BasicTestCase.kiss | 8 +++++- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 871b2de5..347c9b89 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -567,13 +567,15 @@ class Macros { var bindingList = exps[0].bindingList("ifLet"); var firstPattern = bindingList.shift(); var firstValue = bindingList.shift(); + var firstValueSymbol = b.symbol(); - return b.call( - b.symbol("if"), [ - firstValue, + return b.callSymbol("let", [ + b.list([firstValueSymbol, firstValue]), + b.callSymbol("if", [ + firstValueSymbol, b.call( b.symbol("case"), [ - firstValue, + firstValueSymbol, b.call( firstPattern, [ if (bindingList.length == 0) { @@ -590,7 +592,8 @@ class Macros { ]) ]), elseExp - ]); + ]) + ]); } macros["ifLet"] = ifLet; @@ -598,23 +601,21 @@ class Macros { 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") - ]); + b.callSymbol("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)) - ]); + b.callSymbol("ifLet", [ + exps[0], + b.symbol("null"), + b.begin(exps.slice(1)) + ]); }; // TODO test this diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 84a61949..fca6ad69 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -459,7 +459,13 @@ (Assert.fail)) (unlessLet [(Some (or 5 6)) some5] (print "something else went wrong!") - (Assert.fail)))) + (Assert.fail)) + + // Don't double evaluate the expression: + (let [&mut v 1] + (unlessLet [2 (begin (+= v 1) v)] + (Assert.fail)) + (Assert.equals 2 v)))) (defun _testRawString [] (Assert.equals #| "\\" |# #"\"#)