Reader: #() params survive syntax-quote (auto-gensym names)

#(...) named its synthesized params with bare gensyms, so a #() written inside a
syntax-quote had its params qualified to the current ns by sq-symbol — and a
qualified symbol isn't a valid fn param. hiccup's compiler emits
`(let [sb# ..] (iterate! #(.append sb# %) ..)), which broke with "Unable to
resolve symbol: ns/_NNNN".

Name the params with a trailing # (auto-gensym suffix, like Clojure's p1__N#) so
syntax-quote maps them consistently and leaves them unqualified. Harmless outside
a backtick (just a regular symbol name).
This commit is contained in:
Yogthos 2026-06-15 15:15:32 -04:00
parent d223f40c91
commit c22b23fb51
3 changed files with 20 additions and 3 deletions

View file

@ -125,6 +125,11 @@ checks → UNVERIFIED (rows to add).
nested form including vector, map and set literals — `#(assoc {} :k %)`,
`#(hash-set % %2)` and `#(get {:t %} :t)` all see their `%`s. (A reader that
scanned only call forms would miscompile `#(identity {:text %})` as a 0-arg fn.)
- The synthesized parameters are auto-gensyms (their names carry the `#` suffix,
like Clojure's `p1__N#`), so an `#()` written inside a syntax-quote survives:
the params are mapped consistently and left unqualified rather than being
qualified to the current namespace (a qualified symbol is not a valid
parameter). E.g. `` `(map #(inc %) xs) `` expands correctly inside a macro.
- `#()` literals MUST NOT nest.
```clojure