From 2e85baa0483542f166f3221d541761c0259d3b14 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 25 Nov 2020 11:55:53 -0700 Subject: [PATCH] (and ...) --- src/kiss/Macros.hx | 25 +++++++++++++++++++ src/test/cases/BasicTestCase.hx | 6 +++++ src/test/cases/BasicTestCase.kiss | 4 +++ .../cases/CommentAtEndOfListTestCase.kiss | 4 +++ 4 files changed, 39 insertions(+) create mode 100644 src/test/cases/CommentAtEndOfListTestCase.kiss diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index f48a40e3..de7c18de 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -75,6 +75,31 @@ class Macros { ]).withPos(args[0].pos); }; + // (and... uses (cond... ) and (not ...) under the hood) + macros["and"] = (args:Array, k) -> { + var uniqueVarName = "_" + Uuid.v4().toShort(); + var uniqueVarSymbol = Symbol(uniqueVarName).withPos(args[0].pos); + + var condCases = [ + for (arg in args) { + CallExp(CallExp(Symbol("not").withPos(args[0].pos), + [ + CallExp(Symbol("set").withPos(args[0].pos), [uniqueVarSymbol, arg]).withPos(args[0].pos) + ]).withPos(args[0].pos), [Symbol("null").withPos(args[0].pos)]).withPos(args[0].pos); + } + ]; + condCases.push(CallExp(Symbol("true").withPos(args[0].pos), [uniqueVarSymbol]).withPos(args[0].pos)); + + CallExp(Symbol("begin").withPos(args[0].pos), [ + CallExp(Symbol("deflocal").withPos(args[0].pos), [ + TypedExp("Any", uniqueVarSymbol).withPos(args[0].pos), + MetaExp("mut").withPos(args[0].pos), + Symbol("null").withPos(args[0].pos) + ]).withPos(args[0].pos), + CallExp(Symbol("cond").withPos(args[0].pos), condCases).withPos(args[0].pos) + ]).withPos(args[0].pos); + }; + // Under the hood, (defmacrofun ...) defines a runtime function that accepts Quote arguments and a special form that quotes the arguments to macrofun calls macros["defmacrofun"] = (exps:Array, k:KissState) -> { if (exps.length < 3) diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index b8b7d1fc..2d260ed1 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -174,6 +174,12 @@ class BasicTestCase extends Test { Assert.equals(5, BasicTestCase.myOr1); } + function testAnd() { + Assert.equals(6, BasicTestCase.myAnd1); + Assert.equals(null, BasicTestCase.myAnd2); + Assert.equals(null, BasicTestCase.myAnd3); + } + function testNot() { Assert.equals(false, BasicTestCase.myNot1); Assert.equals(false, BasicTestCase.myNot2); diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index f0220b7b..4794c3f1 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -130,6 +130,10 @@ (defvar myOr1 (or null 5)) +(defvar myAnd1 (and 5 6)) +(defvar myAnd2 (and false 5 6)) +(defvar myAnd3 (and 5 false 6)) + (defun mySetLocal [] (deflocal loc &mut "one thing") (set loc "another thing") diff --git a/src/test/cases/CommentAtEndOfListTestCase.kiss b/src/test/cases/CommentAtEndOfListTestCase.kiss new file mode 100644 index 00000000..b1549d52 --- /dev/null +++ b/src/test/cases/CommentAtEndOfListTestCase.kiss @@ -0,0 +1,4 @@ +(defun myFun [] + (deflocal something 5) + // TODO This comment causes a hard-to-track-down error! + ) \ No newline at end of file