我使用 clojure.tools.reader/read 读取文件中的 clojure 和 cljs 表达式。
一切正常,但是当读取像 ::keyword
这样的命名空间关键词时,它们被读取为 :user/keyword。
我知道读取器使用 ns 动态变量来找出读取符号和关键词的当前命名空间,但我不知道如何使用它来读取不存在于命名空间,例如当前正在读取的文件中的命名空间。
我在执行读取之前尝试了一个 (in-ns file-ns-symbol),这样它就会在读取之前创建命名空间,并可以正常工作,但有时我会遇到 java.lang.IllegalStateException: Can't change/establish root binding of: *ns* with set
错误。
仅仅执行
(binding [*ns* file-ns-symbol]
(reader/read ...))
是不行的,因为它将尝试对不存在的命名空间调用 (the-ns file-ns-symbol)。
有什么想法或提示吗?
谢谢!