gpt4 book ai didi

clojure - Clojure 中的 println! (按懒惰顺序)

转载 作者:行者123 更新时间:2023-12-02 17:47:11 24 4
gpt4 key购买 nike

1) (def x (for [i (range 1 3)] (do (println i) i)))

2) (def x (for [i (range 1 3)] (do i)))

两者产生相同的输出,那么 println 有什么用呢?

最佳答案

值计算自身,并且 do block 返回最后一个表达式的结果。这就是为什么 (do 2) 返回 2,如下例所示。因为它返回 2,所以当从 REPL 求值时,2 将作为结果打印到屏幕上。然而,函数 println 会产生副作用,但返回 nil。下面的副作用是值 2 将被打印到标准输出。还会打印 nil,因为这是函数 println 的返回值。

user=> (do 2)
2
user=> (println 2)
2
nil

由于我上面的解释,在您的示例中,输出相同。自己注意一下差异:

user=> (def x (for [i (range 1 3)] (do (println i) i)))
#'user/x
user=> x
(1
2
1 2)
user=> (def x (for [i (range 1 3)] (do i)))
#'user/x
user=> x
(1 2)

另请注意,for 是惰性的:

(def x (for [i (range 1 3)] (do (println i) i)))
#'user/x
user=> x
(1
2
1 2)
user=> x
(1 2)

第二次请求 x 时,仅打印 (1 2)。为什么?因为for是懒惰的。它仅在第一次请求时(第一次请求 x 时)生成其元素。下一次,元素已经生成,所以 do 中的副作用不会再次发生。

关于clojure - Clojure 中的 println! (按懒惰顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7766818/

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