我应该学习哪个Lisp?[关闭]


71

我应该学习哪个Lisp(方言),为什么?

CL和Scheme之间的碎片化减慢了吸收速度(至少对我而言!)。

因此,请给我“真实答案”!

我已经尝试阅读功能比较,它们似乎陷入了esoterica(我不完全了解)的困境,例如方言是否完全尾部递归等。我希望大家(共同)可以使不透明的差异变得清晰。

我喜欢的东西

良好的库支持,良好的环境和Unicode支持。

我不喜欢的事

火焰战。一开始有用的功能,但会干扰长期学习。


更新

  1. 我一直在使用MzScheme,一旦获得了readline支持,我会感觉很好。我没有在Unix上运行GUI,因此对我来说这似乎是一个不错的环境选择。

  2. 我也很高兴Clojure在debian上易于安装.deb软件包,因此更容易使用。这是一个巨大的胜利。尽管下面有些人很容易发火,但进入门槛低仍然是一个胜利。我喜欢被人喂。

  3. 在阅读了很多SICP之后,我确实更好地了解了尾递归的问题。


一个deb包要安装吗?我当然希望它是1.0版本,否则,您可能正在使用一些古老的东西。我没有从svn上获取任何东西,输入“ ant build”会给进入带来很大障碍。更不用说从1.0版本开始,除非您希望拥有最前沿的功能,否则没有理由从svn中删除任何东西。
Rayne 2009年

好吧,欢迎您自己决定什么是进入障碍。我不使用Java,也不知道它的构建系统。我没有安装蚂蚁。事实证明,它是1.0.0。我不知道您为何如此密切地关注这个话题,或者为什么您想继续侮辱我和我的观点。它不会使Clojure对您的拥护者更具吸引力。
Gregg Lind Lind),

6
一年后回到这个话题,我可以在这里看到自己的声音。我想为这个听起来很抱歉。我认为我们只是不同类型的编码员。另外,我想您会发现,创建了Leiningen,Cake和Cljr之类的东西后,Clojure的情况有了很大的改善。再次抱歉,我听起来很冒犯。我向你保证,我的意图是纯粹的。
雷恩(Rayne)2010年

雷恩,承认这种事情需要很多东西!我不确定我们之间有什么不同,但是我的时间有限,如果归结为这一点,如果技术更友好,我将更可能使用它。
Gregg Lind 2010年

尾递归“ esoterica”?它forwhile命令式语言中的and循环并不陌生。
new123456 2011年

Answers:


64

Clojure是Lisp积极发展的现代方言。它基于JVM,因此所有Java库都可立即使用,因此也具有Unicode支持。

这是一种选择,而不是唯一的答案。


10
但是它被JVM毫无希望地阻碍了。您如何将LISP称为非尾递归语言?
哈维尔

3
Common Lisp也不尾递归。我同意尾递归是好的。我正在研究一种与Clojure精神类似但在Python中托管的Lisp方言:ghewgill.livejournal.com/tag/psil了解更多信息。
Greg Hewgill

9
Javier,Clojure有一个recur(只能出现在尾部位置),可以给您一个尾部调用,您可以自然地用它来表达递归函数。我见过有人抱怨的JVM障碍:没有未签名的类型
ayrnieu

9
JVM对Clojure的功能至关重要,它不受任何限制。
雷恩

5
关于Clojure的另一条评论。Clojure是一个“实用的”,固执己见的Lisp。实用,因为使用JVM可以扩展到当今最大的回声系统。图书馆的支持令人震惊。并且这些论文非常成熟,广泛并且具有生产质量。很少有echosystem可以比较。之所以这么认为,是因为Clojure具有不变性,并且不惜一切代价避免OOP。这很有趣而且很好。但是您有时会发现它很烦人。这可能不是您的一杯茶。从学习的角度来看,Clojure可能不是最好的选择。但这无疑是使它变得专业的最佳方法之一。
Nicolas Bousquet

