Clojure-协议/多方法溢出

Clojure-协议/多方法溢出,clojure,stack-overflow,clojurescript,Clojure,Stack Overflow,Clojurescript,为了更好地理解Clojure协议,我问自己它们是否完全像一个cond。例如,此函数可能会溢出: (defn my-cond [n] (cond (< n 0) (my-cond (inc n)) (> n 0) (my-cond (dec n)) :else "zero")) 例如,假设我现在使用一个协议来进行等价调用(即递归协议调用)。它会以任何方式改变烟囱可能爆炸的方式吗 我的直觉是否定的(怎么可能),但是(1)我不了解协议的内部

为了更好地理解Clojure协议,我问自己它们是否完全像一个
cond
。例如,此函数可能会溢出:

(defn my-cond [n]
  (cond
    (< n 0) (my-cond (inc n))
    (> n 0) (my-cond (dec n))
    :else "zero"))
例如,假设我现在使用一个协议来进行等价调用(即递归协议调用)。它会以任何方式改变烟囱可能爆炸的方式吗

我的直觉是否定的(怎么可能),但是(1)我不了解协议的内部结构,(2)因为它们使代码耦合性降低,所以引入这种循环可能更容易,因此能够防止它是有意义的


协议和多方法是否以与普通方法调用相同的方式使用堆栈?

是;函数、方法、多方法和协议都将其上下文推送到堆栈上。然而,协议不同于具有条件或多方法的函数调用,因为协议公开了类型上的单个分派,而JVM在这方面非常快。此外,类型使协议可以从Java中以动态函数无法使用的方式使用。因此,是的,它们在语义上是相同的,但它们也满足了速度和与底层平台互操作的实际需要。

是的。你自己要花15分钟来试着看这个,如果需要的话还包括一些阅读。@muhukI假设有差异,因为协议比cond更快。“你自己试着看这个需要15分钟,如果需要的话,包括一些阅读。”=>我现在正在做:)为了避免误解:我不是指RTFM意义上的15分钟。但通常来说,尝试一下并公布结果是一个好主意,有时会产生一个不同的、描述更好的问题。另外,我假设您知道
recur
> (my-cond 3)
;; "zero"

> (my-cond 99999999)
;; java.lang.StackOverflowError