如果我在 clojure 中执行以下操作
(defn sub1a [a]
(cond
(= a 0) 0
true (sub1b (- a 1) )))
(defn sub1b [a]
(cond
(= a 0) 0
true (sub1a (- a 1) )))
(println (sub1a 10))
我收到以下错误:
java.lang.Exception: Unable to resolve symbol: sub1b in this context
但是,如果我执行以下操作:
(defn sub1a [a]
(cond
(= a 0) 0
true (- a 1)))
(defn sub1b [a]
(cond
(= a 0) 0
true (- a 1)))
(defn sub1a [a]
(cond
(= a 0) 0
true (sub1b (- a 1) )))
(defn sub1b [a]
(cond
(= a 0) 0
true (sub1a (- a 1) )))
(println (sub1a 10))
它运行得很好。
这是设计使然,还是仅仅是 Clojure 阅读器工作方式的一个功能?
最佳答案
你可以做
(declare sub1a sub1b)
'declare' 专门用于创建一个没有绑定(bind)的 var 来进行前向声明。
你声明了一个名字:
(defn sub1a [a]
(cond
(= a 0) 0
true (sub1b (- a 1) )))
(defn sub1b [a]
(cond
(= a 0) 0
true (sub1a (- a 1) )))
(println (sub1a 10))
此外,在 cond(对于 clojure)中指定默认条件的惯用方式是使用 :else 子句。这与使用 T(表示 True)的 Common Lisp 有点不同。所以你之前的代码可以重写为:
(defn sub1a [a]
(cond
(= a 0) 0
:else (sub1b (- a 1) )))
...
关于function - clojure 函数循环依赖是设计明确禁止的,还是只是读者行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3433962/