3

这是我之前关于 Clojure 静态类型的问题的后续。

我浏览了编译器的 Java 源代码,它在几个地方检查 的值*warn-on-reflection*,但是当我编译以下代码时,我只得到一个运行时错误:

(defn div-2 [^String s] (/ 2 s))

在任何情况下,此代码不应给出编译时警告(它不会)?让编译器对以下代码发出警告有多难:

(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))

谢谢。

4

3 回答 3

3

问题是编译器不跟踪def'd vars 的类型。所以是的,在你的简单例子中,这是可能的。但是你多久传递一次文字?很少,在一个真正的程序中。

让类型像在真正的静态类型语言中那样“流过”需要大量的返工。您必须通过变量、动态反弹变量、取消引用等来跟踪类型信息。然后您仍然会遇到从集合/序列中拉出项目的问题,这意味着泛型类型,这是一个巨大的蠕虫罐......

Clojure 中的类型注释从来没有打算在编译时提供类型安全 - 它们只是允许编译器生成更优化的代码(如果遇到意外类型,则会以运行时错误为代价。)

使用完整的静态类型信息来检测编译器可能是可能的,但此时您已经在很大程度上重写了语言,并且您必须在如何处理类型方面做出许多决定和权衡。它真的不再是 Clojure 了。

于 2010-11-17T14:43:02.330 回答
2

与其尝试修改编译器,不如编写一个单独的工具来扫描 Clojure 代码文件并警告类型违规?您可以开发自己的类型表示法,使用只是折叠成普通的无类型 Clojure 代码的宏。但是当您运行静态类型检查器时,它会识别类型并输出警告。

如果您准备迎接更大的挑战,您甚至可以让它执行类型推断,从而降低符号的负担。

于 2011-09-22T12:53:04.030 回答
1

Following up that thread, there is now a project aiming at bringing gradual typing into clojure (like Dart, etc.). Worth testing it : Typed-Clojure

If someone can also give some feedback after real use...

于 2012-12-05T09:51:32.527 回答