2

我正在尝试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

1 回答 1

4

问题似乎是名称冲突。您已将名称rest用于调用参数的尾部序列。然后您随后尝试使用该函数rest,但看到的是该序列。

于 2013-05-27T01:24:57.670 回答