Reader 的参考文档中提到“标记文字 Literals 是 Clojure 的 edn 标记化元素的实现。”
但至少在一点上两者是不同的:由标记文字 Literals 产生的符号将会被解析,而由标记元素产生的符号以及通过 clojure.edn/read-string
读取的符号则不会。
这意味着如果您在包含给定标记的 EDN 中读取,与使用相同的标记在源中产生 Literals 的输出可能不同。
示例
data_readers.cj
{example/symbolize clojure.core/symbol}
然后
user> (edn/read-string {:readers {(quote example/symbolize) clojure.core/symbol}}
"#example/symbolize\"hello\"")
hello
user> #example/symbolize "hello"
Syntax error compiling at (*cider-repl clojure/foragr:localhost:46533(clj)*:0:0).
Unable to resolve symbol: hello in this context
user>
为什么会有这种差异?有没有任何场景下从标签文字 Literals 解析符号是有益的?如果是这样的话,为什么不从标记元素和 edn/read-string
中做同样的操作呢?