为什么Clojure';s表示宏仅接受一个主体表达式?

为什么Clojure';s表示宏仅接受一个主体表达式?,clojure,Clojure,Clojure的for宏接受两个参数:绑定形式序列和主体表达式。因此,如果我想在循环中执行多个操作,我必须将多个表达式包装在do块中,使它们成为单个表达式 比较: (doseq [a (range 3)] (prn 'a a) (inc a)) 致: doseq按预期工作。的投诉: clojure.lang.ArityException: Wrong number of args (3) passed to: core/for 我的问题是,为什么这不起作用?为什么Clojure的设计

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

比较:

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

doseq
按预期工作。
投诉:

clojure.lang.ArityException: Wrong number of args (3) passed to: core/for

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

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

(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
(def foo(适用于[a(范围32)]
(做
(prn(str“a是”a))
(a)
(以1富为例)
;=>
(“a是0”
“a是1”
...
“a是31”
1) ; 
(1 2 3 4 5 6 7 8 9 10) ; 哦,这次没有副作用

for
的一大区别是
是懒惰的,而
doseq
(主要用于诱发副作用)则不是<代码>当
以隐式
do
计算其主体时。也可以看到一个很好的答案,尽管我认为最后的分块部分主要是一条红鲱鱼,而且解释得不够好,无论如何都没有用。
(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