我知道这听起来像是对Lisp爱好者(以及其他动态语言爱好者)的亵渎,但是增强Clojure编译器以支持静态(编译时)类型检查有多难?
将静态和动态类型的参数放在一边,这是否可行(不是“这是可行的”)吗?
我在考虑添加一个新的reader宏来强制编译时类型(#^宏的增强版本)并将类型信息添加到符号表中,这将允许编译器标记变量被滥用的位置。例如,在下面的代码中,我期望编译时错误(#*是“编译时”类型的宏):
(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))
#^宏甚至可以与全局变量(*compile-time-type-checking*
)一起使用,以强制编译器进行检查。
对可行性的任何想法?
答案 0 :(得分:10)
一定可能。但是我认为Clojure不会得到任何形式的弱静态类型 - 它的好处太少了。
然而,Rich Hickey曾多次表达他对Qi语言强大,可选和富有表现力的打字功能的喜欢,http://www.lambdassociates.org/qilisp.htm
答案 1 :(得分:7)
这当然是可能的。编译器已经在1.3开发分支中对原始参数类型进行了一些静态类型检查。
答案 2 :(得分:7)
是的!看起来正在进行一个项目core.typed
,以使可选的静态类型检查成为现实。请参阅Github project及其内容
documentation
Ambrose Bonnaire-Sergeant的这项工作grew out of an undergraduate honours dissertation (PDF),与Typed Racket系统有关。
答案 3 :(得分:0)
由于一次只读取和评估一个表单,因此无法使用前向引用使其有限。
答案 4 :(得分:0)
声明可以有类型提示,因此可以声明一个var“是”尚未定义的类型但包含有关结构的数据,但这将非常笨重,你必须先执行它在定义类型之前可以执行的任何代码路径。基本上,您需要预先定义所有用户定义的类型,然后像平常一样使用它们。我认为这使得图书馆写作有些晦涩难懂。
我并不是说早先建议这是不可能的,只是对于用户定义的类型,它比预定义的类型复杂得多。这样做的好处与成本相比应该得到认真考虑。但我鼓励任何有兴趣的人试一试,看看他们是否能让它发挥作用!
答案 5 :(得分:0)
老问题但有两点要点:我不认为Clojure支持读者宏,只支持普通的lisp宏。现在我们有了用于在Clojure中输入的core.typed选项。