【发布时间】:2014-07-21 15:18:38
【问题描述】:
Clojure 的for 宏接受两个参数:一个绑定形式序列和一个主体表达式。因此,如果我想在循环中执行多项操作,我必须将多个表达式包装在 do 块中以使它们成为单个表达式。
比较:
(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 中所做的那样?好像没有语义歧义吧?
【问题讨论】:
-
一个很大的区别是
for是惰性的,而doseq(主要用于引起副作用)不是。when在隐式do中评估其主体。另见stackoverflow.com/q/4725417
标签: clojure