From 45b485b390ff46da8a6bfcad6e31ee031e66f6b8 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 19 Feb 2023 08:09:57 -0700 Subject: [PATCH] for and doFor replace localVar with let --- kiss/src/kiss/SpecialForms.hx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index b0e19373..06ddb53c 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -264,16 +264,21 @@ class SpecialForms { var b = wholeExp.expBuilder(); var m = macro $i{uniqueVarName}; + var innerLet = false; var loopVarExpr:Expr = switch (namesExp.def) { - case KeyValueExp(_, _): k.convert(namesExp); - default: { - bodyExps.insert(0, - CallExp(Symbol("localVar").withPosOf(args[2]), [namesExp, Symbol(uniqueVarName).withPosOf(args[2])]).withPosOf(args[2])); - b.haxeExpr(m); - } + case KeyValueExp(_, _) | Symbol(_): k.convert(namesExp); + case ListExp(_) | TypedExp(_, {pos:_, def:Symbol(_)}): + innerLet = true; + b.haxeExpr(m); + default: + throw KissError.fromExp(namesExp, 'invalid pattern in `$formName`'); }; - var body = CallExp(Symbol("begin").withPosOf(args[2]), bodyExps).withPosOf(args[2]); + var body = if (innerLet) { + b.let([namesExp, b.symbol(uniqueVarName)], bodyExps); + } else { + b.begin(bodyExps); + }; return EFor(EBinop(OpIn, loopVarExpr, k.convert(listExp)).withMacroPosOf(wholeExp), k.convert(body)).withMacroPosOf(wholeExp); }