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

欢迎!请参阅 关于 页面以获取更多关于此工作方式的信息。

0
Clojure

clojure.repl/source-fn 函数通过使用自定义读取器在给定符号的行和文件元数据指定的位置读取源形式。虽然这对大多数事物都工作得很好,但当将 source-fn 应用到含有类似 ::T/foo 的关键字命名空间别名的代码时,我遇到了一个问题。::T/foo 是在出现上下文中合法的命名空间关键字,因为一个命名空间别名 T 已经在 ns 头部创建。因此当读取 ::T/foo 关键字时,它将解析为预期的 :my-other.ns/foo 因为 ns 有适当的别名。然而,当尝试通过 clojure.repl/source-fn 读取源时,ns 可能不再是该表式的原始读取上下文,这会导致错误的异常 java.lang.RuntimeException: Invalid token: ::T/foo。

解决方案是将 clojure.repl/source-fn 的读取操作包装在 (binding (link: ns (.ns v)) ...) 中,这样源读取将在原始加载读取上下文中进行,从而防止此错误。

这里有修补后的等效函数,https://github.com/clojure-grimoire/lein-grim/blob/master/src/grimoire/doc.clj#L50-L74,我将在早上提交对 1.6.0 的补丁。

2 个答案

0

评论者:arrdem

补丁不再应用于 master,已更新。

0
参考: https://clojure.atlassian.net/browse/CLJ-1579(由 arrdem 报告)
...