34

如果您想避免烈火,并且喜欢图书馆,请选择Clojure。它很小,速度很快,社区是有帮助的,没有教条。它是Lisp减去1980年代荒谬的残骸。它具有BDFL,如果您有个好主意,那么该语言将有很大的机会实现它。

我玩过Common Lisp,这是一件很美好的事情。我已经完成了DrScheme的SICP的前三章和Metacircular Evaluator,这也是一件很漂亮的事情。当然,您将从这些知识中受益匪浅。

但是,随着时间的流逝,我开始使用心爱的小语言。我不会撒谎,我爱Javascript,也爱C(如果每种语言的核心都没有C核心,那就该死了),因为它们很小。

Clojure很小。优雅 这是我们时代的语言。


80年代的荒谬之处是什么?
X10D

20

只是选择一个,并学习它。当您找出差异时,如果您第一次选择不当,您将可以再次选择。


我认为这是一个很好的答案。但是您不必走那么远就学习一门完整的语言。我对Scheme有足够的了解,以至于我对它不满意。Common Lisp更像是我的风格,但并没有使我脱离Perl。如果您想学习语言,则不会只选择一种。
乔恩·埃里克森

19

Clojure是LISP的一种很好的方言,它可以促进函数式编程。它在JVM上运行,因此您可以访问可能习惯使用的所有Java库。该站点上有大量文档和截屏视频可以帮助您学习。另一个优点是,与许多其他方言不同,它非常易于安装。

如果您只是想了解概念,Emacs(特别是EmacsLISP)是另一种选择。它附带了令人难以置信的文档,教程和许多代码示例。截屏视频也很容易找到。Emacs的一大优点是该编辑器是用LISP编写的,因此该编辑器自然对运行,编辑和调试LISP具有很好的支持。此外,您可以扩展编辑器,以使学习LISP时的日常文本编辑工作变得更加轻松。


18

Contra Chuck,Common Lisp的一个优点是它具有一个坚持实施并为之奋斗的标准,因此您可以使用SBCL进行大量开发(具有出色的类型检查和推断功能),然后例如部署为与C库(带有ECL或其他),或作为.jar使用Java库(带有ABCL),或者与Mac或Windows本地GUI(两者均使用Clozure)。Common Lisp在各种体系结构,实现和时间上具有惊人的可移植性,Common Lispers在语言的支持下努力保持这种状态。例如,一个不规范的行为的愚蠢的分歧是问题“这是一个特殊的变量吗?” 所以我回答了我使用的所有实现:

#-abcl
(defun special-variable-p (symbol)
  #+ecl(si:specialp symbol)
  #+ccl(proclaimed-special-p symbol)
  #+sbcl(equal '(:special t)
               (multiple-value-list-int:info :variable :kind symbol)))

这样,在读取时,在ABCL(已经有)上,(defun special-variable-p (symbol) (si:specialp symbol))在ECL上等等都减少了。因此,我可以将其放在我的.rc文件中,并在REPL中使用通用功能。但这不是很重要:这不是线程各种支持的网络,也不是通信顺序流程库#+sbcl/#-sbcl即使在五个实现上运行,最后一个示例也只有一个。因为它依赖于已精心移植的代码。

但是,允许这种(和其他)优势的因素也给学习者带来了挑战:Common Lisp是一门非常大的语言。像我Clojure一样,这不是一两个星期就可以lur住的东西(但是随着即将推出的重大更改,我的Clojure已经开始腐烂了-这种语言虽然有其自身的优点,但却使我想起了对比)因此,您应该阅读本页面的很多内容,M-x hyperspec RET do-symbols RET并不要通过按键来输入HyperSpec(对我而言,这很接近圣经。),然后考虑购买几本书。我有实用的Lisp实用程序,刚刚获得了Lambda的让步,现在将很快购买PAIP

