Clojure NullPointerException错误

0xA*_*xAX 2 exception clojure nullpointerexception

我是clojure的新手,并尝试编写简单的函数,它获取数字列表并仅过滤偶数.

我想做过滤除了甚至?,只有纯粹的clojure

(defn my-even [ilist]
   (if
    (= (mod (first ilist) 2) 0)
    (concat (list (first ilist)) (my-even (rest ilist)))
    (my-even (rest ilist))
   )
)
Run Code Online (Sandbox Code Playgroud)

我尝试运行它:

(my-even '(1,2,3,4,5))
Run Code Online (Sandbox Code Playgroud)

但得到错误:

#<CompilerException java.lang.NullPointerException (NO_SOURCE_FILE:0)>
Run Code Online (Sandbox Code Playgroud)

怎么了?

谢谢.

Jon*_*nas 7

您的递归函数my-even没有基本情况.当列表中没有更多元素时会发生什么?(first ilist)返回nil(mod nil 2)抛出NullPointerException.

你必须以某种方式测试空列表.


Ham*_*aya 7

正如乔纳斯所说,你没有基本情况; 除此之外,它不是惯用的Clojure(或任何其他Lisp)将parens放在不同的行上,也保持if在同一行的谓词.

通过解构,它更具可读性:

(defn my-even? [coll]
  (if-let [[first & rest] coll]
    (if (= (mod first 2) 0)
      (cons first (my-even? rest))
      (my-even? rest))))
Run Code Online (Sandbox Code Playgroud)