edn/read
的:readers
参数接受一个标签符号到数据读取函数的映射,但*data-readers*
需要一个标签符号到数据读取Vars(全局绑定)的映射。我只是在 wondering 是否存在什么原因导致了这种差异,因为不能在*data-readers*
中使用匿名函数确实是一件让人头疼的事情。
背景是我制作了一系列相关的读取器标签(用于标记字面量),它们都大致相同。所以我不是创建了5个几乎相同的功能,而是创建了一个具有两个参数(标签,值)的功能。然后,我创建了一个reader-for
函数,在需要时返回一个单一参数函数(使用partial
和双参数函数)。这对于edn/read
来说工作得很顺利,但当我去使用它在*data-readers*
中时,它就是一个失败的尝试,因为没有reader-for
输出的Vars。
有几个解决方案。例如,将*default-data-reader-fn*
绑定并创建一个将转到所有读取器的函数。这并不特别困难,但现在我仍然有两个实体,而不是一个——为edn/read
提供的读取器映射和为*default-data-reader-fn*
提供的函数。当然,可以在函数中使用映射。或者,作为替代方案,我可以简单地编写5个函数,或者用“编写”doseq
。但这些标签-executes 之间的细微差异确实有些令人费解。例如,除了{tag-sym fn}
的:reader
映射和{tag-sym Var}
的*data-readers*
映射之外,还有data_readers.clj
中的{unquoted-tag-sym-in-a-map-literal fn-sym}
语法,尽管它是clj文件,但似乎并不提供定义读取器的动态机会,只提供字面量映射。
也许我根本不了解这背后的实践、历史和逻辑,如果有人能阐明一些光线,我将不胜感激,如果不行,那也很好。