我应该学习Lisp的哪一种方言?

我知道Lisp有几种不同的方言。 决定学习Lisp将是一个新的知识经验,我想知道哪个Lisp方言学习,为什么。

有没有比别人更受欢迎的东西? 其中的任何一个更“完整”,如更好地logging和支持? 这种方言有什么优点和缺点?

您希望在简洁和清洁,有吸引力的function和平台之间寻求平衡,这将使您能够编写有趣的和有用的软件(对于您自己)以及作为学习工具。 (这最后会让你继续学习更长的时间。)以下是一些可能性:

  1. scheme。 可能是所有方言中最干净的。 毫无疑问,小Schemer是从LISP翻译成Scheme的。 第五scheme标准规范R5R2本身就是一种很好的教育; 它可能是我读过的最好的语言和库规范,以及最短的相当全面的。 PLT计划平台包括一个相当体面的解释器和编译器,适用于脚本编写,还有一些视觉工具,使其成为学习的优秀。

  2. Common Lisp。 可能是最便携和最全面的变种,如果你想写商业软件等,这很可能是你想要的。 这个标准定义了大量的库,除此之外,还有更多的可用库,它有CLOS ,这可能会教你更多关于面向对象的任何OO语言,而且一些编译器是非常好的。 缺点包括Scheme没有的一些瑕疵(比如为引用函数的variables提供一个单独的命名空间),而不是简单而干净(任何必须具有扩展名并做出必要的妥协的情况都是如此对于现实世界中的大型应用程序),不具有卫生macros,并强调recursion远远小于Scheme。

  3. Clojure的。 这在JVM上运行,这可能会让Java开发人员在这个问题上有所作为。 它有几个瑕疵(例如,您必须明确要求调用尾部优化,但如果将TCO添加到JVM,则可能会有一天发生变化)。 这些macros虽然不卫生,但有一些function可以帮助您避免variables捕获,所以如果您真的想要的话,您可以捕获variables,而在意外情况下运行的风险要低于CL。 您可以轻松访问所有Java库; 对于“真实世界”的代码来说这可能是一件好事,在学习方面也是毫无意义的。 它拥有一套用于持久数据结构和支持STM的库,从并发的angular度来看它非常有趣。 这使得它可能是你最好的select,如果你有兴趣了解更多关于处理并行和并行编程的新方法。 看起来好像Clojure可以像Java一样适用于大型的生产应用程序,因为它将能够执行您在生产应用程序中执行的“丑陋的东西”,而您不想做,也不会做当你学习的时候

  4. Emacs Lisp。 就LISP而言,这不是最好的例子之一。 其中最大的缺点之一是dynamic范围,但还有很多其他的问题。 但是,如果你是一个Emacs用户,这可能是你可以学习的最强大的工具来改进你的编辑器的使用。 从Emacs Lisp的学习中学到多less东西,除了如何扩展Emacs之外,对我来说还是一个开放的问题。 我不知道在Emacs Lisp中真正使用有趣的技术,如高阶函数。

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

此外,Clojure最近也获得了很多的支持,并且有充分的理由。 良好的数据结构,非常好的并发支持(在这方面让Scheme和CL感到羞耻)和一个伟大的社区。 CL也相对简单,CL至less和C ++一样复杂。

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

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

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

我在学校学到了计划 。 这是一个很好的学习经验,我永远不会忘记函数式编程的基础。 只要你理解它的有用性 – 无状态lambda演算的核心,你select哪个版本的LISP可能并不重要。

这里有一篇有趣的文章,介绍为什么麻省理工学院在其介绍性编程课程中从Scheme转换到Python 。

至less在一开始,我会说所有这些。 最终你可能会开发一个Scheme或者Common Lisp的偏好,但是它们都有足够的差别,最好能够处理所有的东西。

例如,Scheme有一些延续,尽pipe可以在Common Lisp中实现,但学习Scheme中的代码是很好的。

学习词法和dynamic范围之间的区别非常重要,如果你同时学习Common Lisp和elisp,你会发现两者的含义。

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

开始时是一种“加载”的问题,但OP可能不知道。 一般来说,Common和Scheme Lisp是像PC和苹果电脑的“人”,他们不会混用。 哪一个最好,可能不像哪个“为你工作”那么重要。 真的,没有太大的区别。 可能对某个人的偏好可能受到你最先学习哪一个的影响。 (对于我来说,一个空的列表应该是“没有”,在CL中称为NIL,这使我成为一个共同的Lisper。)我喜欢使用EMACS整合SBCL和Slime,但是SBCL并不适合所有人。 一方面,SBCL非常严格。 如果你只是想“玩得开心”,GNU clisp几乎可以在任何平台上轻松使用。

Interesting Posts