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

我知道他们是同一种叫lisp的语言家族的方言,但究竟有什么不同呢? 如果可能的话,你能否给出一个概述,包括语法,特性,特性和资源等主题。

他们都有很多共同之处:

  • dynamic语言
  • 强types
  • 编译
  • Lisp风格的语法,即代码被编写为一个Lisp数据结构(forms),最常见的模式是函数调用,如: (function-name arg1 arg2)
  • function强大的macros系统,允许您将代码视为数据,并在运行时生成任意代码(通常用于“用新语法扩展语言”或创buildDSL)
  • 经常用在函数式编程风格上,虽然有能力适应其他范式
  • 强调与REPL交互式开发(即,您在代码的运行实例中交互式开发)

Common Lisp的特点:

Clojure特色:

  • 最大的图书馆生态系统,因为你可以直接使用任何Java库
  • 除了标准列表()之外,作为标准的vector[]和映射{}除了vector和映射的一般有用之外,还有一些人认为这是一种创新,它通常更具可读性
  • 更强调不变性和懒惰的函数式编程,有点受到Haskell的启发
  • 软件事务内存支持强大的并发能力(值得关注: http : //www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

计划特色:

上面的人错过了一些事情

  1. Common Lisp也有vector和散列表。 不同之处在于Common Lisp使用#()作为向量,没有使用哈希表的语法。 计划有载体,我相信

  2. Common Lisp有阅读器macros,它们允许你使用新的括号(就像Scheme的后代Racket一样)。

  3. Scheme和Clojure具有卫生macros,而Common Lisp不卫生

  4. 所有的语言要么是现代的,要么是大规模的翻新工程。 Common Lisp在过去的五年中已经获得了大量的图书馆(主要归功于Quicklisp),Scheme有一些现代的实现(球拍,鸡,Chez Scheme等),并且Clojure最近被创build

  5. Common Lisp有一个内置的面向对象系统,尽pipe它与你可能使用的其他面向对象系统是完全不同的。 值得注意的是,它不是强制执行 – 你不必写OO代码。

  6. 这些语言有不同的devise理念。 Scheme被devise为理解Actor模型的最小方言; 它后来被用于教育学。 Common Lisp旨在统一涌现出的无数Lisp方言。 Clojure是为并发而devise的。 因此,Scheme具有最小和优雅的声誉,Common Lisp具有强大的function和范式不可知性(function,OO等等),而Clojure则支持函数式编程。

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

Scheme和Clojure是Lisp-1:
这意味着variables和函数名称都位于相同的名称空间中。

Common Lisp是Lisp-2:
函数和variables有不同的名字空间(实际上,CL有很多名字空间)。

GIMP是写在计划:)

事实上,一些人认为可能用C ++编写的软件可能是在Lisp的保护下完成的,很难从中挑出金苹果。 事实上C ++并不总是受欢迎,因为更新的历史,它似乎只是stream行起来。 对于本世纪不到一半的人来说,C ++甚至都没有使用multithreading,而现在Python已经成了无用的,未经testing的有问题的胶水代码的地方。 稍微快一点,现在我们看到函数式编程的兴起,更像是适应或死亡。 我认为就适应性而言,Java是正确的。

Scheme旨在简化Lisp语言,这是它唯一的意图,除了它从未真正被捕获。 我认为Clojure做了类似的事情,简化了JVM的Scheme。 它就像其他的JVM语言一样,只是为了增加用户体验,简化了Java领域的样板文件。