diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index a13ff9bd..973a1d52 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -22,6 +22,8 @@ using tink.MacroApi; typedef MacroFunction = (wholeExp:ReaderExp, args:Array, k:KissState) -> Null; class Macros { + static var MACRO_RECURSION_LIMIT = 10; + public static function builtins(k:KissState) { var macros:Map = []; @@ -977,10 +979,10 @@ class Macros { var name = exps[0].symbolNameValue(); var lambdaExp = b.callSymbol("lambda", [exps[1]].concat(exps.slice(2))); - k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k); - // Run the definition AGAIN so it can capture itself recursively: - k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k); - + // It's absurd, but each time hscript evaluates the lambda expression it captures another layer of recursion: + for (_ in 0...MACRO_RECURSION_LIMIT) { + k.macroVars[name] = Helpers.runAtCompileTimeDynamic(lambdaExp, k); + } return null; };