2014-02-19 25 views
3

在调试的较大功能的过程中,我创建了一个更简单的函数来测试,其中的错误是:我有一个包含3个函数的Clojure seq。为什么(rest my-seq)给出“不能作为”异常?

(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 "\n\nLogical 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,和功能于其余集合都是谓词(例如,奇数?) 。我写这篇文章的期望是它总是被称为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,如预期的那样

  • 调用每个pred a-val倍的回报预期的结果

  • curr-preds,其实,一个seq

我的问题:rest被定义为在seqs工作,所以为什么我得到上面不能待投的错误?谢谢。

回答

5

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

+0

哎唷!我很尴尬,我犯了这个错误......以及我一直试图解决这个问题的时间。现在我可以继续下一个错误....非常感谢。 –

+3

每个人都会犯这个错误至少一次。当你做了十几次,那么你可能会感到尴尬。 – amalloy

相关问题