4

我刚刚开始自学clojure,我很开心。然而,当我开始执行我写的这个函数时,麻烦就开始了!

这是一个简单的函数,它接受多个参数并返回最后一个参数和第一个参数之间的差异。

(defn diff-last-first 
   "gets the difference between the last & the first arguments" 
   [& args] 
   (- (get args (- (count args) 1)) (get args 0)))

我知道我可以简单地使用最后一个函数来获取 args 的最后一个元素,但是我无法理解为什么在执行时 会抛出NullPointerException(diff-last-first 1 2 3)

4

3 回答 3

3

如果您确实想访问列表的第 n 个值,可以使用nth

(defn diff-last-first [& args]
   (- (nth args (dec (count args)))
      (nth args 0)))

但是,当然,正如您在问题中指出的那样,使用firstand更为惯用last

(defn diff-last-first [& args]
  (- (last args) 
     (first args)))
于 2013-08-13T13:53:58.143 回答
2

(get (list :foo) 0)评估为零。

列表不应该通过索引来访问:在 Clojure 中,防止这种低效率是一个常见的设计决策。

于 2013-08-13T13:06:38.450 回答
0

好的,我知道了!

@vemv 是对的![& args] 是一个列表,因此(get args 0)返回nil

args 则按(defn get-l-f [args] (- (get args (- (count args) 1)) (get args 0)))预期工作,这里是一个向量!

于 2013-08-13T13:25:03.450 回答