当我在Clojure中收到此错误时会发生什么?
java.lang.RuntimeException: No reader function for tag db/id
答案 0 :(得分:7)
此错误消息与Clojure 1.7中引入的功能有关, tagged literals。标记文字是一种简单的扩展方式 在Clojure代码中可以将哪些数据类型表示为文字或EDN 数据
Clojure附带两个标记文字的读者,#inst
和
#uuid
允许java.util.Date
和java.util.UUID
的文字表示
data_readers.clj
。通过包含可以添加对更多标签的支持
类路径上的#db/id
个文件为described in the
documentation。
此错误的一些常见原因:
:readers
文字*data-readers*
:readers
。此错误的一个常见原因是尝试使用EDN reader
没有传递clojure.edn/read
选项。来自doc字符串
:readers - a map of tag symbols to data-reader functions to be
considered before default-data-readers. When not
supplied, only the default-data-readers will be used.
:
default-data-readers
顾名思义,data_readers.clj
仅 数据地图
与Clojure本身一起提供的读者。也就是说,它不包括在内
任何库的*data-readers*
文件中定义的任何读者
你正在使用(比方说,像Datomic)。在这种情况下的解决方案是
传递var中找到的当前加载数据读取器集
(clojure.edn/read {:readers *data-readers*} <your-read-source>)
。
(require 'datomic.db
'datomic.function
'datomic.codec)
(edn/read {:readers {'db/id datomic.db/id-literal
'db/fn datomic.function/construct
'base64 datomic.codec/base-64-literal}}
<your-read-source-here>)
或者,更好的是,明确指定数据读取器的映射 你想用。例如,如果您希望只能使用 数据库数据阅读器:
default-data-readers
当然,因为这些只是我们正在处理的clojure地图,
我们还可以通过合并地图来包含(require 'datomic.db
'datomic.function
'datomic.codec)
(edn/read {:readers (merge
default-data-readers
{'db/id datomic.db/id-literal
'db/fn datomic.function/construct
'base64 datomic.codec/base-64-literal})}
<your-read-source-here>)
:
fedIncome