diff --git a/kiss/src/kiss/Helpers.hx b/kiss/src/kiss/Helpers.hx index ed640e36..f44a53dc 100644 --- a/kiss/src/kiss/Helpers.hx +++ b/kiss/src/kiss/Helpers.hx @@ -406,6 +406,10 @@ class Helpers { for (name => value in k.macroVars) { interp.variables.set(name, value); } + interp.variables.set("_setMacroVar", (name, value) -> { + k.macroVars[name] = value; + interp.variables.set(name, value); + }); function innerRunAtCompileTimeDynamic(innerExp:ReaderExp) { // in case macroVars have changed diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index b8a3ebcd..0539ea7f 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -407,7 +407,7 @@ class Kiss { case Symbol(varName) if (k.macroVars.exists(varName)): var b = wholeExp.expBuilder(); // have this throw during macroEXPANSION, not before (so assertThrows will catch it) - copy.convert(b.throwCompileError('If you intend to change macroVar $varName, use defMacroVar instead. If not, rename your local variable for clarity.')); + copy.convert(b.throwCompileError('If you intend to change macroVar $varName, use setMacroVar instead. If not, rename your local variable for clarity.')); default: setLocal(wholeExp, exps, copy); }; diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index e9d58664..58c41223 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -798,6 +798,15 @@ class Macros { return null; }; + macros["setMacroVar"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(2, 2, "(setMacroVar )"); + + var name = exps[0].symbolName().withPosOf(exps[0]); + var b = wholeExp.expBuilder(); + + return b.callSymbol("_setMacroVar", [name, exps[1]]); + }; + macros["defMacroFunction"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { wholeExp.checkNumArgs(3, null, "(defMacroFunction [] )"); var b = wholeExp.expBuilder(); diff --git a/kiss/src/test/cases/MacroTestCase.kiss b/kiss/src/test/cases/MacroTestCase.kiss index b30e7aad..7d464cb8 100644 --- a/kiss/src/test/cases/MacroTestCase.kiss +++ b/kiss/src/test/cases/MacroTestCase.kiss @@ -60,7 +60,7 @@ (_testPrintAtMacroTimeMacro) (Assert.pass)) -// Calling (set) on a macroVar is a faux-pas, but calling defMacroVar again is not +// Calling (set) on a macroVar is a faux-pas, because (setMacroVar) is the right way (defMacroVar count 0) (defMacro _testSetMacroVarMacro [] (assertThrows (set count (+ count 1))) @@ -71,7 +71,7 @@ (Assert.pass)) (defMacro _testRedefineMacroVarMacro [] - (defMacroVar count (+ count 1)) + (setMacroVar count (+ count 1)) (symbol (Std.string count))) (function _testRedefineMacroVar []