这是关于Clojure静态输入的my previous question的后续行动。
我浏览了编译器的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))
感谢。
答案 0 :(得分:3)
问题是编译器不跟踪def
'd变量的类型。所以是的,在你的简单例子中,它是可能的。但是你多久传一次文字?很少,在一个真正的计划中。
使类型“流经”就像在真正的静态类型语言中那样,需要进行大量的重写。你必须通过变量跟踪类型信息,动态反弹变量,解除引用等等。然后你仍然有从集合/序列中拉出项目的问题,这意味着泛化类型,这是一个巨大可以蠕虫......
Clojure中的类型注释从不打算在编译时提供类型安全性 - 它们只允许编译器生成更优化的代码(如果遇到意外类型则以运行时错误为代价。)
使用完整的静态类型信息检测编译器可能是可能的,但此时您已经在很大程度上重写了该语言,并且您将不得不在如何处理类型方面做出许多决定和权衡。它真的不会是Clojure了。
答案 1 :(得分:2)
为什么不编写一个单独的工具来扫描Clojure代码文件并警告类型违规,而不是尝试修改编译器?您可以使用宏折叠成正常的无类型Clojure代码来开发自己的类型表示法。但是当你运行静态类型检查器时,它会查看类型并输出警告。
如果你想接受更大的挑战,你甚至可以让它进行类型推断,从而减轻记法的负担。
答案 2 :(得分:1)
跟进该线程,现在有一个项目旨在将逐渐打字变成clojure(如Dart等)。值得测试一下: Typed-Clojure
如果有人也可以在实际使用后给出一些反馈......