我应该学习哪个Lisp?

时间:2009-02-18 23:35:40

标签: lisp clojure scheme

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

CL和Scheme之间的碎片减缓了(至少对我而言!)。

所以,请给我“真正的答案”!

我试图阅读特征比较,他们似乎陷入了esoterica(我不完全理解),比如方言是否完全是尾递归等等。我希望你们(统称)能够明确区分不透明的差异。

我喜欢的东西

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

我不喜欢的事情

论战。功能在开始时很有用,但会干扰长期学习。


更新

  1. 我一直在使用MzScheme,一旦得到readline支持,我就会很享受。我没有在Unix上运行GUI,所以对我来说它似乎是一个很好的环境选择。

  2. 我也非常高兴Clojure在debian上安装了一个易于安装的.deb软件包,因此它更易于使用。这是一个很大的胜利。尽管下面的一些相当容易激怒的敌意,低进入门槛是一个胜利。我喜欢被舀勺。

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

17 个答案:

答案 0 :(得分:62)

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

这是另一种选择,而非One True Answer。

答案 1 :(得分:31)

如果你想避免火焰战争,你喜欢图书馆,请使用Clojure。它很小,很快,社区很有帮助,也没有教条。这是Lisp减去20世纪80年代荒谬的事情。它有一个BDFL,如果你有一个好主意,它很有可能会被实现到语言中。

我玩弄了Common Lisp,这是一件很棒的事情。我在DrScheme完成了SICP的前三章和Metacircular Evaluator,这也很美妙。当然,通过学习这些,你将从中受益匪浅。

但是,随着时间的推移,我已经开始认真地掌握小语言了。我不会撒谎,我喜欢Javascript而且我喜欢C(并且如果每种语言都没有C核心那就是该死的),因为它们很小。

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

答案 2 :(得分:19)

Clojure是LISP的一种很好的方言,可以促进函数式编程。它在JVM上运行,因此您可以访问可能习惯使用的任何Java库。该网站提供了很好的文档和screencasts来帮助您学习。另一个优点是,与许多其他方言不同,它的安装非常简单。

如果您只是想要了解概念Emacs(特别是EmacsLISP)是另一种选择。它附带了令人难以置信的文档,教程和大量代码示例。截屏也很容易找到。 Emacs的一大好处是编辑器是用LISP编写的,因此编辑器自然可以很好地支持LISP的运行,编辑和调试。此外,您可以扩展编辑器,使您的日常文本编辑需要更轻松,而您可以学习LISP。

答案 3 :(得分:18)

Contra Chuck,Common Lisp的一个优点是它有一个标准,实现坚持并努力,这样你可以在很大程度上利用SBCL(具有出色的类型检查和推理)进行开发,然后,作为一个部署与C库(使用ECL或其他)链接的可执行文件或使用Java库(使用ABCL)或使用Mac或Windows本机GUI(Clozure,两者)的.jar。 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上的任何内容(已经有此内容)减少到ECL上的(defun special-variable-p (symbol) (si:specialp symbol)),依此类推。所以我可以将它放在我的.rc文件中并使用REPL中的common函数。但这不是很重要:这不是threadingvariously-backed networkinga Communicating Sequential Processes library。最后一个示例只有一个#+sbcl/#-sbcl,即使它在五个实现上运行。因为它依赖于经过精心移植的代码。

但是允许这种(和其他)优势的东西也给学习者带来了挑战:Common Lisp是一种非常大的语言。这不是你可以在一两个星期内啜饮的东西,就像我做过Clojure一样(但是我的Clojure已经随着突破性的变化而衰退了 - 这种语言尽管很重,但它有自己的优点,通过对比提醒我我喜欢Common Lisp的很多内容。)所以你应该阅读很多this page,并且让HyperSpec成为一个按键(对我来说,M-x hyperspec RET do-symbols RET足够接近圣经。),想想买几本书。我有Practical Common Lisp,刚刚获得Let Over Lambda,并且很快就会购买PAIP

