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


120

我知道它们是同一种叫做lisp的语言的方言,但是到底有什么区别呢?如果可能的话,能否概述一下语法,特性,功能和资源等主题。


3
我要求对这些差异进行更一般的概述,因为我觉得这个问题可能对其他许多人有用,如果听起来很侮辱,我感到抱歉。
MaiaVictor 2012年

4
我总是对哪个职位应该去哪里感到困惑。这是关于工具的讨论,因此对于这里还是程序员来说是一个问题吗?从逻辑上讲,我想将其移交给程序员,因为它并不是要解决特定的问题,但这是一篇不错的文章,恕我直言。
octopusgrabbus 2012年

1
@octopusgrabbus:这个问题太广泛了。在“语法,特征,功能和资源”方面比较三种编程语言可以轻松地填充书籍或网站。Stackoverflow适用于有编程问题的人,它不是百科全书(Wikipedia),也不是一般讨论论坛(Usenet),也不是语言比较站点(rosettacode.org)。对于真正的编程问题,问题也是有代码,答案也有代码是最好的。另外:不要仅仅因为某人无聊或那是一种爱好而弥补问题。
Rainer Joswig 2012年

3
仅仅因为问题很广泛并不意味着它不属于这里。这是一个非常明确的问题,并且肯定是一个“真正的编程问题”。StackOverflow的主要目的是成为一个[googleable]社区资源,用于通过问答格式共享有关编程的知识。
丹·伯顿

@RainerJoswig,我可以将过去几天学习的关于这些语言的一切都写在我身上,但这会使线程很大。当您意识到人们会使用这种简短的句子并无法获得答案时,这真的很糟糕,因为大文本阻碍了他们快速理解所要询问的内容。这样可以确保一个好的答案会帮助更多的人。
MaiaVictor 2012年

Answers:


103

它们都有很多共同点:

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

Lisp的共同特色:

Clojure的独特功能:

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

方案特色:


11
这很好,但是也许您应该提到球拍不仅仅是“公正”的计划;这是一个支持多种(但相关)语言的系统(您甚至可以定义自己的语言)。同样,clojure具有多种执行oo式编程的方式(一种多派发方式与clos相似,而与java更加接近,在jvm上更有效)。并且该方案正在逐步发展为具有球拍支持的r6rs的标准库(也包括oo)。
安德鲁·库克

2
“强类型动态语言”是市场营销。从这个意义上说,甚至Python都是强类型的。
罗恩

16
@ron:Python 强类型的,就像Lisp一样(不像Javascript或VB)。您正在考虑使用“静态类型”与“动态类型”,有关所有品种,请参见en.wikipedia.org/wiki/Type_system。但是,是的,这是营销
Nas Banov 2013年

2
我还认为将Racket添加到此答案中会很好。由于语言的社区性和重点,我认为Racket比Scheme更容易学习。Racket(以前称为PLT Scheme)是Lisp / Scheme系列中的一种通用多范式编程语言。它的设计目标之一是充当语言创建,设计和实现的平台。
mtelesha 2015年

Clojure具有卫生宏。这里更多的信息:xivilization.net/~marek/blog/2013/09/17/...
克里斯托弗Kuttruff

50

上面的人错过了几件事

  1. Common Lisp也具有向量和哈希表。区别在于Common Lisp对向量使用#(),对哈希表不使用语法。我相信Scheme有矢量

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

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

  4. 所有语言都是现代的,或者有大量的翻新项目。在过去的五年中,Common Lisp已获得了广泛的库(主要感谢Quicklisp),Scheme具有一些现代化的实现(球拍,鸡肉,Chez方案等),而Clojure是相对较新的创建的

  5. Common Lisp具有内置的OO系统,尽管它与您可能使用过的其他OO系统完全不同。值得注意的是,它不是强制-你不具备编写面向对象的代码。

  6. 这些语言有一些不同的设计理念。Scheme被设计为了解Actor模型的最小方言;后来被用于教学法。普通Lisp旨在统一大量涌现的Lisp方言。Clojure专为并发而设计。结果,Scheme的名声是极简和优雅,Common Lisp的功能强大且与范式无关(功能,OO,无论如何),而Clojure则偏爱功能性编程。


4
除非兼容模式,否则球拍不是 Scheme的实现。请参阅stackoverflow.com/questions/3345397
错误

Clojure中并没有有卫生宏,因为我已经找到了艰辛的道路。
pyon

40

不要忘记Lisp-1和Lisp-2的差异。

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

Lisp 2是常见的Lisp:
函数和变量具有不同的名称空间(实际上,CL有许多名​​称空间)。


-4

Gimp用Scheme编写:)

实际上,有些人认为可能用C ++编写的软件分配可能是在Lisp的保护下完成的,很难从一堆中挑选出金苹果。事实是C ++并不总是很流行,由于更新的历史,它似乎直到今天才流行。在本世纪下半叶,C ++甚至没有利用多线程,这就是今天的Python成为无用的未经测试的错误胶合代码的源泉。快一点,现在我们看到函数式编程的兴起,它更像是适应或消亡。我认为Java就适应部分而言是正确的。

Scheme旨在简化Lisp语言,这只是它的初衷,除非它从未真正流行。我认为Clojure做了一些类似的事情,旨在简化JVM的Scheme。就像其他所有JVM语言一样,它可以提高用户体验,只是简化了Java语言的编写样板。


2
“只不过是要简化JVM的Scheme”“就像其他所有JVM语言一样”是的。
oskarkv

4
Gimp用C编写,它支持Scheme,Python和Perl作为脚本语言。
lbalazscs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.