我有一个clojure程序,其中两个函数递归地相互调用:
(defn f1
...
(f2 ...)
)
(defn f2
...
(f1 ...)
)
编译器在f1
中发出错误。它说f2没有定义。有没有办法{* 1}}一个函数在clojure中。我可以验证递归实际终止。
答案 0 :(得分:7)
字面意思declare
:
(declare f2)
(defn f1 []
(f2))
(defn f2 []
(f1))
答案 1 :(得分:2)
还有({可能)相互递归函数的letfn
形式:
user=> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
(f2 [x] (f1 (inc x)))]
(f2 0))
;;=> 10
<强>更新强>
如果您在全球范围内需要这些功能,则可以始终在def
内使用letfn
。至于我,我发现这种方法比declare
更清晰(特别是对于相互递归的方法):
user> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
(f2 [x] (f1 (inc x)))]
(def f1 f1)
(def f2 f2))
#'user/f2
user> (f2 0)
;;=> 10