2016-01-27 40 views
1

为了更好地理解Clojure协议,我问自己他们是否像cond一样行事。比如该功能可能会溢出:Clojure - 协议/多方法溢出

(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

是的。花15分钟时间尝试自己看,包括一些必要的阅读。 – muhuk

+0

@ muhuk我认为有差异,因为协议比cond快。 “这需要15分钟时间来尝试自己看,包括一些必要的阅读。” =>我现在正在做:) – nha

+2

为了避免误解:我不是指RTFM意义上的15分钟。但是,尝试一下并发布结果通常是一个好主意,有时它可能会导致一个不同的,更好描述的问题。另外,我假设你知道“复发”。 – muhuk

回答

3

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