Skip to main content

Indentation, not braces

A block is : followed by either an indented group of statements, or (for short bodies) a single statement on the same line. The lexer tracks indentation itself and hands the parser clean INDENT/DEDENT tokens — see Indentation-Sensitive Lexing for exactly how, if you’re curious about the mechanism.
Typing {, }, or ; doesn’t just fail silently or fall through to a generic parse error — the lexer recognizes them and raises a specific message pointing at the replacement (“Sense uses indentation for blocks, not { }…”). This matters more than it sounds: it’s aimed squarely at people (and LLMs) whose muscle memory defaults to C-family syntax.

if / else

else if chains parse as nested if statements in the AST (the same representation you’d get writing it as nested if/else blocks by hand) — there’s no special “elif” token.

while

for — over arrays and strings

range(a), range(a, b), and range(a, b, step) build an Array<Int> you can iterate the same way:

break / continue

Multi-line expressions

Newlines and indentation are both suppressed inside ( ) and [ ], so a call or array literal can wrap across lines without any continuation character:

Continue

Arrays

Literals, indexing, mutation, and the built-in helpers.

Modules

Splitting a program across files with import.