Open thisbefruit opened 2 years ago
set!
expressions in the loop body also breaks:
melorun> let x = 0 :: Nat in (loop 1 do return x)
Internal error, failed to parse mil output
Syntax(Failure(VerboseError { errors: [("set-let ())) x)))\n", Nom(Tag)), ("(set-let ())) x)))\n", Context("S expression")), ("(set-let ())) x)))\n", Context("if expression")), ("(set-let ())) x)))\n", Nom(Alt)), ("(loop 1 (set-let ())) x)))\n", Context("S expression")), ("(loop 1 (set-let ())) x)))\n", Context("loop expression")), ("(let () (loop 1 (set-let ())) x)))\n", Context("S expression")), ("(let () (loop 1 (set-let ())) x)))\n", Context("let binding")), ("(let () (let () (loop 1 (set-let ())) x)))\n", Context("S expression")), ("(let () (let () (loop 1 (set-let ())) x)))\n", Context("let binding")), ("(let (x 0) (let () (let () (loop 1 (set-let ())) x)))\n", Context("S expression")), ("(let (x 0) (let () (let () (loop 1 (set-let ())) x)))\n", Context("let binding"))] }))
The zero-length loop problem turned out to be a VM bug, fixed here: https://github.com/themeliolabs/themelio-stf/commit/c8e064ddbf84f21fa9134739e77518981b891f51
As for parentheses in the loop body, loop 0 do (set! x = x+1 return x)
is intended to be incorrect. This is because set! x = x + 1 return x
is not a syntactically valid expression, and thus, it cannot be grouped with parentheses.
Parentheses parsing seems problematic in loop:
Loop appears to fail when "loop guard" is 0: In
demo.melo
:let x = 0 :: Nat in (loop 0 do (set! x = x+1 return x))
REPL: