我原以为 Clojure 会自动加载在源代码中用于读取标签字面的变量的命名空间,但显然并不是这样的。
假设有一个定义包含以下内容的库的 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 的启动时间,那么变量命名空间的实际加载可能是在读取第一个标签字面时发生的吗?
如果原因是意外代码执行的安全性影响,那么可能可以通过配置 *read-eval*
来配置要求数据读取器命名空间的行为?