2016-01-27 45 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,而動態功能則不適用。所以是的,它們在語義上是相同的,但它們也滿足了速度的實際需求,並與底層平臺互操作。