我应该学习哪种Lisp方言?[关闭]


89

我知道Lisp有几种不同的方言。决定学习Lisp将是一种新的知识体验之后,我想知道该学习哪种Lisp方言,以及为什么。

有没有一个比其他人更受欢迎?它们中的任何一个是否更“完整”,如文档中得到更好的记录和支持?该方言的优缺点是什么?



在问这个问题之前,我对此进行了搜索,但是问题的性质随着我键入它而演变。我将确保不要重新发明轮子。
汉弗莱·鲍格

那么这个问题和上面提到的一个格雷格有什么区别?
cjs

2
我想,他想说的是:当我在脑海中第一次提出问题时,它与当前问题完全不同,并且在相关搜索中查看问题并没有发现任何适合他想要的内容。问。但是,当他输入问题时,它已经变了,因此以目前的形式出现在SO上,这是先前提出的。
J. Polfer,2009年

Answers:


77

您想在简单性和简洁性,吸引人的功能以及一个平台之间找到平衡,该平台将使您能够(自己)编写有趣而有用的软件,并充当学习工具。(这最后一个可以使您继续学习并学习更长的时间。)以下是一些可能性:

  1. 方案。可能是所有方言中最干净的。毫无疑问,为什么将《 The Little Schemer》从LISP译成Scheme。第五个Scheme标准规范R5RS本身就是一个很好的教育;它可能是我读过的最好的语言和库规范,也可能是最全面的最短语言和库规范。该PLT的计划(现在的球拍)平台包括一个相当体面的解释器和编译器,对于脚本好,也有一些可视化工具,使得它非常适合学习。

  2. 普通Lisp。可能是最可移植和最全面的变体,如果您要编写诸如商业软件之类的东西,则很可能是您想要的。该标准定义了广泛的库,还有更多可用的库,它具有CLOS,它可能比任何OO语言都可以教给您更多有关OO的知识,并且其中一些编译器非常出色。缺点包括Scheme所没有的一些缺点(例如为引用函数的变量使用单独的命名空间),不够简洁明了(就像任何必须具有扩展名和做出必要折衷处理的事情一样) (对于现实世界中的大型应用程序而言),没有卫生宏,并且强调递归要比Scheme少得多。

  3. Clojure。它可以在JVM上运行,这可以为Java开发人员提供一站式服务。它有很多缺点(例如,您必须明确要求进行尾部调用优化,尽管如果将TCO添加到JVM,这可能有一天会改变)。宏虽然不卫生,但确实具有一些功能来帮助您避免变量捕获,因此,如果确实需要,则可以捕获变量,而与CL相比,意外捕获的风险较小。您可以轻松访问所有Java库。对于“现实世界”代码而言,这可能是一件好事,而对于学习而言,这毫无意义。它具有一组用于持久数据结构和对STM的支持的库,从并发的角度来看,这非常有趣。这可能是您最好的选择 有兴趣了解更多有关处理并发和并行编程的新方法的信息。似乎Clojure可以像Java在大型生产应用程序中使用一样,从某种意义上说,它可以处理您宁愿不愿做和不愿意做的生产应用程序中的“丑陋事情”在学习时。

  4. Emacs Lisp。就LISP而言,这不是最好的例子之一。其最大的缺点之一是动态范围界定,但还有许多其他缺点。但是,如果您是Emacs用户,则它可能是您可以学习的最强大的工具,可以改善对编辑器的使用。但是,除了学习如何扩展Emacs之外,您从学习Emacs Lisp中真正学到了多少东西,这对我来说是一个开放的问题;我不知道Emacs Lisp中真正使用有趣的技术(例如高阶函数)的频率。

2018更新

自从我写这篇文章以来已经过去了将近十年,而Lisp语言家族现在似乎已在一般程序员意识中获得了很大的吸引力。其中很多似乎与Clojure有关,Clojure不仅本身已成为Lisp的一种适当的独立方言,引入了许多自己的好主意,而且现在具有针对JavaScript的几乎完全相同的版本,并激发了许多其他Lisps针对其他平台。例如,Hy以CPython AST和字节码为目标,首先是为了与Python互操作,而在“有疑问时”使用Clojure思想。(尽管从最近的提交来看,后者可能有所变化。)

这给您的决策过程带来了巨大的变化,那就是您还应该考虑使用哪些Lisps或类似Lisp的语言并与已经使用的语言或平台进行互操作,例如PerlRubyErlangGo甚至是微控制器上的C ++


