2013-05-27 47 views
2

我想在Clojure中編寫自定義的max函數,它應該支持一個或多個參數。但是,我遇到了一個我無法弄清楚的錯誤。這裏是以下功能:Clojure中的可變參數錯誤

(defn my-max [arg & rest]                
    (loop [m arg c rest]                
    (cond (empty? c) m                
      (> m (first c)) (recur m (rest c))           
      :else (recur (first c) (rest c))))) 

我遇到試圖評估該功能時,出現以下錯誤:

user> (my-max 2 3 1 4 5)                                      
ClassCastException clojure.lang.ArraySeq cannot be cast to clojure.lang.IFn user/my-max (NO_SOURCE_FILE:5) 

我認爲這會工作,因爲我是在假設rest只是一個序列。我能夠使這個函數在沒有可變簽名的情況下工作,其中參數只是一個序列:

(defn my-max [coll]                                        
    (loop [m (first coll) c (rest coll)]                                   
    (cond (empty? c) m                                       
      (> m (first c)) (recur m (rest c))                                 
      :else (recur (first c) (rest c))))) 

回答

4

該問題似乎是名稱衝突。您使用名稱rest作爲調用參數的尾部序列。然後,您隨後嘗試使用功能rest,但是可以看到該順序。

+0

是的,就是這樣。我不知道爲什麼我以前沒有看到 - 有時需要進行完整性檢查。 – dtg

+0

這也許是我們可能希望看到某些編譯器警告的地方。 –

+0

@A。 Webb - 同意,這正是我們爲什麼需要在Clojure中進行更多靜態類型檢查的原因。會馬上拿起這種東西。 – mikera