72

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

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

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

我试图阅读功能比较,它们似乎陷入了深奥(我不完全理解),比如方言是否完全尾递归等等。我希望你们所有人(集体)能够清楚地说明不透明的差异。

我喜欢的东西

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

我不喜欢的东西

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


更新

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

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

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

4

17 回答 17

64

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

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

于 2009-02-18T23:59:05.773 回答
34

如果您想避免激战并且喜欢库,请选择 Clojure。它很小,速度很快,而且社区乐于助人且不教条。这是 Lisp 减去 1980 年代荒谬的废话。它有一个 BDFL,如果你有一个好主意,那么它很有可能会被实现到语言中。

我玩弄了 Common Lisp,这是一件很美好的事情。我已经完成了 DrScheme 中 SICP 的前 3 章和 Metacircular Evaluator,这也是一件很美好的事情。当然,你会从学习这些中受益匪浅。

但是,随着时间的流逝,我开始珍视小语言。我不会撒谎,我喜欢 Javascript 并且我喜欢 C(如果每种语言的核心都没有 C 核心,那该死的),因为它们很小。

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

于 2009-02-19T05:17:06.400 回答
22

随便挑一个,学习一下。当你弄清楚差异时,如果你第一次选择错误,你将可以再次选择。

于 2009-02-18T23:36:17.840 回答
19

Clojure是一种很棒的 LISP 方言,它促进了函数式编程。它在 JVM 上运行,因此您可以访问您可能习惯使用的任何 Java 库。该网站有很好的文档和截屏视频来帮助你学习。另一个优点是它真的很容易安装,不像很多其他方言。

如果您只是想了解Emacs(特别是 EmacsLISP)的概念,则是另一种选择。它带有令人难以置信的文档、教程和大量代码示例。截屏视频也很容易找到。Emacs 的一大好处就是编辑器是用 LISP 编写的,所以编辑器自然对 LISP 的运行、​​编辑和调试有很好的支持。此外,您可以扩展编辑器,让您在学习 LISP 的同时更轻松地完成日常文本编辑需求。

于 2009-02-20T03:49:21.640 回答
19

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 一样(但我的 Clojure 已经随着即将推出的重大更改而衰落——这种语言虽然有其自身的优点,但通过对比提醒我很多我喜欢 Common Lisp 的地方。)所以你应该阅读这个页面的很多内容,并让 HyperSpec 远离按键(对我来说,M-x hyperspec RET do-symbols RET足够接近圣经了。),并考虑买几本书。我有Practical Common Lisp,刚刚得到Let Over Lambda,现在很快就会真正购买PAIP 。

但是,即使 Common Lisp 是真正的答案,你也不会完全浪费你的时间来“选择”一些看似华丽的替代品(——“欺骗性”,因为普通的 CL 并没有向你展示它的宏可以做的所有事情,而且它宏的种类比任何人都多。通常的比较是糟糕的 CL 和语法优化的替代方案 X)。您仍然会学习基础知识,您仍然可以使用在 SICP、On Lisp、The Little Schemer等中可以阅读的大部分内容。lisp,即使是错误的 lisp,仍然比非 lisp 好。(但是你会花一些时间在错误的 lisp 中实现正确的 lisp 的某些部分。Meta-Greenspun。)

于 2009-02-19T01:43:37.100 回答
9

Lisp 最大的问题是没有每个人都坚持的压倒一切的标准。您不必在 Common Lisp 和 Scheme 之间进行选择;您必须在 Common Lisp 的几个不兼容的实现和 Scheme 的几个不兼容的实现之间进行选择,以及 Arc 和 Clojure 等其他小东西。

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

于 2009-02-19T00:20:09.313 回答
7

学习 elisp,以便您可以扩展 Emacs。

于 2009-02-19T01:45:13.337 回答
6

使用 Clojure。这是一种了不起的语言,可以完全访问任何 Java 库。它已经开发了 2 年多,已经有 3 个 IDE 插件在开发中,并且在 4 月出版了一本关于它的书。它非常快,非常优雅和美丽。Clojure 不会出错。

于 2009-02-20T12:28:08.603 回答
5

对我来说,Scheme 的基础理论更有说服力。PLTScheme(现在称为 Racket)是迄今为止我发现的最积极开发的 LISP。不幸的是,它的大量输入掩盖了 Lisp 的美丽。

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

于 2009-02-19T00:14:17.733 回答
4

看看IronScheme

于 2009-02-19T00:27:46.453 回答
4

猜想:在学习你的第一个 lisp 时,不要学习一个你最终会用于最终开发的 lisp。

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

它会让学习所有其他的lisp变得容易得多。

于 2009-02-20T02:49:07.247 回答
4

我不知道 Lisp,但这就是为什么我认为 PLT Scheme(现在称为 Racket)是一个不错的选择:

  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 。

于 2009-05-31T03:49:47.997 回答
3

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

  • 一个非常高效的数值计算编译器(SBCL),
  • 条件系统和...
  • 不得不承认,SLIME 在这个决定中也扮演了重要的角色。:-)

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

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

于 2009-05-31T03:19:38.647 回答
1

选择除 Clojure 之外的任何东西,随它去吧,您将在以后进行评估时处于更好的位置。

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

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

于 2009-07-14T22:13:59.420 回答
1

我认为您要么想要 Common Lisp 要么想要 PLT Scheme(现在称为 Racket)。

前者有很多自由和力量(一开始可能会让你不知所措),后者有一堆库、匹配的教程和一个集成良好的 IDE。

于 2009-02-19T10:50:52.383 回答
0

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

就像其他人所说的 - 只需选择一个就可以了。

于 2009-02-20T03:53:59.743 回答
0

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

于 2009-02-20T10:03:27.657 回答