为什么Clojure';s表示宏仅接受一个主体表达式?
Clojure的为什么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的设计
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