我知道这听起来像是亵渎神灵(以及其他动态语言的爱好者),但是增强Clojure编译器以支持静态(编译时)类型检查的困难是多么困难?

搁置了为静态和动态键入的争论,这是否可以(不是“建议”)?

我当时认为添加一个新的读取器宏来强制编译时类型(#^ Macro的增强版本),并将类型信息添加到符号表中,将允许编译器标记滥用变量的位置。例如,在以下代码中,我期望编译时错误(#*是“编译时”类型宏):

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

#^宏甚至可以使用全局变量重复使用(*compile-time-type-checking*)迫使编译器进行检查。

对可行性有什么想法吗?

有帮助吗?

解决方案

当然有可能。编译器已经进行了一些静态类型,围绕1.3开发分支中的原始参数类型进行检查。

其他提示

可以肯定的是。但是,我认为Clojure不会获得任何形式的弱静态打字 - 好处太少了。

然而,里奇·希基(Rich Hickey)在多次表达了他的强大,可选和表现力的Qi语言的功能, http://www.lambdassociates.org/qilisp.htm

alt text

是的!看起来有一个项目正在进行中, core.typed, ,使可选的静态类型检查现实。看到 Github项目 及其文档

这项工作 从本科荣誉论文(PDF)中成长 由Ambrose Bonnaire-Sergeant作者,与 打字球拍 系统。

由于在一次您无法进行前瞻性引用的时候读取和评估一种表单,因此该表单有限。

古老的问题,但有两个重要的一点:我认为Clojure不支持读者宏,只有普通的LISP宏。现在,我们有核心。输入Clojure的选项。

声明可以具有类型的提示,因此可以声明一个尚未定义但包含有关结构的数据的VAR,但这确实很笨拙,您必须在任何代码路径之前进行此操作那 可以 在定义类型之前执行。基本上,您需要定义所有用户定义的类型,然后像普通一样使用它们。我认为这使图书馆写作有些刺耳。

我并不是要早些时候建议这样做,只是对于用户定义的类型,它比预定义的类型要复杂得多。这样做的好处是应该认真考虑成本。但是我鼓励任何有兴趣尝试的人,看看他们是否可以使它起作用!

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