From 70ff9b7e1b9e7a666eee7f509ecff846144eeeea Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 25 Nov 2020 11:43:04 -0700 Subject: [PATCH] add not, with a reader macro --- src/kiss/Reader.hx | 2 ++ src/kiss/SpecialForms.hx | 8 ++++++++ src/test/cases/BasicTestCase.hx | 5 +++++ src/test/cases/BasicTestCase.kiss | 5 ++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index fc5a6bd2..1e6cfd8e 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -48,6 +48,8 @@ class Reader { readTable["&"] = (stream) -> MetaExp(nextToken(stream, "a meta symbol like mut, optional, rest")); + readTable["!"] = (stream:Stream) -> CallExp(Symbol("not").withPos(stream.position()), [assertRead(stream, readTable)]); + // Because macro keys are sorted by length and peekChars(0) returns "", this will be used as the default reader macro: readTable[""] = (stream) -> Symbol(nextToken(stream, "a symbol name")); diff --git a/src/kiss/SpecialForms.hx b/src/kiss/SpecialForms.hx index 60722c9b..bc97ce9d 100644 --- a/src/kiss/SpecialForms.hx +++ b/src/kiss/SpecialForms.hx @@ -195,6 +195,14 @@ class SpecialForms { $elseExp; }; + map["not"] = (args:Array, convert:ExprConversion) -> { + if (args.length != 1) + throw '(not... ) only takes one argument, not $args'; + var condition = convert(args[0]); + var truthyExp = macro Prelude.truthy($condition); + macro !$truthyExp; + }; + return map; } diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index 725886e3..b8b7d1fc 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -173,4 +173,9 @@ class BasicTestCase extends Test { function testOr() { Assert.equals(5, BasicTestCase.myOr1); } + + 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 d3a870b2..f0220b7b 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -133,4 +133,7 @@ (defun mySetLocal [] (deflocal loc &mut "one thing") (set loc "another thing") - loc) \ No newline at end of file + loc) + +(defvar myNot1 (not 5)) +(defvar myNot2 !5) \ No newline at end of file