defMacroVar, defMacroFunction
This commit is contained in:
@@ -331,6 +331,9 @@ class Helpers {
|
||||
interp.variables.set("k", k.forHScript());
|
||||
interp.variables.set("Helpers", Helpers);
|
||||
interp.variables.set("Macros", Macros);
|
||||
for (name => value in k.macroVars) {
|
||||
interp.variables.set(name, value);
|
||||
}
|
||||
interps.push(interp);
|
||||
} else {
|
||||
interps.push(new Cloner().clone(interps[-1]));
|
||||
|
@@ -38,7 +38,8 @@ typedef KissState = {
|
||||
// to the constructor body)
|
||||
fieldDict:Map<String, Field>,
|
||||
loadingDirectory:String,
|
||||
hscript:Bool
|
||||
hscript:Bool,
|
||||
macroVars:Map<String, Dynamic>
|
||||
};
|
||||
|
||||
class Kiss {
|
||||
@@ -101,7 +102,8 @@ class Kiss {
|
||||
fieldList: [],
|
||||
fieldDict: new Map(),
|
||||
loadingDirectory: "",
|
||||
hscript: false
|
||||
hscript: false,
|
||||
macroVars: new Map()
|
||||
};
|
||||
|
||||
// Helpful aliases
|
||||
|
@@ -733,6 +733,27 @@ class Macros {
|
||||
macros["once"] = once.bind("var");
|
||||
macros["oncePerInstance"] = once.bind("prop");
|
||||
|
||||
macros["defMacroVar"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||
wholeExp.checkNumArgs(2, 2, "(defMacroVar <name> <value>)");
|
||||
|
||||
var name = exps[0].symbolNameValue();
|
||||
|
||||
k.macroVars[name] = Helpers.runAtCompileTimeDynamic(exps[1], k);
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
macros["defMacroFunction"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||
wholeExp.checkNumArgs(3, null, "(defMacroFunction <name> [<args>] <body...>)");
|
||||
var b = wholeExp.expBuilder();
|
||||
var name = exps[0].symbolNameValue();
|
||||
var lambdaExp = b.callSymbol("lambda", [exps[1]].concat(exps.slice(2)));
|
||||
|
||||
k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k);
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
// Replace "try" with this in a try-catch statement to let all exceptions throw
|
||||
// their original call stacks. This is more convenient for debugging than trying to
|
||||
// comment out the "try" and its catches, and re-balance parens
|
||||
|
Reference in New Issue
Block a user