From 35848dd1301dc32b106beb7100290626bf693bb5 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 2 Apr 2021 12:51:15 -0600 Subject: [PATCH] Test macro list expansion --- kiss/src/kiss/Helpers.hx | 13 ++++++++++++- kiss/src/test/cases/MacroTestCase.hx | 5 +++++ kiss/src/test/cases/MacroTestCase.kiss | 11 ++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/kiss/src/kiss/Helpers.hx b/kiss/src/kiss/Helpers.hx index f4df8c99..1894cf31 100644 --- a/kiss/src/kiss/Helpers.hx +++ b/kiss/src/kiss/Helpers.hx @@ -292,7 +292,18 @@ class Helpers { switch (l[idx].def) { case UnquoteList(exp): l.splice(idx, 1); - var newElements:Array = runAtCompileTime(exp, k, args); + var listToInsert:Dynamic = runAtCompileTime(exp, k, args); + // listToInsert could be either an array (from &rest) or a ListExp (from [list syntax]) + var newElements:Array = if (Std.isOfType(listToInsert, Array)) { + listToInsert; + } else { + switch (listToInsert.def) { + case ListExp(elements): + elements; + default: + throw CompileError.fromExp(l[idx], ",@ can only be used with lists"); + }; + }; for (el in newElements) { l.insert(idx++, el); } diff --git a/kiss/src/test/cases/MacroTestCase.hx b/kiss/src/test/cases/MacroTestCase.hx index ac51632e..0b10ea1a 100644 --- a/kiss/src/test/cases/MacroTestCase.hx +++ b/kiss/src/test/cases/MacroTestCase.hx @@ -14,4 +14,9 @@ class MacroTestCase extends Test { Assert.equals(5, myVar); Assert.equals(6, myFunc()); } + + function testExpandList() { + Assert.equals(6, sum1()); + Assert.equals(6, sum2()); + } } diff --git a/kiss/src/test/cases/MacroTestCase.kiss b/kiss/src/test/cases/MacroTestCase.kiss index 7d0dcf73..30436044 100644 --- a/kiss/src/test/cases/MacroTestCase.kiss +++ b/kiss/src/test/cases/MacroTestCase.kiss @@ -3,4 +3,13 @@ (defvar ,varName 5) (defun ,funcName [] 6)}) -(defMultiple myVar myFunc) \ No newline at end of file +(defMultiple myVar myFunc) + +(defmacro variadicPlus [&rest l] + `(+ ,@l)) +(defmacro listPlus [l] + `(+ ,@l)) + +// Both forms of passing expression lists to macros should work: +(defun sum1 [] (variadicPlus 1 2 3)) +(defun sum2 [] (listPlus [1 2 3])) \ No newline at end of file