我已经尝试过这个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)
谢谢,格雷格
正如大家所指出的那样,你的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)