2014-02-19 24 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

相關問題