我有一个 clojure 程序,其中两个函数递归地相互调用:
(defn f1
...
(f2 ...)
)
(defn f2
...
(f1 ...)
)
编译器在f1
. 意思是 f2 没有定义。有没有办法declare
在clojure中实现函数。我可以验证递归是否真正终止。
我有一个 clojure 程序,其中两个函数递归地相互调用:
(defn f1
...
(f2 ...)
)
(defn f2
...
(f1 ...)
)
编译器在f1
. 意思是 f2 没有定义。有没有办法declare
在clojure中实现函数。我可以验证递归是否真正终止。
字面意思declare
:
(declare f2)
(defn f1 []
(f2))
(defn f2 []
(f1))
还有一种letfn
(可能)相互递归函数的形式:
user=> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
(f2 [x] (f1 (inc x)))]
(f2 0))
;;=> 10
如果您随后需要全局更新def
这些功能,您可以随时使用inside 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