Clojure、 Scheme/Racket 和 Common Lisp 有什么区别?

我知道它们属于同一语系的方言,叫做 lisp,但是它们到底有什么不同呢?如果可能的话,您能否给出一个概述,包括语法、特征、特性和资源等主题。

40184 次浏览

它们都有很多共同点:

  • 动态语言
  • 强力打印
  • 编译完毕
  • Lisp 风格的语法,即代码是以 Lisp 数据结构(表单)的形式编写的,最常见的模式是函数调用,如: (function-name arg1 arg2)
  • 强大的宏系统,允许您将代码视为数据,并在运行时生成任意代码(通常用于使用新语法“扩展语言”或创建 DSL)
  • 通常在函数式编程风格中使用,尽管具有适应其他范例的能力
  • 强调使用 REPL 进行交互式开发(即在代码的运行实例中进行交互式开发)

Common Lisp 的显著特点:

Clojure 的显著特点:

  • 最大的库生态系统,因为您可以直接使用任何 Java 库
  • 矢量 []和地图 {}作为标准使用,除了标准列表 ()-除了矢量和地图的一般用途一些人认为这是一个创新,使一般更容易阅读
  • 更加强调不可变性和懒惰的函数式编程,这在一定程度上受到了 Haskell 的启发
  • 语言层面的软件事务内存支持强大的并发能力(值得关注: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)

计划特色:

不要忘记 Lisp-1和 Lisp-2的区别。

Scheme 和 Clojure 是 Lisp-1:
这意味着变量名和函数名都驻留在相同的命名空间中。

Common Lisp 就是 Lisp-2:
函数和变量有不同的名称空间(实际上,CL 有许多名称空间)。

上面的人漏掉了一些东西

  1. Common Lisp 也有矢量和散列表。区别在于 Common Lisp 对矢量使用 # () ,而对散列表没有语法。我相信计划有向量

  2. Common Lisp 有读宏,允许使用新的括号(就像 Scheme 的后代 Racket 一样)。

  3. Scheme 和 Clojure 有卫生的宏,而 Common Lisp 有不卫生的宏

  4. 所有的语言要么是现代的,要么有广泛的改造项目。Common Lisp 在过去的五年中得到了广泛的库(主要归功于 Quicklisp) ,Scheme 有一些现代的实现(Racket、 Chicken、 Chez Scheme 等) ,而 Clojure 是最近才创建的

  5. Common Lisp 有一个内置的面向对象系统,尽管它与您可能使用过的其他面向对象系统有很大的不同。值得注意的是,它并没有强制执行——您不需要 来编写 OO 代码。

  6. 这两种语言的设计理念略有不同。Scheme 被设计成理解演员模型的最小方言,后来被用于教学。Common Lisp 被设计用来统一出现的大量 Lisp 方言。Clojure 是为并发性而设计的。因此,Scheme 有着极简和优雅的美誉,Common Lisp 有着强大的功能和范式无关性(函数式、面向对象等等) ,而 Clojure 有着支持函数式编程的美誉。

Gimp 是用 Scheme:)编写的

事实上,很多人认为可能是用 C + + 编写的软件很可能是在 Lisp 的保护伞下完成的,很难从中找出金苹果。事实上,C + + 并不总是流行,它之所以流行是因为它有更新的历史。在这个世纪的后半叶,C + + 甚至没有利用多线程,而是让 Python 成为了一堆没有用的、未经测试的错误粘合代码。稍微快进一点,现在我们看到函数式编程的兴起,它更像是适应或者死亡。我认为 Java 在适应部分是正确的。

Scheme 的设计目的是简化 Lisp 语言,这是它唯一的意图,除了它从来没有真正流行起来。我认为 Clojure 做了一些类似的事情,仅仅是为了简化 JVM 的 Scheme。它就像其他任何 JVM 语言一样,只是为了增加用户体验,只是为了简化 Java 中的编写样板文件。