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

欢迎!请参阅 关于页面 了解有关此功能的一些更多信息。

0
tools.reader
重新标记

我正在使用 clojure.tools.reader/read 从文件中读取 clojure 和 cljs 表达式。

一切正常,但读取类似 ::keyword 的命名空间关键字时,它们被读取为 :user/keyword。

我知道读取器使用 ns 动态变量来确定读取符号和关键字时的当前命名空间,但我不知道如何使用它来读取一个不存在的命名空间,例如,从我现在正在读取的文件。

我尝试在读取之前先进行 (in-ns file-ns-symbol),

直接这样做不起作用,因为它将尝试调用 (the-ns file-ns-symbol) 来调用一个不存在的命名空间的函数。

(binding [*ns* file-ns-symbol]
  (reader/read ...))

任何想法或指导吗?

谢谢!

读取器

+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)
user=> #object[clojure.lang.Namespace 0x4397a639 "x"]
user=> (binding [*ns* (find-ns 'x)] (r/read-string "::foo"))
user=> :x/foo
太好了,create-ns 就是我在寻找的东西,它起作用了!再次感谢 Alex!
...