具有数据结构的Clojure递归

1 recursion clojure

我已经尝试过这个Clojure例程的几个版本,但它总是会产生一个空指针.如何消除错误?

(defn loopthru [n] (
  (if-not (empty? n) (
       (println (first n))
       (loopthru (rest n))
  ))
))
(loopthru [1 2 3 4 5 6])
Run Code Online (Sandbox Code Playgroud)

谢谢,格雷格

Jul*_*ang 6

正如大家所指出的那样,你的if-not宏周围有两个括号,这是不正确的.(与Scheme不同,双括号在Clojure中很少是正确的.)但是在你的if特殊形式中还有另一个问题.应该有一个do特殊的形式来按顺序评估s表达式.

(defn loopthru [n]
  (if-not (empty? n)
    (do (println (first n))
     (loopthru (rest n)))))
Run Code Online (Sandbox Code Playgroud)

其他几件事.在if语句中没有else块的情况下使用when/ when-not.实际上,when-not在这种情况下使用消除了do对条件的s表达式中没有歧义的需要.我必须提到强制性的评论,在这种情况下,递归会咀嚼堆栈空间,所以请recur改用

(defn loopthru [n]
  (when-not (empty? n)
    (println (first n))
    (recur (rest n))))
Run Code Online (Sandbox Code Playgroud)