为了更好地理解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 中使用,而动态函数则不可用。所以是的,它们在语义上是相同的,但它们也满足了速度和与底层平台互操作的实际需求。