jolt/host/chez
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
..
java data.priority-map: deftype interop fixes (rseq, arity-overload, empty, Sorted) 2026-06-27 16:48:14 -04:00
seed letfn is a macro over a letfn* special form (Clojure semantics) 2026-06-27 17:26:18 -04:00
atoms.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
bootstrap.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
build-smoke.sh Source locations: reader positions, error locations, native stack traces (#218) 2026-06-26 02:14:34 +00:00
build.ss Whole-program param-type inference (closed world) (#226) 2026-06-26 10:57:45 +00:00
cli.ss Source locations: reader positions, error locations, native stack traces (#218) 2026-06-26 02:14:34 +00:00
collections.ss Small maps preserve insertion order 2026-06-27 05:48:17 -04:00
compile-eval.ss ns: accept vector reference clauses; add Compiler/specials 2026-06-27 17:08:50 -04:00
converters.ss General fixes shaken out by clojure/tools.reader 2026-06-27 14:11:02 -04:00
dce.ss refactor: extract host/chez/dce.ss; tag the runtime manifest (tier 1) 2026-06-23 22:20:48 -04:00
dyn-binding.ss refactor: registry pattern for jolt-pr-str/pr-readable + remaining arms (jolt-lmot) 2026-06-23 23:22:25 -04:00
dynamic-var-defaults.ss Honor *print-length* / *print-level* / *default-data-reader-fn* 2026-06-26 19:04:42 -04:00
emit-image.ss Auto-resolve ::keywords; honor clojure.edn reader opts 2026-06-24 09:13:14 -04:00
host-contract.ss Unchecked / *unchecked-math* arithmetic wraps to signed 64-bit 2026-06-27 15:41:35 -04:00
host-table.ss Fix general gaps the hiccup suite shook out 2026-06-26 20:15:39 -04:00
lazy-bridge.ss Fix conj on a lazy-seq, add lazy-seq interop regression rows 2026-06-26 21:25:10 -04:00
loader.ss data.csv: fully passes, three general fixes 2026-06-27 15:02:32 -04:00
multimethods.ss defmethod on a referred multifn resolves to its home ns 2026-06-24 09:13:28 -04:00
natives-coll.ss Small maps preserve insertion order 2026-06-27 05:48:17 -04:00
natives-format.ss read-string constructs sets; format %x lowercase; extend/extends? on nil 2026-06-24 14:03:47 -04:00
natives-meta.ss General fixes shaken out by running core.logic's test suite 2026-06-27 09:20:11 -04:00
natives-misc.ss Tagged literals are value-equal 2026-06-24 11:03:33 -04:00
natives-num.ss ^long is a 64-bit long: fast-path-with-fallback ops + logical unsigned shift 2026-06-27 16:04:19 -04:00
natives-reader.ss Close portable clojure.core gaps: re-groups, letfn, REPL + dynamic vars 2026-06-26 17:48:21 -04:00
natives-seq.ss data.priority-map: deftype interop fixes (rseq, arity-overload, empty, Sorted) 2026-06-27 16:48:14 -04:00
natives-transduce.ss Collection fns: JVM-faithful return types + laziness (#219) 2026-06-26 03:01:36 +00:00
ns.ss core.async: higher-level API over native channels + two general fixes 2026-06-27 13:05:19 -04:00
png.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
post-prelude.ss Fix general gaps the hiccup suite shook out 2026-06-26 20:15:39 -04:00
predicates.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
printing.ss Honor *print-length* / *print-level* / *default-data-reader-fn* 2026-06-26 19:04:42 -04:00
reader.ss General fixes shaken out by clojure/tools.reader 2026-06-27 14:11:02 -04:00
records.ss data.priority-map: deftype interop fixes (rseq, arity-overload, empty, Sorted) 2026-06-27 16:48:14 -04:00
regex.ss General fixes shaken out by clojure/tools.reader 2026-06-27 14:11:02 -04:00
remint.sh Pure-Chez test gates (no Janet) 2026-06-21 11:22:32 -04:00
rt.ss Unchecked / *unchecked-math* arithmetic wraps to signed 64-bit 2026-06-27 15:41:35 -04:00
run-corpus.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
run-devirt.ss Devirt: cache the resolved impl in a per-site cell (inline cache) (#237) 2026-06-26 18:34:13 +00:00
run-fieldnum.ss Make ^Record param hints work (resolve the record tag) (#232) 2026-06-26 16:03:57 +00:00
run-fieldread.ss Bare-index field reads for statically-known records (#228) 2026-06-26 11:29:14 +00:00
run-infer.ss infer gate: cover the run-inference / take-diags! checker path 2026-06-23 09:38:13 -04:00
run-narrow.ss Nilable record types + flow-sensitive nil narrowing (#235) 2026-06-26 17:16:16 +00:00
run-numwp.ss Hintless whole-program double inference (#230) 2026-06-26 14:18:10 +00:00
run-protoret.ss Infer monomorphic protocol-method return types (#234) 2026-06-26 16:59:35 +00:00
run-sci.ss Run core.memoize's test suite on jolt 2026-06-25 13:23:05 -04:00
run-unit.ss Real Thread/yield + Thread/interrupted (jolt-l2gc) 2026-06-23 00:06:04 -04:00
run-wp.ss WP: don't let a recursive pass-through poison a param to :any (#233) 2026-06-26 16:29:46 +00:00
selfcheck.sh Pure-Chez test gates (no Janet) 2026-06-21 11:22:32 -04:00
seq.ss ^long is a 64-bit long: fast-path-with-fallback ops + logical unsigned shift 2026-06-27 16:04:19 -04:00
smoke.sh Source locations: reader positions, error locations, native stack traces (#218) 2026-06-26 02:14:34 +00:00
source-registry.ss Source locations: reader positions, error locations, native stack traces (#218) 2026-06-26 02:14:34 +00:00
syntax-quote.ss Small maps preserve insertion order 2026-06-27 05:48:17 -04:00
transients.ss core.logic constraint layer: fixes for the CLP/unifier failures 2026-06-27 10:37:32 -04:00
tree-shake-smoke.sh Tree-shake: count #'x references; multi-app soundness smoke 2026-06-23 20:27:21 -04:00
values.ss core.logic constraint layer: fixes for the CLP/unifier failures 2026-06-27 10:37:32 -04:00
vars.ss refactor: consolidate transducers, dissolve natives-parity.ss (jolt-jcs7) 2026-06-23 23:50:42 -04:00