我是 clojure 新手,尝试编写简单的函数来获取数字列表并仅过滤偶数。
我想在没有过滤器的情况下完成它,甚至?,只有纯clojure
(defn my-even [ilist]
(if
(= (mod (first ilist) 2) 0)
(concat (list (first ilist)) (my-even (rest ilist)))
(my-even (rest ilist))
)
)
我尝试运行它:
(my-even '(1,2,3,4,5))
但出现错误:
#<CompilerException java.lang.NullPointerException (NO_SOURCE_FILE:0)>
出了什么问题?
谢谢。
最佳答案
正如乔纳斯所说,你没有基本案例;除此之外,将括号放在单独的行上并不是 Clojure(或任何其他 Lisp)惯用的做法,还要将 if
的谓词保持在同一行。
通过解构,它的可读性更强:
(defn my-even? [coll]
(if-let [[first & rest] coll]
(if (= (mod first 2) 0)
(cons first (my-even? rest))
(my-even? rest))))
关于exception - Clojure NullPointerException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584337/