Recursion clojure递归函数中的NullPointerException

Recursion clojure递归函数中的NullPointerException,recursion,clojure,nullpointerexception,Recursion,Clojure,Nullpointerexception,我正在学习Clojure并尝试使用递归函数在列表上循环。我成功地完成了递归的嵌套调用,但当它开始返回时,我有一个java.lang.NullPointerException。我真的不明白为什么 我的代码非常简单,有一些详细的打印: (defn parse-list-metadata [l] (cond (empty? l) (println "empty list should never happen") (== (count l) 1) (str "en

我正在学习Clojure并尝试使用递归函数在列表上循环。我成功地完成了递归的嵌套调用,但当它开始返回时,我有一个java.lang.NullPointerException。我真的不明白为什么

我的代码非常简单,有一些详细的打印:

(defn parse-list-metadata
  [l]
  (cond
    (empty? l)       (println "empty list should never happen")
    (== (count l) 1) (str  "end of recursion, l=" l)
    :else            ((println "going deeper, size=" (count l) ", l=" l)
                      (println (parse-list-metadata (rest l)))
                      (println "going back up")
                      )))
结果是:

=> (parse-list-metadata '(1 2 3 4))
going deeper, size= 4 , l= (1 2 3 4)
going deeper, size= 3 , l= (2 3 4)
going deeper, size= 2 , l= (3 4)
end of recursion, l=(4)
going back up

NullPointerException   clj-l8metadata.core/parse-list-metadata (form-init896211890420472487.clj:8)
它一直到大小为1的列表,但是在返回最嵌套的调用之后,我得到了NullPointerException。我希望一些打印的nil值作为println返回nil,但我真的不明白这里缺少了什么

我知道还有其他的方法(doseq,recur…),但我真的很想了解这里发生了什么

你知道我做错了什么吗


编辑:我确实知道NullPointerException是什么,但是Leiningen Clojure REPL对堆栈的信息不是很丰富。此外,Java中没有变量,因此很难弄清楚如何使用NullPointerException。实际上,正是由于我的调试打印,我才把Clojure期望的函数放在那里。正如公认的答案所暗示的那样,一个包装的
do
成功了。因此它不是重复的您的问题在于
:否则,您需要在第一个左括号后加一个
do
。您将得到一个空指针异常,因为您正试图将
(println“going deep,size=(count l)”,l=“l)
的结果作为函数调用,但该表达式的结果是
nil

可能重复的