这是 my previous question 的后续内容关于 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))
谢谢。
最佳答案
问题是编译器不跟踪 def
的变量的类型。所以是的,在你的简单例子中,这是可能的。但是您多久传递一次文字呢?在实际的程序中很少见。
使类型像在真正的静态类型语言中那样“流动”将需要大量的返工。您必须通过变量、动态反弹变量、取消引用等来跟踪类型信息。然后,您仍然会遇到从集合/序列中提取项目的问题,这意味着泛型类型,这是一个巨大的蠕虫......
Clojure 中的类型注释从来都不是为了在编译时提供类型安全 - 它们只是允许编译器生成更优化的代码(如果遇到意外类型,则会出现运行时错误。)
用完整的静态类型信息来检测编译器可能是可能的,但那时您已经很大程度上重写了语言,并且您必须在如何处理类型方面做出许多决定和权衡。它真的不再是 Clojure。
关于Clojure 静态类型,第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204629/