23

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

撇开支持和反对静态和动态类型的论点,这可能吗(不是“这是可取的”)?

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

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

#^ 宏甚至可以与全局变量 ( *compile-time-type-checking*) 一起使用,以强制编译器进行检查。

对可行性有任何想法吗?

4

6 回答 6

10

这肯定是可能的。但是我不认为 Clojure 会得到任何形式的弱静态类型——它的好处太少了。

然而,Rich Hickey 多次表达了他对 Qi 语言强大、可选和富有表现力的打字功能的喜爱,http://www.lambdassociates.org/qilisp.htm

替代文字

于 2010-11-15T14:07:21.923 回答
7

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

于 2010-11-15T13:47:43.200 回答
7

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

这项工作源于Ambrose Bonnaire-Sergeant 的本科荣誉论文 (PDF),与Typed Racket系统有关。

于 2013-03-19T18:51:19.180 回答
0

由于一次读取和评估一个表格,因此您不能有前向引用,这在一定程度上受到限制。

于 2010-11-15T13:30:53.360 回答
0

declare 可以有类型提示,因此可以声明一个“是”尚未定义但包含有关结构数据的类型的 var,但这确实很笨重,您必须在任何代码路径之前执行此操作可以在定义类型之前执行。基本上,您会希望预先定义所有用户定义的类型,然后像往常一样使用它们。我认为这使图书馆写作有些骇人听闻。

我之前并不是要暗示这是不可能的,只是对于用户定义的类型,它比预定义的类型要复杂得多。这样做的好处与成本是应该认真考虑的。但我鼓励任何有兴趣的人尝试一下,看看他们是否能成功!

于 2010-11-15T15:30:43.063 回答
0

老问题,但有两个重点:我不认为 Clojure 支持阅读器宏,只支持普通的 lisp 宏。现在我们有了用于输入 Clojure 的 core.typed 选项。

于 2013-10-17T16:38:59.340 回答