precedence: newline separator block statements/expressions if ... then ... (else ...)? while ... then ... for ... in ... then ... switch ... (case ... then ...)* (else ...)? do ... comma open call prefix-expr expr-list or and not == != <= < > >= * / div mod + - prefixes: &expr +expr -expr *expr #expr suffixes: expr(...) expr[...] expr^ literals, (...), [...], (...) -> ... indentation introduces a block after a block statement (in lieu of "then ..."), else block, or lambda arrow: if foo; bar then a; b else x; y if foo; bar a b else x y (a, b) -> x y indentation after a ( or [ allows newlines as implicit commas within the brackets. tail commas are still allowed, though: foo(a, b, c, d) foo(a, b, c, d,) foo( a, b c, d ) foo( a, b, c, d, ) newlines at block level, separates statements (like ; with precedence below block statements) if a then b else x; y // one statement if a then b; c else x // two statements y within indented brackets, separates expressions (like ,) foo(a, b) foo( a b )