在调试一个较大的函数的过程中,我创建了一个更简单的函数来测试错误所在:
(defn foo [a-val p1 p2 & rest]
(loop [curr-preds (cons p1 (cons p2 rest))]
(let [first-pred (first curr-preds)
first-bool (first-pred a-val)
second-bool ((second curr-preds) a-val)
third-bool ((last curr-preds) a-val)]
(println "nnLogical values: " first-bool second-bool third-bool)
(println "Is it a seq?" (seq? curr-preds))
(if (empty? curr-preds)
first-bool
#_(recur (rest curr-preds))
))))
p1、p2和rest中的函数集合都是谓词(例如奇数?)。我写这篇文章的目的是希望它总是用3个谓词来调用。
当我取出倒数第二行的#_
时,我得到以下错误:
java.lang.ClassCastException: clojure.lang.ArraySeq cannot be cast to clojure.lang.IFn
/Users/gr/temp/LTtemp1.clj:166 user/foo
RestFn.java:467 clojure.lang.RestFn.invoke
通过println
语句,我发现:
curr-preds是一个包含3个谓词的
seq
,正如预期的调用
a-val
上的每个pred返回预期结果事实上,
curr-preds
是seq
我的问题是:rest
被定义为处理seqs,那么为什么我会得到上面的不能强制转换错误?谢谢
您有一个名为rest
的本地,由函数参数列表绑定。您正在尝试调用rest
的,就好像它是一个函数一样,而不是调用clojure.core/rest
。