但是,即使Common Lisp是正确的答案,您也不会通过“仅选择”一些具有欺骗性的浮华替代方法(-“具有欺骗性”,因为Commonplace CL并没有向您展示其宏可以做的所有事情)完全浪费您的时间。拥有比任何人都更多的宏。通常的比较是在错误的CL和语法优化的替代X之间进行。您仍将学习基础知识,仍然可以使用在SICP,Lisp,The Little Schemer等中阅读的大部分内容。Lisp ,即使是错误的Lisp,仍然比非Lisp更好。(但是,您将花费一些时间在错误的Lisp中实现正确的Lisp的一部分,这很糟糕。)Meta-Greenspun。)


1
如何放任Lambda?我一直在考虑在不在线的其余章节中购买该软件。
2009年

我会告诉你。到目前为止,我所做的只是浏览了第四章。
ayrnieu

好。我不得不思考一会儿,尝试回忆起我开发的早期阶段,并重读其他书籍以求公平。但缺席:LOL是最好的。该书在第一章的第一部分以斜体字画了一个针对宏的“风格格言”的目标。
ayrnieu

谢谢您,我订购了一份!
格雷格·休吉尔

感谢天哪,#+和#-。没有它们,访问CLI参数和任何其他POSIX行为几乎是不可能的。rosettacode.org/wiki/ScriptedMain#Common_Lisp
mcandre,2011年

9

Lisp的最大问题是,没有所有人都坚持的最重要的标准。您不必只在Common Lisp和Scheme之间进行选择。您必须在Common Lisp的几个不兼容的实现与Scheme的几个不兼容的实现之间进行选择,以及其他一些小东西,例如Arc和Clojure。

我建议从MzScheme开始。它很流行,它是积极开发的,它具有提供现代编程环境功能的许多库,并且Scheme比Common Lisp更为简单(当然,更好,只是更简单)。


Common Lisp是一个标准。各种RSx计划标准也是如此。我最不喜欢DrScheme的是它的标准对象模型。
弗里德里希(Friedrich)


6

和Clojure一起去。这是一种了不起的语言,可以完全访问任何Java库。它已经进行了仅仅两年的开发,并且已经开发了3个IDE插件,并将于4月出版一本书。它非常快速,非常优雅和美丽。Clojure不会出错。


5

对我而言,方案的基础理论更具说服力。到目前为止,PLTScheme是我发现的最活跃的LISP。不幸的是,它的打字泛滥掩盖了Lisp的美丽。

我很想看到诸如arc之类的东西成功,但似乎不太可能。



4

猜想:学习第一个Lisp时,不要学习最终将用于最终开发的一个。

引理:学习弧。Lisp中的所有“难以理解”的事情-闭包,宏,延续,都没有Clojure的Java互操作性复杂性,CL的名称空间混乱或Scheme的名称碎片。如果您有专心致志,则可以在周末学习所有这些内容。如果您敏锐而专注,那就在夜晚。

而且它会让学习所有其他的Lisp一个很多更容易。


4

我不了解Lisp,但是这就是为什么我认为PLT Scheme是一个不错的选择:

  1. 真正好的文档
    http://download.plt-scheme.org/doc/html/

  2. DrScheme
    DrScheme是一个了不起的编程环境,它带有编译器,步进器,语法检查器,REPL,多种语言支持,并且可扩展。这使整个体验变得有趣。看一些截图

  3. 社区的良好支持。
    社区对他们的语言非常热情,也非常支持。如果您有任何疑问,可以使用邮件列表,论坛和论坛。甚至作者都非常方便。

  4. 持续研究
    PLT非常活跃,并将继续使其工具变得越来越好。您可以期待实验室中的许多创新。例如。我很高兴使用此工具:http : //blog.plt-scheme.org/2009/05/typed-scheme-20.html

  5. 免费书籍和有趣的教程可以帮助您入门。
    http://www.htdp.org/
    http://world.cs.brown.edu/

  6. 好的模块和丰富的库。
    http://www.cs.utah.edu/plt/develop/
    http://planet.plt-scheme.org/ 另请参阅文档