3
拥有独立的名称空间并不是一个问题,它只是一个不同的设计决策。请记住,Scheme中已经有其他几个名称空间,因此争论的焦点是Lisp-5与Lisp-6。除了可以在CL中将列表称为“列表”和将汽车称为“ car”的便利之外,它的宏系统也更加实用和有用,因为编译器不会轻易使事情变得混乱。
Svante

Clojure没有尾部调用优化,也没有,因为JVM字节码不支持它。它所具有的只是“递归”特殊形式,可以自我递归当前函数。
Svante

3
Curt:我认为Clojure是最可移植的,因为它运行在Java VM上。
justinhj

1
我不知道 如果您排除了无论如何都不会运行未经修改的桌面/服务器程序的小型嵌入式设备(例如电话和智能卡),那么elisp当然可以在比JVM多得多的CPU和平台上运行。
cjs

1
我非常不同意。递归往往会产生以下代码:a)更纯净,b)更易于验证,c)更可能正确。更详细地讲:a)它倾向于较少地接触函数外部的较少变量;b)归纳证明倾向于自然地退出递归函数,而对于循环,则需要检查循环不变式等。c)可靠性来自a),并且您倾向于以一种自然地使您(也许非正式地)从事b)的归纳证明的方式进行编码。
cjs 2014年



8

如今,Clojure也获得了很多关注,这是有充分理由的。出色的数据结构,出色的并发支持(在这方面让Scheme和CL感到遗憾)和一个强大的社区。它也相对简单,CL至少和C ++一样复杂。

这并不是说我不喜欢CL或Scheme。我通过SICP学习了Scheme。CL带我去了Clojure。我想这一切都取决于您的目标。如果您想学习非常实用的Lisp,请选择Clojure。否则,CL或Scheme都很棒。


这似乎意味着CL或Scheme都不是“非常实用的”,而实际上它们却是非常实用的。特别是CL标准是出于实际考虑而诞生的。
Leslie P. Polzer,2009年

2
自1994年以来,编程语言格局发生了变化,我不知道CL标准将如何更改/发展以适应自那时以来所学到的知识。世界正在向前发展,据我所知,CL停滞不前。我喜欢CL,Clojure有某种方法可以发挥其功能,但我看不出CL会如何发展-如果您要使用标准化语言,则必须明确发展道路。没有它,一种语言很可能不是实际的选择。
2009年

4
CL已经发展并且正在通过许多非常有用的库进行发展。1994年,基本语言已经比当今的所有“现代”语言强大。
Svante

5

我更喜欢CL,因为我喜欢面向对象的编程,而CLOS是周围最好的对象系统。


5
说到CL,我会推荐ClozureCL或SBCL。两者都是开源的,有据可查的,成熟的,多平台的,并且提供了至关重要的非标准功能,例如多线程。
Daniel Dickison 09年

5

我在学校学习了Scheme。这是一次很棒的学习经历,我将永远不会忘记函数式编程的基础。只要了解LISP的核心功能-无状态Lambda演算,选择哪个版本的LISP可能都不重要。

这是一篇有趣的文章,介绍了MIT为何在其入门编程课程中从Scheme转向Python


3

我至少要说所有这些。最终,您可能会倾向于使用Scheme或Common Lisp,但是它们两者之间的差异都很大,因此最好能充分利用其中的所有内容。

例如,Scheme有延续,即使可以在Common Lisp中实现它们,也很高兴了解Scheme中的内容。

了解词法作用域和动态作用域之间的区别非常重要,如果您同时学习Common Lisp和elisp,那么您会发现两者的含义。


0

LFE(Lisp风味Erlang)会很好。您可以在Erlang VM上使用lisp语法。


0

首先是一个“已加载”的问题,但OP可能对此一无所知。通常,Common和Scheme lispers就像PC和Apple计算机的“人”,它们不会混合在一起。哪一个是最好的可能与哪个“对您有用”无关。真的,没有太大的区别。优先选择一个可能会影响您首先学习哪个。(对我来说,一个空列表应该是“ nothing”,在CL中称为NIL,这使我很普通。)我喜欢使用EMACS将SBCL与Slime集成在一起,但是SBCL并不适合所有人。一方面,SBCL非常严格。如果您只是想“玩得开心”,那么GNU简报就很容易而且几乎适用于所有平台。

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.