我以为 Clojure 会自动加载用于在源代码中读取标记字面量的 vars 的命名空间,但显然并不是这样。
假设有一个库定义了下面内容的 data_readers.clj
{foo/bar my.library.foo/bar
foo/baz my.library/baz}
尝试读取 #foo/bar [1 2 3]
将产生这个异常
Syntax error reading source at (REPL:1:69).
Attempting to call unbound fn: #'my.library.foo/bar
为了避免这个异常,您需要在使用读取器标签之前require 库命名空间。
能够只通过将其添加到类路径中而不进行显式的 require 步骤来使用库读取器标签会更方便。
我不知道为什么这么做...
如果理由是 clojure.core 启动时间,那么实际的 var ns 加载可能发生在第一次读取标记字面量的时间?
如果理由是意外代码执行的安全影响,也许可以通过 *read-eval*
配置读取数据读者命名空间的行为?