diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index ca0c55db..2278c58f 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -243,10 +243,22 @@ class SpecialForms { }; map["loop"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, null, '(loop [body...])'); + wholeExp.checkNumArgs(1, null, '(loop )'); EWhile(macro true, k.convert(wholeExp.expBuilder().begin(args)), true).withMacroPosOf(wholeExp); }; + function whileForm(invert:Bool, wholeExp:ReaderExp, args:Array, k:KissState) { + var funcName = if (invert) "until" else "while"; + wholeExp.checkNumArgs(2, null, '($funcName )'); + var b = wholeExp.expBuilder(); + var cond = k.convert(b.callSymbol("Prelude.truthy", [args[0]])); + if (invert) cond = macro !$cond; + return EWhile(cond, k.convert(b.begin(args)), true).withMacroPosOf(wholeExp); + } + + map["while"] = whileForm.bind(false); + map["until"] = whileForm.bind(true); + map["return"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { wholeExp.checkNumArgs(0, 1, '(return [?value])'); var returnExpr = if (args.length == 1) k.convert(args[0]) else null;