gpt4 book ai didi

clojure - 为什么 Clojure 的 for 宏只接受一个 body 表达式?

转载 作者:行者123 更新时间:2023-12-04 13:27:05 25 4
gpt4 key购买 nike

Clojure 的 for宏接受两个参数:一系列绑定(bind)形式和一个主体表达式。因此,如果我想在循环中执行多项操作,我必须将多个表达式包装在 do 中。 block 以使它们成为单个表达式。

比较:

(doseq [a (range 3)]
(prn 'a a)
(inc a))

到:
(for [a (range 3)]
(prn 'a a)
(inc a))
doseq按预期工作。 for提示:
clojure.lang.ArityException: Wrong number of args (3) passed to: core/for

我的问题是,为什么这不起作用?为什么 Clojure 的设计者不允许在 for 循环中有多个“body”表达式,就像他们在 doseq 中所做的那样?和 when ?好像没有任何语义歧义,对吧?

最佳答案

Clojure 的 for不是循环,它是惰性列表理解。因为只有(隐式)do 的主体中最后一个表达式的值被返回时,任何其他表达式都必须仅仅为了副作用而存在。执行副作用是 doseq 的工作,这就是为什么它有一个隐含的 do .那for不应该提醒,你真的想在你的懒惰序列中产生副作用吗?尽管这样做有正当理由,但需要注意的是,这些副作用会在您需要时执行。

(def foo (for [a (range 32)]
(do
(prn (str "a is " a))
(inc a))))

(take 1 foo)
;=>
("a is 0"
"a is 1"
...
"a is 31"
1) ; <= the return value

(take 10 foo)
;=>
(1 2 3 4 5 6 7 8 9 10) ; aw, no side effects this time

关于clojure - 为什么 Clojure 的 for 宏只接受一个 body 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868702/

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