我已经尝试过这个Clojure例程的几个版本,但它总是会产生一个空指针。如何消除错误?
(defn loopthru [n] (
(if-not (empty? n) (
(println (first n))
(loopthru (rest n))
))
))
(loopthru [1 2 3 4 5 6])
谢谢,Greg
答案 0 :(得分:6)
正如大家所指出的,你的if-not
宏周围有两个括号,这是不正确的。 (与Scheme不同,双括号在Clojure中很少是正确的。)但是在你的if特殊形式中还有另一个问题。应该有一个do
特殊形式,它按顺序评估s表达式。
(defn loopthru [n]
(if-not (empty? n)
(do (println (first n))
(loopthru (rest n)))))
其他一些事情。如果您的if语句中没有else块,请使用when
/ when-not
。实际上,在这种情况下使用when-not
消除了对do
的需要,因为s表达式中没有关于条件的歧义。我必须提到强制性的评论,在这种情况下,递归会咀嚼堆栈空间,所以使用recur
而不是
(defn loopthru [n]
(when-not (empty? n)
(println (first n))
(recur (rest n))))
答案 1 :(得分:3)
(defn loopthru [col]
(doseq [n col] (println n)))
(defn loopthru [f col]
(doseq [item col] (f item)))
答案 2 :(得分:0)
应该省略函数体周围的一对括号。然后它会工作。