add more levels of macro function recursion
This commit is contained in:
@@ -22,6 +22,8 @@ using tink.MacroApi;
|
|||||||
typedef MacroFunction = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> Null<ReaderExp>;
|
typedef MacroFunction = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> Null<ReaderExp>;
|
||||||
|
|
||||||
class Macros {
|
class Macros {
|
||||||
|
static var MACRO_RECURSION_LIMIT = 10;
|
||||||
|
|
||||||
public static function builtins(k:KissState) {
|
public static function builtins(k:KissState) {
|
||||||
var macros:Map<String, MacroFunction> = [];
|
var macros:Map<String, MacroFunction> = [];
|
||||||
|
|
||||||
@@ -977,10 +979,10 @@ class Macros {
|
|||||||
var name = exps[0].symbolNameValue();
|
var name = exps[0].symbolNameValue();
|
||||||
var lambdaExp = b.callSymbol("lambda", [exps[1]].concat(exps.slice(2)));
|
var lambdaExp = b.callSymbol("lambda", [exps[1]].concat(exps.slice(2)));
|
||||||
|
|
||||||
k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k);
|
// It's absurd, but each time hscript evaluates the lambda expression it captures another layer of recursion:
|
||||||
// Run the definition AGAIN so it can capture itself recursively:
|
for (_ in 0...MACRO_RECURSION_LIMIT) {
|
||||||
k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k);
|
k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user