diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index 4333b58a..adec5ad5 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -39,7 +39,8 @@ typedef KissState = { fieldDict:Map, loadingDirectory:String, hscript:Bool, - macroVars:Map + macroVars:Map, + collectedBlocks:Map> }; class Kiss { @@ -111,7 +112,8 @@ class Kiss { fieldDict: new Map(), loadingDirectory: "", hscript: false, - macroVars: new Map() + macroVars: new Map(), + collectedBlocks: new Map() }; return k; @@ -154,6 +156,7 @@ class Kiss { if (kissFile == null) { kissFile = classPath.withoutDirectory().withoutExtension().withExtension("kiss"); } + //trace('kiss build $kissFile'); return _try(() -> { if (k == null) diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 21955cfe..be6c0974 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -839,6 +839,37 @@ class Macros { b.callSymbol("object", objectExps); } + // Macro for triggering collection of expressions throughout a Kiss file, to inject them later with collectedBlocks + macros["collectBlocks"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(1, 2, "(collectBlocks )"); + var blockName = try { + exps[0].symbolNameValue(); + } catch (notSymbolError:String) { + throw CompileError.fromExp(wholeExp, notSymbolError); + } + k.collectedBlocks[blockName] = []; + // TODO some assertion that the coder hasn't defined over another macro (also should apply to defMacro) + macros[blockName] = (wholeExp:ReaderExp, innerExps:Array, k:KissState) -> { + k.collectedBlocks[blockName] = k.collectedBlocks[blockName].concat(innerExps); + if (exps.length > 1) exps[1] else null; + }; + null; + }; + + macros["collectedBlocks"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(1, 1, "(collectedBlocks )"); + var blockName = try { + exps[0].symbolNameValue(); + } catch (notSymbolError:String) { + throw CompileError.fromExp(wholeExp, notSymbolError); + } + var b = wholeExp.expBuilder(); + if (!k.collectedBlocks.exists(blockName)) { + throw CompileError.fromExp(wholeExp, 'no blocks for $blockName were collected. Try adding (collectBlocks ${blockName}) at the start of the file.'); + } + b.begin(k.collectedBlocks[blockName]); + }; + macros["clamp"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { wholeExp.checkNumArgs(2, 3, "(clamp )"); var b = wholeExp.expBuilder();