如果您正在学习Scheme,请尝试尝试DrScheme


3

您知道...当我对Lisp感兴趣时,我还以为我必须选择。然后,在阅读和询问很多之后,我最终选择了Common Lisp。不是因为它绝对比Scheme更好,而是因为它具有我知道在未来2-3年中可能会在我的项目中使用的功能:

  • 一个非常高效的数值计算编译器(SBCL),
  • 条件系统和...
  • 我必须承认,SLIME在这一决定中也发挥了重要作用。:-)

所以如果我是你,我将开始学习每种语言的一小部分,并找出相对的优势和劣势(我的意思是,那些与您最需要/最想做的事情有关)你我可以选一个。您可能会发现自己稍后也会学习另一种语言(发生在我身上–一年学习Common Lisp之后,我不得不学习更多Scheme)

至于Arc,Clojure和Lush,不知道这些。我想同样的论点也可能适用于他们。。。我不想在它们上投入太多的原因是:Arc似乎对数值计算没有兴趣,而P. Graham似乎对代码大小着迷(使他的代码不可读的重点);Clojure看起来不错,但是我不喜欢JVM。而且,Lush ...好吧,除了使用动态作用域之外,该语言的编译和解释版本也非常不同-您无法编译递归函数。因此,对我来说,要么是Scheme,要么是Common Lisp。


2
Clojure具有词法范围,通过(通常是顶级)vars具有线程局部动态范围binding
布赖恩·卡珀

什么是那些“我知道我可能会在未来2
Gregg Lind 2009年

1
@格雷格·林德(Gregg Lind):“特征”是:1)一个非常高效的用于数值计算的编译器,以及2)条件系统。我必须承认,SLIME在这一决定中也发挥了重要作用。:-)
Jay

@Brian Carper:谢谢!我不知道Clojure的词汇范围。我隐约记得在clojure.org上读到它具有动态范围,但是我可能混淆了事实。
杰伊,

@Jay,感谢您的回答,也许将其添加到您的主要答案中!这正是有趣的事情。
格雷格·林德

1

我想您要么想要Common Lisp要么PLT Scheme。

前者具有很大的自由度和功能(起初可能使您不知所措),而后者则具有大量的库,匹配的教程和集成良好的IDE。


1

选择Clojure以外的任何东西,继续进行下去,您将处于更好的位置以便以后评估。

您用这个问题来表述哪个Lisp是学习Lisp的最佳媒介,对我来说,它必须包含一个由低级原语构建的Lisp,而Clojure的大部分内容都是用Java编写的。

如果您将这个问题表述为哪个是开始新项目的最佳Lisp,那么Clojure可能是最佳选择。


>选择除闭包外的所有内容我真的希望我能看到一个反对“访问所有JVM库”的论点,因为我真的无法想象如果我选择LISP / Scheme时我将使用什么Java
日晚

请支持该声明。为什么我们不应该使用Clojure?
亚当·阿罗德

@edem您是否阅读了前四个字以外的内容?首先,我从未说过您不应该使用Clojure。如果您想使用Clojure,那就去吧。另一方面,如果您的目标是学习Lisp,则最好从更接近Lisp主线的地方入手。例如,在Clojure中,尾部递归需要在代码中明确。该库的大部分是用Java实现的。您还将遇到“ Lisp的奇怪功能X部分或特定于Clojure”。
凯文·彼得森

在完成《实用Common Lisp教程》之后,我开始了Clojure。:) 谢谢(你的)信息。
亚当·阿罗德

0

我是Scheme的粉丝,但是自从我对Scheme进行任何操作以来已经有10多年了。

就像其他人说的-随便挑一个。


0

那里很少有真正的选择,无论是SBCL,Clojure还是PLTScheme。

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.