99

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

有没有比其他更受欢迎的?它们中的任何一个是否更“完整”,例如,更好地记录和支持?这种方言的优点和缺点是什么?

4

9 回答 9

83

您想在简单和整洁、吸引人的功能以及一个允许您编写有趣和有用的软件(对自己)以及作为学习工具的平台之间寻找平衡。(最后一个会让你继续学习更长时间。)这里有一些可能性:

  1. 方案。可能是所有方言中最干净的。这就是为什么The Little Schemer从 LISP 翻译成 Scheme 的原因。第五个 Scheme 标准规范R5RS本身就是一个很好的教育;它可能是我读过的最好的语言和库规范,也是相当全面的最短的。PLT Scheme (现在的Racket)平台包括一个相当不错的解释器和编译器,非常适合编写脚本,并且还有一些可视化工具,非常适合学习。

  2. 常见的 Lisp。可能是最便携和最全面的变体,如果您想编写诸如商业软件之类的东西,这很可能是您想要的。该标准定义了广泛的库,除此之外还有更多可用的库,它有CLOS,它可能会比任何 OO 语言教你更多关于 OO 的知识,并且一些编译器非常好。缺点包括Scheme没有的一些缺点(例如为引用函数的变量提供单独的命名空间),不够干净和简单(就像任何必须具有扩展并做出必要妥协的情况一样对于现实世界中的大型应用程序),没有卫生的宏,并且比 Scheme 强调递归要少得多。

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

  4. Emacs Lisp。就 LISP 而言,这不是最好的例子之一。它最大的缺陷之一是动态范围,但还有许多其他缺陷。但是,如果您是 Emacs 用户,这可能是您可以学习的最强大的工具,可以提高您对编辑器的使用。然而,除了如何扩展 Emacs 之外,你从学习 Emacs Lisp 中真正学到了多少,对我来说是一个悬而未决的问题;我不知道在 Emacs Lisp 中真正使用高阶函数等有趣技术的频率有多高。

2018 更新

自从我写这篇文章以来已经快十年了,Lisp 语言家族现在似乎在普通程序员的意识中获得了巨大的吸引力。其中大部分似乎与 Clojure 相关,它不仅本身成为了一种适当独立的 Lisp 方言,引入了许多自己的好想法,而且现在有一个几乎相同的针对 JavaScript 的版本,并启发了许多其他 Lisp针对其他平台。例如,Hy以 CPython AST 和字节码为目标,首先瞄准与 Python 的互操作性,但在“有疑问时”使用 Clojure 思想。(尽管从最新的提交来看,后者可能会有所改变。)

这给您的决策过程带来的重大变化是,您还应该查看可用的任何 Lisp 或类似 Lisp 的语言,并与您已经使用的语言或平台互操作,无论是PerlRubyErlangGo甚至是微控制器上的 C++

于 2009-06-20T02:49:07.863 回答
27

我会说 Scheme,完全是因为Little Schemer,这是我曾经尝试阅读的最令人兴奋但最难读的书之一。

于 2009-06-17T14:11:04.663 回答
12

我可以在SBCL上推荐 Common Lisp 。这种组合快速、强大、成熟且有据可查。

于 2009-06-18T09:06:08.663 回答
9

Clojure 这些天也获得了很多的关注,这是有充分理由的。伟大的数据结构,非常好的并发支持(在这方面让 Scheme 和 CL 感到羞耻),以及一个伟大的社区。它也比较简单,CL 至少和 C++ 一样复杂。

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

于 2009-06-17T18:06:28.887 回答
7

我在学校学过Scheme。这是一次很棒的学习经历,我永远不会忘记函数式编程的基础知识。只要您了解其有用性的核心 - 无状态 lambda 演算,您选择哪个版本的 LISP 可能并不重要。

这是一篇关于为什么 MIT在其编程入门课程中从 Scheme 切换到 Python的有趣文章。

于 2009-06-17T14:30:22.860 回答
6

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

于 2009-06-17T14:11:11.527 回答
3

我会说所有这些,至少一开始是这样。最终,您可能会偏爱 Scheme 或 Common Lisp,但它们都有足够的差异,因此最好掌握其中的所有内容。

例如,Scheme 有延续,学习 Scheme 中的延续是很好的,即使它们可以在 Common Lisp 中实现。

学习词法作用域和动态作用域之间的区别很重要,如果你同时学习 Common Lisp 和 elisp,你就会发现两者的含义。

于 2009-06-20T01:26:01.603 回答
1

一开始是一种“加载”的问题,但OP可能不知道。一般来说,Common 和 Scheme lispers 就像 PC 和 Apple 计算机的“人”,它们不会混在一起。哪一个最好可能不如哪个对您“有效”那么重要。真的,没有那么大的区别。可能对其中一个的偏好可能会受到您首先学习的影响。(对我来说,一个空列表应该是“无”,在 CL 中称为 NIL,这使我成为 Common Lisper。)我喜欢使用 EMACS 将 SBCL 与 Slime 集成,但 SBCL 并不适合所有人。一方面,SBCL 非常严格。如果您只是想“玩得开心”,GNU clisp 很简单,几乎可用于所有平台。

于 2014-03-30T23:58:31.517 回答
1

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

于 2013-12-08T14:42:56.813 回答