diff --git a/src/emitter.nim b/src/emitter.nim index 2789302..5db7c56 100644 --- a/src/emitter.nim +++ b/src/emitter.nim @@ -1923,8 +1923,26 @@ proc emitBlock(items: seq[CljVal], indent: int, useResult: bool = false): string else: code = indentStr(indent) & "discard " & stripped else: - let indentedCode = indentCode(code, 1) - code = indentStr(indent) & "discard ((proc (): CljVal =\n" & indentedCode & "\n" & indentStr(indent) & ")())" + # Multi-line code — check if it starts with a var declaration that should be hoisted + let codeLines = code.split("\n") + let firstLine = codeLines[0].strip() + if firstLine.startsWith("var ") and firstLine.contains(" = "): + # Split: emit var decl directly at current indent, wrap remaining in IIFE + if codeLines.len > 1: + var restLines: seq[string] = @[] + for li in 1.. 0: + let indentedRest = indentCode(restLines.join("\n"), 1) + code = indentStr(indent) & firstLine & "\n" & indentStr(indent) & "discard ((proc (): CljVal =\n" & indentedRest & "\n" & indentStr(indent) & ")())" + else: + code = indentStr(indent) & firstLine + else: + code = indentStr(indent) & firstLine + else: + let indentedCode = indentCode(code, 1) + code = indentStr(indent) & "discard ((proc (): CljVal =\n" & indentedCode & "\n" & indentStr(indent) & ")())" elif useResult: if stripped.startsWith("discard "): code = indentStr(indent) & "result = " & stripped[8..^1]