(setMacroVar) instead of (defMacroVar)
This commit is contained in:
@@ -406,6 +406,10 @@ class Helpers {
|
|||||||
for (name => value in k.macroVars) {
|
for (name => value in k.macroVars) {
|
||||||
interp.variables.set(name, value);
|
interp.variables.set(name, value);
|
||||||
}
|
}
|
||||||
|
interp.variables.set("_setMacroVar", (name, value) -> {
|
||||||
|
k.macroVars[name] = value;
|
||||||
|
interp.variables.set(name, value);
|
||||||
|
});
|
||||||
|
|
||||||
function innerRunAtCompileTimeDynamic(innerExp:ReaderExp) {
|
function innerRunAtCompileTimeDynamic(innerExp:ReaderExp) {
|
||||||
// in case macroVars have changed
|
// in case macroVars have changed
|
||||||
|
@@ -407,7 +407,7 @@ class Kiss {
|
|||||||
case Symbol(varName) if (k.macroVars.exists(varName)):
|
case Symbol(varName) if (k.macroVars.exists(varName)):
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
// have this throw during macroEXPANSION, not before (so assertThrows will catch it)
|
// 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:
|
default:
|
||||||
setLocal(wholeExp, exps, copy);
|
setLocal(wholeExp, exps, copy);
|
||||||
};
|
};
|
||||||
|
@@ -798,6 +798,15 @@ class Macros {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macros["setMacroVar"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
|
wholeExp.checkNumArgs(2, 2, "(setMacroVar <name> <value>)");
|
||||||
|
|
||||||
|
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<ReaderExp>, k:KissState) -> {
|
macros["defMacroFunction"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
wholeExp.checkNumArgs(3, null, "(defMacroFunction <name> [<args>] <body...>)");
|
wholeExp.checkNumArgs(3, null, "(defMacroFunction <name> [<args>] <body...>)");
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
|
@@ -60,7 +60,7 @@
|
|||||||
(_testPrintAtMacroTimeMacro)
|
(_testPrintAtMacroTimeMacro)
|
||||||
(Assert.pass))
|
(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)
|
(defMacroVar count 0)
|
||||||
(defMacro _testSetMacroVarMacro []
|
(defMacro _testSetMacroVarMacro []
|
||||||
(assertThrows (set count (+ count 1)))
|
(assertThrows (set count (+ count 1)))
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
(Assert.pass))
|
(Assert.pass))
|
||||||
|
|
||||||
(defMacro _testRedefineMacroVarMacro []
|
(defMacro _testRedefineMacroVarMacro []
|
||||||
(defMacroVar count (+ count 1))
|
(setMacroVar count (+ count 1))
|
||||||
(symbol (Std.string count)))
|
(symbol (Std.string count)))
|
||||||
|
|
||||||
(function _testRedefineMacroVar []
|
(function _testRedefineMacroVar []
|
||||||
|
Reference in New Issue
Block a user