diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 94bbeb3f..dcc81c74 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -1412,6 +1412,31 @@ class Macros { ].concat([for (savedVar in savedVarList) b.set(savedVar, uuids.shift())])); }; + k.doc("withFunctions", 2, null, "(withFunctions [( [] ) ] )"); + macros["withFunctions"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { + var b = wholeExp.expBuilder(); + + var funcList = Helpers.argList(args[0], "withFunctions"); + if (funcList.length == 0) throw KissError.fromExp(args[0], "withFunctions requires at least one function definition"); + var localFunctions = []; + do { + var funcExp = funcList.shift(); + switch (funcExp.def) { + case CallExp(nameExp, argsAndBody) if (argsAndBody.length >= 2): + localFunctions.push(b.callSymbol("localFunction", [ + nameExp, argsAndBody.shift() + ].concat(argsAndBody))); + default: + throw KissError.fromExp(funcExp, "withFunctions function definition should follow this form: ( [] )"); + } + + } while (funcList.length > 0); + + var exp = b.begin(localFunctions.concat(args.slice(1))); + Prelude.print(Reader.toString(exp.def)); + exp; + }; + return macros; } diff --git a/kiss/src/test/cases/BasicTestCase.hx b/kiss/src/test/cases/BasicTestCase.hx index 86fa3873..b176e5d6 100644 --- a/kiss/src/test/cases/BasicTestCase.hx +++ b/kiss/src/test/cases/BasicTestCase.hx @@ -391,6 +391,10 @@ class BasicTestCase extends Test { function testHaxeProperties() { _testHaxeProperties(); } + + function testWithFunctions() { + _testWithFunctions(); + } } class BasicObject { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 557bee35..5ccc2f56 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -737,4 +737,13 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m (Assert.equals 5 staticProp) (Assert.equals 9 (set staticProp 9)) (Assert.equals 9 staticProp) - (Assert.equals 9 _staticProp)) \ No newline at end of file + (Assert.equals 9 _staticProp)) + +(function _testWithFunctions [] + (withFunctions + [ + (a [val] (+ val 1)) + (b [val] (+ val 2)) + ] + (localFunction c [val] (+ (a val) (b val))) + (Assert.equals 5 (c 1)))) \ No newline at end of file