Clojure - 协议/多方法溢出

时间:2016-01-27 09:04:52

标签: 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"))
> (my-cond 3)
;; "zero"

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

例如,让我们说我现在使用协议来制作一个等价的(即递归协议调用)。它会以任何方式改变堆栈的方式吗?

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

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

1 个答案:

答案 0 :(得分:3)

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