diff --git a/src/emitter.nim b/src/emitter.nim index 93b557b..a7a4a56 100644 --- a/src/emitter.nim +++ b/src/emitter.nim @@ -621,7 +621,7 @@ proc emitSpecialForm(items: seq[CljVal], indent: int): string = if bname.kind != ckSymbol: raise newException(EmitterError, "let binding name must be a symbol") addToScope(bname.symName) - lines.add(indentStr(indent + 1) & "let " & mangleName(bname.symName) & " = " & emitExpr(bval, 0)) + lines.add(indentStr(indent + 1) & "let " & mangleName(bname.symName) & " = " & emitExpr(bval, indent + 1)) bi += 2 let body = items[2..^1] for j, b in body: @@ -1557,7 +1557,8 @@ proc emitBlock(items: seq[CljVal], indent: int, useResult: bool = false): string let lastLine = if lastNl == -1: trimmed else: trimmed[lastNl+1..^1].strip() # Prepend discard before the first non-empty line if firstNl == -1: - if stripped.startsWith("let ") or stripped.startsWith("proc ") or stripped.startsWith("var "): + if stripped.startsWith("let ") or stripped.startsWith("proc ") or stripped.startsWith("var ") or + stripped.startsWith("discard "): code = indentStr(indent) & stripped else: code = indentStr(indent) & "discard " & stripped diff --git a/src/macros.nim b/src/macros.nim index 983998a..7832073 100644 --- a/src/macros.nim +++ b/src/macros.nim @@ -395,10 +395,17 @@ proc initMacros*() = let coll = bindings.items[1] let gs = cljSymbol(gensymName("ds_")) if name.kind == ckVector: - let destructured = cljList(@[cljSymbol("let"), name, cljList(@[cljSymbol("first"), gs])]) - let loopBody = cljList(@[cljSymbol("when"), gs] & @[destructured] & body) - let recurBody = cljList(@[cljSymbol("recur"), cljList(@[cljSymbol("rest"), gs])]) - let loopForm = cljList(@[cljSymbol("loop"), cljVector(@[gs, cljList(@[cljSymbol("seq"), gs])]), loopBody, recurBody]) + let seqGs = cljSymbol(gensymName("sq_")) + let tmpGs = cljSymbol(gensymName("tmp_")) + var innerBindings: seq[CljVal] = @[] + for j in 0..