这是一个后续的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'd VARS的类型。所以,是的,在你的简单的例子,这将是可能的。但是,你是否经常通过文字?少数情况下,在一个真正的程序。

制作类型的“流过”,就像他们在一个真正的静态类型语言做将需要大量的返工量。你必须追踪通过瓦尔类型的信息,动态反弹瓦尔,指针引用,等等,然后你的还是的有拉项目从集合/序列的问题,这意味着泛型化的类型,这是一个巨大的蠕虫可以...

用Clojure类型注释从未打算提供在编译时类型安全 - (。在如果遇到意外的类型运行时错误的代价),他们只是允许编译器产生更优化的代码

全静态类型信息插装编译器是可能的,但在这一点上你已经在很大程度上改写了语言,你将不得不作出的类型是如何处理的许多决策和折衷。这真的不会再的Clojure

其他提示

而不是试图修改编译器,为什么不写一个单独的工具,仅仅扫描Clojure的代码文件,并发出警告类型侵犯?你可以开发自己的类型的符号使用宏,只是收缩到正常的非类型化Clojure的代码。但是,当你运行静态类型检查,它会神交的种类和输出警告。

如果你正在争取一个稍微大的挑战,你甚至可以把它执行这样的类型推断降低符号的负担。

跟进线程,现在有一个项目,旨在将逐步进入打字Clojure的(像飞镖等)。值得测试吧: 类型化的Clojure

如果有人也可以给真正使用后的一些反馈...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top