Clojure 将ArraySeq作为IFn进行铸造

Clojure 将ArraySeq作为IFn进行铸造,clojure,evaluation,Clojure,Evaluation,这里有一个基本问题。。我有点困惑 (((fn [_ & y] y) 'blah +) 3 4) 将导致以下错误: “java.lang.ClassCastException:clojure.lang.ArraySeq不能强制转换为clojure.lang.IFn” 我很希望它能被评估为: (+ 3 4) 等于7 我明白了 ((fn [_ & y] y) 'blah +) 评估为 (#<core$_PLUS_ clojure.core$_PLUS_@7cd07b83&

这里有一个基本问题。。我有点困惑

(((fn [_ & y] y) 'blah +) 3 4)
将导致以下错误:

“java.lang.ClassCastException:clojure.lang.ArraySeq不能强制转换为clojure.lang.IFn”

我很希望它能被评估为:

(+ 3 4) 
等于7

我明白了

((fn [_ & y] y) 'blah +)
评估为

(#<core$_PLUS_ clojure.core$_PLUS_@7cd07b83>)
(#)

这是ArraySeq,不是IFn;因此,我理解这个错误-但是我不确定为什么它不只是计算为a+。

函数参数销毁中的符号
&
将所有剩余参数收集到一个seq,即使那里只有一个

user=> ((fn [_ & y] y) 'blah +)
(#<core$_PLUS_ clojure.core$_PLUS_@205074de>)
user=> ((fn [_ y] y) 'blah +)
#<core$_PLUS_ clojure.core$_PLUS_@205074de>
user=>((fn[&y]y)'blah+)
(#)
用户=>((fn[;y]y)'blah+)
#

函数参数销毁中的符号
&
将所有剩余参数收集到一个seq,即使其中只有一个

user=> ((fn [_ & y] y) 'blah +)
(#<core$_PLUS_ clojure.core$_PLUS_@205074de>)
user=> ((fn [_ y] y) 'blah +)
#<core$_PLUS_ clojure.core$_PLUS_@205074de>
user=>((fn[&y]y)'blah+)
(#)
用户=>((fn[;y]y)'blah+)
#

&
将所有多余的参数放入一个集合中。可以对其进行分解以访问其第一个元素:

user> (((fn [_ & [y & _]] y) 'blah +) 3 4)
7
或者,相当于

user> (((fn [_ & ys] (first ys)) 'blah +) 3 4)
7

&
将所有多余的参数放在一个集合中。可以对其进行分解以访问其第一个元素:

user> (((fn [_ & [y & _]] y) 'blah +) 3 4)
7
或者,相当于

user> (((fn [_ & ys] (first ys)) 'blah +) 3 4)
7