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)
怎么了?
谢谢.
您的递归函数my-even没有基本情况.当列表中没有更多元素时会发生什么?(first ilist)返回nil并(mod nil 2)抛出NullPointerException.
你必须以某种方式测试空列表.
正如乔纳斯所说,你没有基本情况; 除此之外,它不是惯用的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)