我有一个包含 3 个函数的 Clojure seq。为什么(休息我的-seq)给出了一个"cannot be cast as"例外?



在调试一个较大的函数的过程中,我创建了一个更简单的函数来测试错误所在:

(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-predsseq

我的问题是:rest被定义为处理seqs,那么为什么我会得到上面的不能强制转换错误?谢谢

您有一个名为rest的本地,由函数参数列表绑定。您正在尝试调用rest,就好像它是一个函数一样,而不是调用clojure.core/rest

相关内容

最新更新