读取器参考文献提到,标签字面量是Clojure对edn标签元素的实现。
然而,两者至少在一点上有所不同:由标签字面量产生的符号将被解析,但是由标签元素产生并由clojure.edn/read-string
读取的符号则不会被解析。
这意味着在读取包含特定标签的EDN时与使用相同标签在源代码中产生字面量时,您可能会得到不同的输出。
示例
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>
为什么会有这种差异?是否有什么场景下从标签字面量中解析符号会是好主意?如果是这样,为什么不对标签元素和edn/read-string
做相同的事情呢?