function - clojure 函数循环依赖是设计明确禁止的,还是只是读者行为?

标签 function clojure cyclic-dependency

如果我在 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/

相关文章:

haskell - 解决haskell数据记录中的循环依赖

C++ 类的循环依赖(单例)

c++ - 函数使用对象,对象使用函数

Javascript/jQuery 倒计时器未正确初始化

python - Numpy,沿数组维度应用函数列表

c - 关于函数和参数的几个问题

Clojure 最佳实践 : When to use Metadata?

clojure - 为什么不以 def 形式破坏?

c++ - 标准库中没有 std::identity 是有原因的吗?

java - Clojure.java.jdbc 根据查询结构更改日期时间的返回类型