Read an unknown #tag as a tagged-literal value

An unknown reader tag produced the reader's internal form
{:jolt/type :jolt/tagged :tag :#foo :form bar}, which tagged-literal? didn't
recognize and which leaked as a raw map when printed:

  (tagged-literal? (read-string "#foo bar"))  => false   ; want true
  (pr-str (quote [#foo bar]))                 => "[{:jolt/type :jolt/tagged ...}]"

Both the data path (rdr-construct-tag) and the compile path (emit-quoted) now
build a real tagged-literal for a tag with no registered reader, like Clojure's
*default-data-reader-fn*, so tagged-literal? / :tag / :form / printing all work.
clojure.edn reads raw forms through a separate __read-form-raw path and applies
:readers/:default itself, so it is unaffected.

Re-mint (backend + reader are seed sources); prelude byte-identical, image only.
make test green (selfhost holds, 0 new/stale), +2 unit rows.
This commit is contained in:
Yogthos 2026-07-01 16:17:52 -04:00
parent f856c16f06
commit b4d9eaa527
4 changed files with 114 additions and 99 deletions

View file

@ -312,6 +312,8 @@
{:suite "reader" :expr "(nil? (read-string \"nil\"))" :expected "true"}
{:suite "reader" :expr "(true? (read-string \"true\"))" :expected "true"}
{:suite "reader" :expr "(false? (read-string \"false\"))" :expected "true"}
{:suite "reader" :expr "(let [r (read-string \"#foo bar\")] (and (tagged-literal? r) (= (quote foo) (:tag r)) (= (quote bar) (:form r)) (= \"#foo bar\" (pr-str r))))" :expected "true"}
{:suite "reader" :expr "(let [t (first (quote [#foo bar]))] (and (tagged-literal? t) (= (quote foo) (:tag t)) (= \"#foo bar\" (pr-str t))))" :expected "true"}
{:suite "reader" :expr "(= \\a (read-string \"\\\\a\"))" :expected "true"}
{:suite "reader" :expr "(= \\newline (read-string \"\\\\newline\"))" :expected "true"}
{:suite "reader" :expr "(= \\space (read-string \"\\\\space\"))" :expected "true"}