4

私はクロージュアを独学し始めたばかりで、楽しんでいます。しかし、私が書いたこの関数を実行し始めたとき、トラブルが始まりました!

これは、複数の引数を受け入れ、最後の引数と最初の引数の差を返す単純な関数です。

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

last関数を使用して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)))

しかし、もちろん、質問で指摘したように、 and を使用する方がより慣用的firstですlast

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

(get (list :foo) 0)nil に評価されます。

リストはインデックスによってアクセスされることは想定されていません。Clojure では、このような非効率性を回避することが一般的な設計上の決定です。

于 2013-08-13T13:06:38.450 に答える