edn/read
的 :readers
参数接收一个将标签符号映射到数据读取函数的映射,但 *data-readers*
需要 一个将标签符号映射到数据读取 Vars (全局绑定)的映射。我只想知道是否有任何理由造成这种差异,因为无法在 *data-readers*
中使用匿名函数真是太遗憾了。
背景是,我制作了一些相关的读取器标签(用于标记文字),它们都工作得很好,所以我不想创建 5 个几乎相同的读取器函数,因此我只创建了一个一个参数的函数(标记,值),然后我制作了一个 reader-for
函数,该函数根据需要返回一个一参数函数(使用 partial
和两个参数的函数)。这对于 edn/read
来说工作得很好,但是当我尝试在 *data-readers*
中使用它时,因为 reader-for
的输出没有 Var,所以行不通。
有几个解决方案。例如,绑定 *default-data-reader-fn*
并制作一个函数来转发到所有我的读取器。这并不特别困难,但我现在有两个工件而不是一个 - 一个为 edn/read
的读取器映射和一个用于 *default-data-reader-fn*
的函数。当然可以在函数中利用这个映射。或者,作为一种替代方案,我可以直接编写五个函数——“编写”五个省份函数。但这些保留标记处理上的不一致性有点让人费解。(例如,除了 {tag-sym fn}
的 :reader
映射和 {tag-sym Var}
的 *data-readers*
映射外,还有 data_readers.clj
中的 {unquoted-tag-sym-in-a-map-literal fn-sym}
语法,尽管它是一个 clj 文件,但它似乎不提供任何机会来进行动态定义读取器,只是提供字面量映射)。
可能是我还没有掌握所有这些实用、历史和逻辑,如果有人能提供一些启发,那将不胜感激,如果没有也行。