以下的Clojure代码实际上是错误的:为什么这个错误只会在Clojure REPL的运行时显示?
(defn divv [x y z] (if (< x y) z (divv ((- x y) y (+ z 1)))))
作为正确的一个应该是:
(defn divv [x y z] (if (< x y) z (divv (- x y) y (+ z 1))))
但其经过的Clojure REPL,并返回的功能。但调用它时(如为(divv 3 2 0)
,错误将显示
ClassCastException异常java.lang.Long中不能被强制转换为clojure.lang.IFn 用户/ divv(NO_SOURCE_FILE:1)
现在的问题是,为什么不是当divv
定义检测到错误?既然divv
已经被定义为一个函数获取3个参数,为什么通过测试?
为什么*不能*它,或为什么*不是*它?你在问为什么Clojure不做更多的静态分析? –
@DaveNewton,是的。 – Colliot
由于Clojure不是一种静态语言,它不会在运行时进行这种检查。有附加组件逐渐打字的概念,但我不知道是否扩展到方法签名,或者它如何集成到REPL中。 –