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*
的函数。当然,可以在该函数中使用该映射。或者作为替代,我可以直接编写五个函数 -- 或者使用 doseq
来“编写”。但是,关于如何执行这些标记的小不一致性是有点令人困惑。(例如,除了 :reader
的 {tag-sym fn}
映射和 {tag-sym Var}
的 *data-readers*
映射之外,还有 data_readers.clj
中的 {unquoted-tag-sym-in-a-map-literal fn-sym}
语法,尽管它是一个 clj 文件,但它似乎不提供任何机会来做动态定义读取器,只是提供字面量映射。)
也许我根本不理解这一切的实用性/历史/逻辑,如果有人能提供一些见解,那么我将不胜感激,如果没有也行。