我以为 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 命名空间加载可能发生在第一次读取标记文字时?
如果是出于意外代码执行的安全影响考虑,也许可以通过 *read-eval*
来配置要求数据读取器命名空间的行为?