但是即使Common Lisp是真正的答案,你也不会完全浪费你的时间来“挑选”一些看似浮华的替代方案( - '欺骗',因为普通的CL没有表现出来你所有的宏都可以做到,它比任何人都有kinds of macros。通常的比较是在坏的CL和语法优化的替代X之间。你仍然可以学习基础知识,你仍然可以在SICP,On Lisp,The Little Schemer等中使用大部分内容。一个lisp,即使是错误的lisp,仍然比非lisp更好。 (但是你会花一些时间来实现正确的口齿不清的部分,糟糕的是,在错误的口齿不清的情况下.Meta-Greenspun。)

答案 4 :(得分:18)

选择一个,然后学习它。当你弄清楚差异时,如果你第一次选择不好,你就可以再次选择。

答案 5 :(得分:9)

Lisp最大的问题是每个人都没有坚持不懈的标准。你不必只需要在Common Lisp和Scheme之间选择;你必须在Common Lisp的几个不兼容的实现和Scheme的几个不兼容的实现之间进行选择,以及其他一些像Arc和Clojure这样的小东西。

我建议从MzScheme开始。它很受欢迎,它是积极开发的,它有许多提供现代编程环境功能的库,而Scheme比Common Lisp更简单(更好,更简单)。

答案 6 :(得分:7)

了解elisp,以便扩展Emacs。

答案 7 :(得分:6)

和Clojure一起去吧。它是一种令人惊叹的语言,可以完全访问任何Java库。它已经开发了超过2年,已经有3个IDE插件正在开发中,并且在4月份出版了一本关于它的书。它非常快,非常优雅和美丽。你不能错过Clojure。

答案 8 :(得分:5)

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

我很想看到像arc这样的东西成功,但似乎不太可能。

答案 9 :(得分:4)

看看IronScheme

答案 10 :(得分:4)

猜想:在学习第一个口齿不清时,不要学习最终用于最终开发的内容。

引理:学习Arc。它是lisp中所有“难以理解”的东西 - 闭包,宏,延续,没有Clojure的Java互操作复杂性,CL的命名空间混淆,或者Scheme的名称碎片。如果你很专注,你可以在周末学习所有这些东西。如果你在一个晚上很敏锐和专注。

它会让所有其他lisps更容易学习很多

答案 11 :(得分:4)

我不知道Lisp但是为什么我认为PLT Scheme是一个不错的选择:

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

  2. DrScheme
     DrScheme是一个令人惊叹的编程环境,它带有编译器,步进器,语法检查器,REPL,无数语言支持并且是可扩展的。这使整个体验变得有趣。查看一些screenshots

  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/ 另见docs

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

答案 12 :(得分:3)

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

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

所以,如果我是你,我会开始学习每种语言的一小部分,并找出每个语言的相对的优点和缺点(我的意思是那些与你的相关的那些)我需要/最想做的事情)所以你我可以选择一个。你可能会发现你以后也会学到另一个(发生在我身上 - 在学习Common Lisp一年后我必须学习更多Scheme)

至于Arc,Clojure和Lush,并不知道那些。我认为同样的论点也适用于他们......我不想过多地投资他们的原因是:Arc似乎对数值计算并不感兴趣,而P. Graham看起来似乎被代码大小所欺骗(至使他的代码不可读的观点); Clojure看起来不错,但我不喜欢JVM。 Lush ......好吧,除了使用动态范围之外,该语言的编译和解释版本非常不同 - 您无法编译递归函数。所以,它对我来说是Scheme或Common Lisp。

答案 13 :(得分:1)

选择Clojure以外的任何东西,随身携带它,以后你会处于更好的位置进行评估。

你提到这个问题,Lisp是学习Lisp的最佳媒介,对我来说,必须包含一个由低级原语构建的Lisp,而Clojure的大部分是用Java编写的。

如果您已经将这个问题说成是开始新项目的最佳Lisp,那么Clojure可能是最佳选择。

答案 14 :(得分:1)

我认为您要么使用Common Lisp,要么需要PLT Scheme。

前者带来了很多自由和力量(一开始可能会让你不堪重负),后者带有一堆库,配套教程和完善的IDE。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

我是Scheme的粉丝,但自从我对Scheme做了任何事情以来已经超过10年了。

像其他人说的那样 - 只需选择一个即可。