Clojure递归函数基准用例正常 递归调用触发NullPointerException求助
异常原因
NullPointerException由两个Clojure语法使用错误导致:
- 核心错误:
if表达式的else分支额外包裹了一层括号。Clojure中括号具有执行语义,你写的代码:
(if (empty? lis) (flush) ((println "Entra al else") (prn lis) (imprimir (rest lis) orig)))
当lis不为空进入else分支时,Clojure会先执行括号内的第一个表达式(println "Entra al else"),拿到返回值nil后,会把nil当成函数,后续(prn lis)、(imprimir (rest lis) orig)的执行结果当成入参调用nil,调用nil作为函数就会直接抛出NullPointerException。
- 附加错误:你定义了多个独立的
if表达式,Clojure函数默认返回最后一个表达式的执行结果,你最后一个表达式是(if (empty? lis) orig ),当lis不为空时这个表达式返回nil,不符合你要返回orig的预期。
修复代码
按你的预期逻辑调整后的精简版本代码如下,可直接输出你要求的结果:
(defn imprimir ([elem] (when (not (sequential? elem)) (println elem) elem)) ([lis orig] (if (empty? lis) orig (do (prn lis) (imprimir (rest lis) orig))))) ;; 测试调用 (println (imprimir '(1 2 3 4 5) "saraza"))
执行结果
运行上述代码会输出你预期的内容:
(1 2 3 4 5) (2 3 4 5) (3 4 5) (4 5) (5) saraza
内容的提问来源于stack exchange,提问作者Leandro Caplan
相关产品推荐
相关产品推荐

