在clojure中执行循环时出现空指针异常

Null pointer exception when executing loop in clojure

(defn my-loop [x] 
            (cond (> x 1)
                  ((println x)
                  (my-loop (- x 1)))
            ) 
    )

;; => #'user/my-loop
user> (my-loop 10)

为什么在执行这个函数的时候会出现空指针异常? 这不是正常的递归吗?

您正在调用带有附加层括号的 (println x) 的 return。 println returns nil 所以调用它会导致 NullPointerException.

要计算多个形式,其中只有一个预期使用 do 特殊形式,它计算任意数量的形式和 returns 最后一个的值:

(defn my-loop [x]
  (cond (> x 1) (do
                  (println x)
                  (my-loop (- x 1)))))

在这种情况下,when可以代替单臂conddo

(defn my-loop [x]
  (when (> x 1)
    (println x)
    (my-loop (- x 1))))

代码通常应如下所示:

(defn my-loop 
  "Some docstring"
  [x] 
  (cond 
    (> x 1)  (println x)
    :else    (my-loop (- x 1))))

保持良好的格式有助于及早发现问题。 您可能也对此 list of documentation sources 感兴趣,尤其是 Clojure CheatSheet 和“Getting Clojure”一书。