我本以为 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*
配置要求数据读取器命名空间的行为?