Warts

<!-- audited: 2026-09-22 -->

Where Elle surprises a programmer from another Lisp: the intentional differences, then the known limitations.

Intentional differences

The three that shape whole programs are in AGENTS.md and QUICKSTART.md; this is the full list.

truthy. Use empty? for end-of-list. empty-list.md gives the rationale.

surrounding form.

before it.

@[1 2] an @array.

grapheme clusters, not bytes or code points.

two integers truncates.

prints without quotes and a keyword without its colon.

(assert (if () true false))
(assert (= (length "café") 4))
(assert (= (+ 9223372036854775807 1) -9223372036854775808))
(assert (= (/ 7 2) 3))
(assert (= (set 1 2) |1 2|))
(let [a 1 b (+ a 1)] (assert (= b 2)))

Known limitations

included, run in constant stack.

value its export struct can name (macros.md).

result to syntax, and syntax has no improper-list form.

mutable cycles free with their owner where the ownership forest can own them (regions/semantics.md).