Clojure - 协议/多方法溢出



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

(defn my-cond [n]
  (cond
    (< n 0) (my-cond (inc n))
    (> n 0) (my-cond (dec n))
    :else "zero"))
> (my-cond 3)
;; "zero"
> (my-cond 99999999)
;; java.lang.StackOverflowError

例如,假设我现在使用一个协议来制作一个等效的协议(即递归协议调用)。它是否会以任何方式改变堆栈可能爆炸的方式?

我的直觉说不(怎么可能),但是(1)我不了解协议内部和(2)由于它们使代码耦合较少,因此引入这种循环可能会更容易,因此能够防止它是有意义的。

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

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

最新更新