在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
可以代替单臂cond
和do
(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”一书。
(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
可以代替单臂cond
和do
(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”一书。