为了更好地理解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)因为它们使代码更少耦合,所以它可能更容易引入这种循环和所以能够阻止它是有意义的。
协议和多方法是否以与普通方法调用相同的方式使用堆栈?
答案 0 :(得分:3)
是;函数,方法,多方法和协议都将它们的上下文推送到堆栈中。但是,协议与使用条件或多方法的函数调用不同,因为协议在类型上公开单个调度,并且JVM非常快。此外,类型使得协议可以从Java中使用,而动态函数则不是这样。所以是的,它们在语义上是相同的,但它们也满足了对速度的实际需求并与底层平台互操作。