将ArraySeq转换为IFn

时间:2014-05-01 16:27:40

标签: 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>)

是一个ArraySeq,而不是一个IFn;所以我理解错误 - 但是我不确定为什么它不只是评估为+而是。

2 个答案:

答案 0 :(得分:3)

&将所有多余的参数放在集合中。这可以被解构为访问其第一个元素:

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

或等同地

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

答案 1 :(得分:1)

函数参数destroy中的&符号&收集seq的所有剩余参数,即使那里只有一个参数。

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