From 3d6ea4b39785b91fb07a1aa02c9bb78e43e600f1 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 1 Nov 2021 10:51:00 -0400 Subject: [PATCH] (or) should return the last value even if falsy --- kiss/src/kiss/Macros.hx | 27 ++++++++++++++++---------- kiss/src/test/cases/BasicTestCase.hx | 2 +- kiss/src/test/cases/BasicTestCase.kiss | 8 +++++++- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 89d004ea..21955cfe 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -233,23 +233,30 @@ class Macros { var b = wholeExp.expBuilder(); var uniqueVarSymbol = b.symbol(); + var lastValue = args.pop(); b.begin([ b.call(b.symbol("localVar"), [ b.meta("mut", b.typed("Dynamic", uniqueVarSymbol)), b.symbol("null") ]), - b.call(b.symbol("cond"), [ - for (arg in args) { + b.call( + b.symbol("cond"), [ + for (arg in args) { + b.call( + b.call(b.symbol("set"), [ + uniqueVarSymbol, + arg + ]), [ + uniqueVarSymbol + ]); + } + ].concat([ b.call( - b.call(b.symbol("set"), [ - uniqueVarSymbol, - arg - ]), [ - uniqueVarSymbol - ]); - } - ]) + b.symbol("true"), [ + lastValue + ]) + ])) ]); }; diff --git a/kiss/src/test/cases/BasicTestCase.hx b/kiss/src/test/cases/BasicTestCase.hx index 8bd50c54..462defb9 100644 --- a/kiss/src/test/cases/BasicTestCase.hx +++ b/kiss/src/test/cases/BasicTestCase.hx @@ -167,7 +167,7 @@ class BasicTestCase extends Test { } function testOr() { - Assert.equals(5, BasicTestCase.myOr1); + _testOr(); } function testAnd() { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 6eda4ccd..946e0572 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -172,7 +172,13 @@ (var myCondFallthrough (cond (false "not this"))) -(var myOr1 (or null 5)) +(function _testOr [] + (Assert.equals 5 (or null 5)) + // If the last value is falsy it can still be returned without breaking + // the expected behavior of or -- which also allows for the (or ) + // idiom for empty arrays and strings + (Assert.equals (.toString []) (.toString (or null []))) + (Assert.equals "" (or null [] ""))) (var myAnd1 (and 5 6)) (var myAnd2 (and false 5 6))