18

我想问一下 Clojure 上有哪些类型的安全语言结构?

我已经多次阅读 Luke VanderHart 和 Stuart Sierra 的“实用 Clojure”,但我仍然有明显的印象,即 Clojure(像其他 lisps 一样)并没有非常重视编译时验证检查。类型安全只是对正确语义进行编译时检查的一种(非常流行的)策略

我问这个问题是因为我渴望被证明是错误的;clojure 上有哪些设计模式可用于验证(在编译时,而不是在运行时)期望字符串的函数不会被调用,例如整数列表?

另外,我读过像 Paul Graham 这样非常聪明的人公开提倡 lisp 允许在其之上实现来自低级语言的所有内容(大多数人会说该语言本身正在其之上重新实现),所以如果那个断言会是真的,那么像类型检查这样的琐碎事情应该是小菜一碟。那么你是否觉得在 clojure 或其他 lisps 中存在类型系统(或实现此类类型系统的能力),这使程序员能够将验证检查从运行时偏移到编译时,甚至更好的设计-时间?

4

3 回答 3

21

Clojure 中的编译单元非常小——一个函数。Lispers 倾向于在开发过程中更改正在运行的程序的一小部分。在这种开发风格中引入静态类型检查是有问题的——为了更深入地讨论为什么我推荐Gilad Bracha 的文章 Types are Anti-Modular。因此,Clojure 更喜欢与 Lisp 高度面向 REPL 的开发配合得更好的前置/后置条件。

也就是说,为 Clojure 构建一个点菜类型的系统当然是可取的,也是可能的。Qi/Shen 和 Typed Racket 开辟了这条道路。这个功能可以很容易地作为一个库提供。我希望将来使用 core.logic 构建类似的东西 - https://github.com/clojure/core.logic

于 2011-06-13T01:39:30.077 回答
4

由于 Clojure 是一种动态语言,因此整个想法不是在编译时检查类型(或大部分内容)。

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

由于 Clojure 是一个 Lisp,你可以在编译时使用宏做任何你想做的事情,而且宏足够强大,你可以编写自己的类型系统。有些人为 lisps Typed RacketQi制作了类型系统。这些类型系统可以与“普通”语言中的任何类型系统一样强大。

好的,我们现在知道这是可能的,但是 Clojure 有这样一个可选的类型系统吗?答案目前是否定的,但有一个逻辑引擎 (core.logic) 可用于实现类型系统,但作者尚未朝那个方向工作。

于 2011-06-12T19:46:14.593 回答
2

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

http://typedclojure.org/

基本原理

静态类型有众所周知的好处。例如,静态类型语言尽可能早地捕获许多常见的编程错误:编译时。类型也是一种极好的(机器可检查的)文档形式,几乎总是可以扩充现有的手写文档。

没有静态类型检查(动态类型)的语言带来了其他好处。如果没有强制静态类型的严格刚性,它们可以提供更灵活和宽容的习惯用法,有助于快速原型设计。随着程序的增长,通常需要静态类型检查的好处。

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

于 2016-11-23T03:29:41.327 回答