2015-07-21 88 views
1

以下的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个参数,为什么​​通过测试?

+2

为什么*不能*它,或为什么*不是*它?你在问为什么Clojure不做更多的静态分析? –

+0

@DaveNewton,是的。 – Colliot

+0

由于Clojure不是一种静态语言,它不会在运行时进行这种检查。有附加组件逐渐打字的概念,但我不知道是否扩展到方法签名,或者它如何集成到REPL中。 –

回答

3

在我的经验看来,有两个基本的学校的思想语言设计:

  • 学校#1(“静态分析”,“杀出重围编译”,或“疯狂的自大狂”派)认为,它是既可以并需要进行检测许多/大多数/所有可能的条件这可能会在运行时造成问题,并且具有以下特征:A)大量的静态类型信息(对于没有静态数据操作的静态分析,有什么乐趣?),B)需要摘要的大规模和复杂的编译器,筛选和排序所有这些静态数据,以及C)声称会阻止运行时错误的编译时错误消息。

  • 学校#2(“动态分析”,“坚果教授”或“呃 - 我们会在运行时找出它”)认为,因为静态分析不能确定所有可能出错的东西在运行时(因为有些东西甚至超出了静态分析的最稳定状态:-),这是不值得花费的,而且它会全部在洗涤中出来。这些语言/系统具有以下特征:A)仅在有限信息下运行的小型编译器; B)更复杂的运行时支持,以检测静态分析可能检测到的错误; C)最小或无输入信息; D)更多运行时错误比你可以动摇编译器手册。

我自己,我喜欢“动态分析”学校的语言,因为它让开发软件变得更有趣。如果你从来没有使用变量没有数据类型的语言,并且编译某些东西不需要休息时间,那么你可能想要给一个动态类型的语言(比如Smalltalk或者Clojure)一个尝试。灵活性很有趣。

分享和享受。

相关问题