【问题标题】:Which dialect of Lisp should I learn? [closed]我应该学习哪种 Lisp 方言? [关闭]
【发布时间】:2010-11-03 16:23:03
【问题描述】:

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

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

【问题讨论】:

  • 在我问这个问题之前,我已经对此进行了搜索,但问题的性质在我输入它时发生了变化。我会确保不会重新发明轮子。
  • 那么这个问题和 Greg 上面提到的问题有什么区别呢?
  • 我想,他想说的是:当我第一次在脑海中提出我的问题时,它与现在的完全不同,并且查看相关搜索中的问题并没有揭示任何符合他想问的内容。但是当他输入问题时,它已经发生了变化,因此以目前的形式出现在 SO 上,这是之前提出的。

标签: lisp dialect


【解决方案1】:

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

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

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

  3. Clojure. 它在 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 的语言,并与您已经使用的语言或平台进行互操作,无论是 Perl、@987654327 @、ErlangGo 甚至是C++ on microcontrollers

【讨论】:

  • 拥有单独的命名空间并不是一个缺点,它只是一个不同的设计决策。请记住,Scheme 中已经有几个其他的命名空间,所以争论的焦点是 Lisp-5 与 Lisp-6。除了在 CL 中我可以将列表称为“list”和将汽车称为“car”之外,它的宏系统更加实用和有用,因为编译器不会那么容易混淆。
  • Clojure 没有尾调用优化,也不能,因为 JVM 字节码不支持它。它只有一个“递归”特殊形式,可以自递归当前函数。
  • Curt:我认为 Clojure 是最便携的,因为它运行在 Java VM 上。
  • 我不知道;如果您排除小型和嵌入式设备(例如电话和智能卡),无论如何您都不会运行未经修改的桌面/服务器程序,那么 elisp 肯定可以在比 JVM 更多的 CPU 和平台上运行。
  • 我强烈反对。递归倾向于产生 a) 更纯粹的代码,b) 更容易验证,c) 更可能是正确的。更详细地说:a)它倾向于较少接触函数之外的较少变量; b)归纳证明往往会自然地退出递归函数,而对于循环,您需要检查循环不变量等; c) 可靠性来自 a),并且您倾向于以一种自然而然地(可能是非正式地)执行 b) 的归纳证明的方式编写代码。
【解决方案2】:

我会说 Scheme,完全是因为 Little Schemer,这是我读过的最有趣但最难读的书之一。

【讨论】:

  • 别忘了 SICP! mitpress.mit.edu/sicp。这是一本经典读物。
  • The Little Schemer翻译出来之前,有两三个版本的The Little Lisper
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如今,Clojure 也越来越受到人们的关注,这是有充分理由的。伟大的数据结构,非常好的并发支持(在这方面让 Scheme 和 CL 感到羞耻),以及一个伟大的社区。也比较简单,CL至少和C++一样复杂。

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

    【讨论】:

    • 这似乎暗示 CL 或 Scheme 都不是“非常实用”,而实际上它们非常实用。尤其是 CL 标准诞生是出于实际考虑。
    • 自 1994 年以来,编程语言环境发生了变化,我不知道 CL 标准将如何改变/发展以适应从那时起所学到的东西。世界正在向前倾斜,据我所知,CL 静止不动。我喜欢 CL,Clojure 有一些方法可以接近它的力量,但我不知道 CL 将如何发展——如果你要使用标准化的语言,那么进化路径必须是显而易见的。没有它,语言很可能不是实用的选择。
    • CL 已经发展并通过许多非常有用的库不断发展。基础语言在 1994 年已经比今天所有的“现代”语言更强大。
    【解决方案5】:

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

    这是一篇关于 Why MIT switched from Scheme to Python 编程入门课程的有趣文章。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 说到 CL,我会推荐 ClozureCL 或 SBCL。两者都是开源的、有据可查的、成熟的、多平台的,并提供关键的非标准功能,如多线程。
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-15
            • 2011-01-08
            • 1970-01-01
            • 2018-03-19
            • 1970-01-01
            • 1970-01-01
            • 2011-06-14
            • 1970-01-01
            相关资源
            最近更新 更多