gpt4 book ai didi

clojure - 第二个 println 语句会发生什么? (Clojure 回复)

转载 作者:行者123 更新时间:2023-12-02 18:32:20 25 4
gpt4 key购买 nike

当我在 clojure REPL 中调用这个小函数时,它只打印第一个 hello world,而不是 hello mars。这是为什么?它不是懒惰的(据我所知),否则不会遇到异常,此外 SO 告诉我 println 会导致刷新。

(defn foo                                                                                                                                                           
"I don't do a whole lot."
[x]
(println x "Hello, World!")
(map (fn [x] (let [_ (println "Hello, Mars")
__ (throw (Exception. "talking to many planets"))]
{ :aliens? false }
)) [1 2 3])
)

输出:

(foo nil) nil Hello, World!

Exception talking to many planets test.repl/foo/fn--6580 (form-init13300486174634970.clj:5)

最佳答案

首先,map实际上是惰性的,因此foo返回一个LazySeq,然后在REPL打印它时强制执行。现在,当我使用裸 Clojure (java -jar clojure.jar) 运行您的示例时,我得到以下输出:

user=> (foo nil)
nil Hello, World!
(Hello, Mars
Exception talking to many planets user/foo/fn--1 (NO_SOURCE_FILE:5)
user=>

我在 Clojure 1.4.0 和 1.5.1 中得到了相同的结果。

现在,如果我通过 lein repl 运行,我会得到您描述的输出。因此,nrepl 链中的某些内容似乎正在影响内容的打印方式。这是有道理的,因为 nrepl 旨在通过网络与客户端进行通信。然而,在处理这种情况时似乎存在一个小错误。或者也许在打印值时它会将 flush-on-newline 重新绑定(bind)为 false?抱歉,我还没有深入研究代码,无法给出更明确的答案。

顺便说一句,如果您将函数调用包装在 println 中,即 (println (foo nil)),那么您将获得如上所示的预期输出。

关于clojure - 第二个 println 语句会发生什么? (Clojure 回复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20437767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com