【问题标题】:Type safety in ClojureClojure 中的类型安全
【发布时间】:2011-09-13 12:17:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: clojure compiler-errors static-analysis type-safety compilation-time


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那么你觉得像你提到的那些类型系统,让程序员能够将验证检查从运行时偏移到编译时,甚至更好的是设计时?
    • 当然,您可以在编译时使用它,甚至在设计时也可以使用 IDE,但这不是大多数人想要的 clojure 开发,因此在这个方向上没有太大进展。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为在这些类型系统中,您需要在“验证模式”下运行应用程序以模拟编译阶段,以便在使用错误的参数类型进行调用时检查并发送警告?
    • 是的,我相信 Qi/Shen 和 Typed Racket 都会验证,如果验证通过,则不会编译代码。
    【解决方案3】:

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

    http://typedclojure.org/

    基本原理

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2012-03-24
      • 2011-10-26
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多