2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多此处的信息。

0
tools.reader
重标记

我正在使用 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)。

对此有什么想法或提示吗?

谢谢!

1 个回答

+1

选择了
 
最佳答案

如果您知道如何解决自动解析的关键字别名的别名,您可以为 *alias-map* 动态绑定设置并在此处插入一些内容:http://clojure.github.io/tools.reader/#clojure.tools.reader/*alias-map*

它是一个映射,但作为函数调用,所以我认为函数也可以。

感谢快速回复 Alex,而且我已经在使用 *alias-map* 作为函数了,但是这只适用于 ::alias/key 的情况。我的问题是关于那些应解析为当前名称空间的。
啊,明白了,别名映射只会与别名一起使用。您能真正使用 create-ns 来创建 ns 吗?

    user=> (create-ns 'x')
    #object[clojure.lang.Namespace 0x4397a639 "x"]
    user=> (binding [*ns* (find-ns 'x)] (r/read-string "::foo"))
    :x/foo
很好,这正是我想要的 create-ns,它工作了!再次感谢,Alex!
...