Clojure中的类型安全

Clojure中的类型安全,clojure,compiler-errors,static-analysis,type-safety,compilation-time,Clojure,Compiler Errors,Static Analysis,Type Safety,Compilation Time,我想问Clojure上有什么类型的类型安全语言构造 我已经读过Luke VanderHart和Stuart Sierra的《实用Clojure》好几遍了,但我仍然有一个明显的印象,即Clojure(和其他Lisp一样)不太重视编译时验证检查。类型安全只是对正确语义进行编译时检查的一种(非常流行的)策略 我问这个问题是因为我渴望被证明是错的;clojure上有什么样的设计模式可以验证(在编译时,而不是在运行时)一个需要字符串的函数不会被调用,比如整数列表 另外,我也读过像Paul Graham这样

我想问Clojure上有什么类型的类型安全语言构造

我已经读过Luke VanderHart和Stuart Sierra的《实用Clojure》好几遍了,但我仍然有一个明显的印象,即Clojure(和其他Lisp一样)不太重视编译时验证检查。类型安全只是对正确语义进行编译时检查的一种(非常流行的)策略

我问这个问题是因为我渴望被证明是错的;clojure上有什么样的设计模式可以验证(在编译时,而不是在运行时)一个需要字符串的函数不会被调用,比如整数列表


另外,我也读过像Paul Graham这样非常聪明的人公开鼓吹lisp允许在它上面实现从低级语言到其他语言的一切(大多数人会说语言本身正在它上面被重新实现),所以如果这个断言是真的,那么像类型检查这样的琐碎事情应该是小菜一碟那么您是否认为clojure或其他Lisp中存在类型系统(或实现此类类型系统的能力),使程序员能够将验证检查从运行时转移到编译时,甚至更好,转移到设计时?

因为clojure是一种动态语言,所以整个想法不是检查类型(或大部分内容)在编译时

即使向函数添加类型提示,也不会在编译时检查

由于Clojure是一个Lisp,您可以在编译时使用宏做任何您想做的事情,并且宏的功能强大到足以让您编写自己的类型系统。有些人已经为Lisp和Lisp创建了类型系统。这些类型系统可以与“普通”语言中的任何类型系统一样强大


好的,我们现在知道这是可能的,但是Clojure有这样一个可选的类型系统吗?答案目前是否定的,但是有一个逻辑引擎(core.logic)可以用来实现一个类型系统,但是作者还没有工作(到目前为止)在这个方向上。

Clojure中的编译单元非常小—只有一个函数。Lisper在开发时往往会更改运行程序的一小部分。在这种开发风格中引入静态类型检查是有问题的—为了更深入地讨论我为什么推荐post,因此Clojure更喜欢使用借助Lisp高度面向REPL的开发,jive变得更好


这就是说,为Clojure建立一个点菜式系统当然是可取的,也是可能的。这条路是由Qi/Shen和Typed Racket开辟的。这个功能可以很容易地作为一个库提供。我希望将来用core.logic-建立类似的系统。

有一个库添加了可选的类型系统to Clojure

理由

静态类型具有众所周知的优点。例如,静态类型语言可以在编译时尽早捕获许多常见的编程错误。类型还可以作为一种优秀的(机器可检查的)文档形式,几乎总是补充现有的手写文档

没有静态类型检查(动态类型)的语言还带来了其他好处。没有强制静态类型的严格限制,它们可以提供更灵活、更宽容的习惯用法,有助于快速原型设计。随着程序的发展,静态类型检查的好处往往是人们所期望的

这项工作在动态类型语言Clojure中添加了静态类型检查(及其一些好处),同时仍然保留了该语言特有的习惯用法。它允许静态和动态类型代码混合使用,以便程序员可以使用更合适的代码


那么,您是否觉得像您提到的类型系统,让程序员能够将验证检查从运行时转移到编译时,甚至更好,转移到设计时?当然,您可以在编译时使用它,或者甚至在设计时使用IDE,但这不是大多数人想要的clojure开发类型,因此在这方面没有太多进展这个方向。我认为在这些类型系统中,您需要在“验证模式”下运行应用程序来模拟编译阶段,以便在使用错误的参数类型进行调用时进行检查并发送警告?是的,我相信Qi/Shen和Typed Racket都会验证,如果验证失败,则不会编译代码。