Derived Forms

Derived forms are built into the normalizer, not user macros: `cond`, `case`, `and`, `or`, `when`, `unless`, `let*`, named `let`, `do`, quasiquote, and `guard`.

See it run

LISPEX
(let* ((x 6) (y (+ x 1))) (* x y))

Observed result

OUTPUT
42

How to reason about it

  • Expansion uses fresh identities and hidden intrinsics, preserving hygiene under user shadowing.
  • Normalization preserves defined tail positions and source diagnostics.
  • guard is a fixed core-facing construct for catchable faults, not a general macro facility.

Normalization surface

Surface formCore strategyPinned boundary
cond / casenested if with fresh temporaries; case uses hidden eqv?tail clause preserved; no cond =>
and / orshort-circuit nested ifsingle final operand remains tail
when / unlessif plus begin or zero-value valuesfalse path returns zero values
named let / dohygienic letrec looprecursive application is tail
quasiquotequote plus hidden constructorsbare unquote outside quasiquote is static E1xx

A common mistake

define-syntax, syntax objects, and arbitrary expansion are rejected.

Keep going

Use this page while writing code. For a guided explanation, return to the syntax map or the corresponding manual.

Syntax at a Glance · Learning Path