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