我想问Clojure上有什么类型的安全语言构造?
我已经读过Luke VanderHart和Stuart Sierra的《实用的Clojure》好几遍了,但我仍然有一个明显的印象,那就是Clojure(和其他lisp一样)没有非常认真地对待编译时的验证检查。类型安全只是对正确语义进行编译时检查的一种(非常流行)策略
我问这个问题是因为我渴望被证明是错的;clojure上有什么样的设计模式可以验证(在编译时,而不是在运行时)一个期望字符串的函数没有被调用,比如说,一个整数列表?
此外,我读到过像Paul Graham这样非常聪明的人公开主张lisp允许在其之上实现从低级语言到其他语言的一切(大多数人会说,语言本身正在其之上重新实现),所以如果这个断言是真的,那么像类型检查这样的琐碎的事情应该是小菜一碟那么,您是否认为clojure或其他lisp中存在类型系统(或实现此类类型系统的能力),使程序员能够将验证检查从运行时偏移到编译时,甚至更好的是,偏移到设计时
Clojure中的编译单元非常小,只有一个函数。Lispers倾向于在开发过程中更改运行程序的一小部分。在这种开发风格中引入静态类型检查是有问题的——为了更深入地讨论为什么我推荐吉拉德·布拉查的帖子《类型是反模块的》。因此,Clojure更喜欢前置/后置条件,这与Lisp高度面向REPL的开发更为吻合。
也就是说,为Clojure构建一个点菜式系统当然是可取的,也是可能的。这条路是齐/沈和Typed Racket开辟的。这个功能可以很容易地作为库提供。我希望将来能用core.logic-https://github.com/clojure/core.logic.
由于Clojure是一种动态语言,所以整个想法是在编译时不检查类型(或任何东西)。
即使在函数中添加类型提示,它们在编译时也不会被检查。
由于Clojure是一个Lisp,您可以在编译时使用宏做任何您想做的事情,而且宏功能强大,您可以编写自己的类型系统。有些人为lisps Typed Racket和Qi制作了打字系统。这些类型系统可以与"系统"中的任何类型系统一样强大;正常的";语言
好的,我们现在知道这是可能的,但是Clojure有这样一个可选的类型系统吗?目前的答案是否定的,但有一个逻辑引擎(core.local)可以用来实现类型系统,但作者还没有朝着这个方向努力。
有一个库为Clojure、添加了一个可选的类型系统
http://typedclojure.org/
原理
静态类型有众所周知的好处。例如,静态类型语言会在编译时发现许多常见的编程错误。类型也是一种优秀的(机器可检查的)文档形式,几乎总是对现有的手写文档进行扩充。
没有静态类型检查(动态类型化)的语言带来了其他好处。如果没有强制性静态类型的严格刚性,它们可以提供更灵活和宽容的习惯用法,从而有助于快速原型设计。随着程序的发展,通常需要静态类型检查的好处。
这项工作为Clojure(一种动态类型语言)添加了静态类型检查(及其一些好处),同时仍然保留了该语言的习语。它允许静态和动态类型的代码混合使用,这样程序员就可以使用更合适的代码。