Clojure递归函数提供了空指针异常

时间:2018-11-15 22:21:54

标签: recursion clojure

使用fn定义简单的递归函数时,如下所示,

((fn myfunc [x] (if (zero? x) (println "STOP") ((println x) (myfunc (dec x))))) 6)

它打印6,5,4,3,2,1,STOP,然后我在REPL中得到一个空指针异常。这不是合法的语法吗?

我知道我可以使用def定义函数,并且那里(应该)没有任何递归问题。我只是对这个异常很好奇。

1 个答案:

答案 0 :(得分:2)

在lisps中,使用括号表示“将列表中的第一个参数作为函数处理,并与列表中的其余参数一起调用”。

在您的情况下,您有((println x) (myfunc (dec x)))。第一个(println x)被调用,返回一个nil以得到(nil (myfunc (dec x))),然后nil试图作为具有递归结果的函数被调用。这就是引发NPE异常的原因。

如果要在clojure中具有多个表达式,可以使用do宏,因此相同的代码应类似于:(do (println x) (myfunc (dec x)))

do本质上运行所有表达式的副作用,仅返回最后一个表达式的结果。