1

我有一个 clojure 程序,其中两个函数递归地相互调用:

(defn f1
...
(f2 ...)
)


(defn f2
...
(f1 ...)
)

编译器在f1. 意思是 f2 没有定义。有没有办法declare在clojure中实现函数。我可以验证递归是否真正终止。

4

2 回答 2

9

字面意思declare

(declare f2)
(defn f1 []
  (f2))

(defn f2 []
  (f1))
于 2018-05-27T16:20:12.823 回答
2

还有一种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
于 2018-05-27T21:47:16.863 回答