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

Mai*_*tor 112 lisp scheme clojure common-lisp racket

我知道他们是同一个语言家族的方言,称为lisp,但究竟是什么区别呢?如果可能,您是否可以概述语法,特征,功能和资源等主题.

mik*_*era 94

他们都有很多共同之处:

  • 动态语言
  • 强类型
  • 编译
  • Lisp风格的语法,即代码被编写为Lisp数据结构(表单),最常见的模式是函数调用,如: (function-name arg1 arg2)
  • 强大的宏系统,允许您将代码视为数据并在运行时生成任意代码(通常用于使用新语法"扩展语言"或创建DSL)
  • 常用于函数式编程风格,虽然有能力容纳其他范例
  • 使用REPL强调交互式开发(即您在运行的代码实例中交互式开发)

Common Lisp的特色:

Clojure与众不同的特点:

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

方案特色:

  • @ron:Python**是强类型的,就像Lisp一样(不像Javascript或VB).您正在考虑"静态打字"与"动态打字",请参阅http://en.wikipedia.org/wiki/Type_system了解所有品种.但是,是营销 (16认同)
  • 这很好,但也许你应该提到球拍不仅仅是"正义"计划; 它是一个支持多种(但相关)语言的系统(你甚至可以定义自己的语言).另外,clojure有各种各样的oo类编程方式(多种调度方法与clos类似,而且更接近java,在jvm上效率更高).而且方案正朝着更多标准库(也包括oo)的方向发展,它们支持r6rs. (10认同)
  • “强类型动态语言”就是营销。从这个意义上说,即使是 Python 也是强类型的。 (2认同)
  • 我也认为Racket会很好地被添加到这个答案中.由于社区和语言的重点,我认为Racket比Scheme更容易学习.Racket(以前称为PLT Scheme)是Lisp/Scheme系列中的通用,多范式编程语言.其设计目标之一是作为语言创建,设计和实现的平台. (2认同)

Cos*_*246 47

上面的人错过了一些事情

  1. Common Lisp也有向量和哈希表.不同之处在于Common Lisp对向量使用#()而对哈希表没有语法.我相信Scheme有vector

  2. Common Lisp有读取器宏,允许您使用新的括号(如Racket,Scheme的后代).

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

  4. 所有语言都是现代的或有大量的翻新项目.Common Lisp在过去五年中获得了大量的库(主要归功于Quicklisp),Scheme有一些现代实现(Racket,Chicken,Chez Scheme等),而Clojure是最近创建的

  5. Common Lisp有一个内置的OO系统,虽然它与你可能使用的其他OO系统有很大的不同.值得注意的是,它不是强制-你不具备编写面向对象的代码.

  6. 这些语言有一些不同的设计理念.Scheme被设计为用于理解Actor模型的最小方言; 它后来被用于教育学.Common Lisp旨在统一涌现出来的无数Lisp方言.Clojure是为并发而设计的.因此,Scheme具有最小和优雅的声誉,具有强大和范式无关的Common Lisp(功能,OO,无论如何),以及支持函数式编程的Clojure.

  • 除非兼容模式,否则Racket不是*的一个实现.请参见http://stackoverflow.com/questions/3345397 (4认同)

pau*_*aul 36

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

Scheme和Clojure是Lisp-1:
这意味着变量和函数名都驻留在同一名称空间中.

Common Lisp是Lisp-2:
函数和变量有不同的命名空间(事实上,CL有很多命名空间).