2024 年 Clojure 运行状况调查! 分享您的想法。

欢迎!请参阅 关于 页面以了解有关此工作方式的一些更多信息。

0
REPL

在测试时,我注意到我在 prepl 中评估代码时的某些警告测试只通过一次然后失败。在每次会话中只会发出一次警告。

$ clojure -X clojure.core.server/start-server :name prepl :port 7777 :accept clojure.core.server/io-prepl :server-daemon false &
$ nc localhost 7777
(defn identity [x] x)
{:tag :ret, :val "#'user/identity", :ns "user", :ms 1, :form "(defn identity [x] x)"}
(binding [*out* *err*] (flush))
{:tag :err, :val "WARNING: identity already refers to: #'clojure.core/identity in namespace: user, being replaced by: #'user/identity\n"}
{:tag :ret, :val "nil", :ns "user", :ms 1, :form "(binding [*out* *err*] (flush))"}
(defn identity [x] x)
{:tag :ret, :val "#'user/identity", :ns "user", :ms 1, :form "(defn identity [x] x)"}
(binding [*out* *err*] (flush))
{:tag :ret, :val "nil", :ns "user", :ms 1, :form "(binding [*out* *err*] (flush))"}

这是预期的行为吗?

1 答案

0

这个阴影警告和 Clojure 的行为相一致吗?

如果您说这是预期行为,我会接受的。

我问这个问题是因为每次我向 Cursive 的 nREPL 中加载具有阴影函数的 NS 时,它都会抱怨。

所以那可能是在那个编辑器中的一种特殊行为。我应该提到这一点。
报告警告的方法是 `Namespace.warnOrFailOnReplace`,取决于该方法如何被调用(通过 `intern` 或 `refer` 或 nREPL 直接使用)以及检查的变量来源和内容,它将报告或不会报告。遗憾的是,我对 nREPL 了解得不够,不知道它可能会如何调用该方法。
...