diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index 9e00e069..b1dca406 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -232,6 +232,22 @@ class SpecialForms { } EFunction(FAnonymous, Helpers.makeFunction(null, returnsValue, args[0], args.slice(1), k, "lambda", [])).withMacroPosOf(wholeExp); }; + + k.doc("localFunction", 3, null, "(localFunction [] )"); + map["localFunction"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { + var name = ""; + var returnsValue = switch (args[0].def) { + case TypedExp("Void", {pos:_, def: Symbol(fname)}): + name = fname; + false; + case Symbol(fname): + name = fname; + true; + default: + throw KissError.fromExp(wholeExp, "First argument to localFunction must be a function name with an optional return type. To make an anonymous function, use lambda instead."); + } + EFunction(FNamed(name, false), Helpers.makeFunction(null, returnsValue, args[1], args.slice(2), k, "localFunction", [])).withMacroPosOf(wholeExp); + }; function forExpr(formName:String, wholeExp:ReaderExp, args:Array, k:KissState) { var uniqueVarName = "_" + Uuid.v4().toShort();