defMacroVar, defMacroFunction

This commit is contained in:
2021-08-04 15:08:58 -06:00
parent f6894148a0
commit 2359ef21ac
3 changed files with 28 additions and 2 deletions

View File

@@ -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]));

View File

@@ -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

View File

@@ -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