jolt/docs
Yogthos 21cd88deee letfn is a macro over a letfn* special form (Clojure semantics)
jolt modelled letfn as a special form directly, so (macroexpand-1 '(letfn …))
returned the form unchanged. Clojure's letfn is a macro that expands to letfn*,
and macroexpansion tooling (tools.macro, tools.analyzer) depends on that — its
special-form handlers key on letfn*, not letfn.

Split it the Clojure way:
- letfn* is now the special form (analyzer), taking flat name/fn-form pairs
  [name1 fn1 name2 fn2 …] — the letrec :let lowering is unchanged.
- letfn is a macro (00-syntax) turning each (name [params] body*) spec into a
  name + (fn name [params] body*) binding, so it expands to letfn*.

So (macroexpand-1 '(letfn [(f [x] x)] (f 1))) now yields
(letfn* [f (fn f [x] x)] (f 1)), and clojure.tools.macro passes its whole suite
(macrolet / symbol-macrolet / mexpand-all). Listed in docs + site.

make test green (+1 corpus row, 0 new divergences), shakesmoke byte-identical.
One re-mint (analyzer + the letfn macro); selfhost holds.
2026-06-27 17:26:18 -04:00
..
rfc Run core.memoize's test suite on jolt 2026-06-25 13:23:05 -04:00
spec Honor *print-length* / *print-level* / *default-data-reader-fn* 2026-06-26 19:04:42 -04:00
building-and-deps.md REPL fixes + an nREPL server for editor-connected dev 2026-06-22 15:18:52 -04:00
grammar.ebnf Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
host-interop.md Regex: accept Java-compatible char-class dash and (X+)* quantifier 2026-06-26 17:35:08 -04:00
libraries.md letfn is a macro over a letfn* special form (Clojure semantics) 2026-06-27 17:26:18 -04:00
MODULES.md AOT build: set per-ns ns context and register aliases 2026-06-24 01:27:49 -04:00
seed-overlay-registry.md Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
tools-deps.md docs: document tree-shaking + the runtime-resolution limitation 2026-06-23 21:30:28 -04:00