我知道Lisp有几种不同的方言。决定学习Lisp将是一种新的知识体验之后,我想知道该学习哪种Lisp方言,以及为什么。
有没有一个比其他人更受欢迎?它们中的任何一个是否更“完整”,如文档中得到更好的记录和支持?该方言的优缺点是什么?
我知道Lisp有几种不同的方言。决定学习Lisp将是一种新的知识体验之后,我想知道该学习哪种Lisp方言,以及为什么。
有没有一个比其他人更受欢迎?它们中的任何一个是否更“完整”,如文档中得到更好的记录和支持?该方言的优缺点是什么?
Answers:
您想在简单性和简洁性,吸引人的功能以及一个平台之间找到平衡,该平台将使您能够(自己)编写有趣而有用的软件,并充当学习工具。(这最后一个可以使您继续学习并学习更长的时间。)以下是一些可能性:
方案。可能是所有方言中最干净的。毫无疑问,为什么将《 The Little Schemer》从LISP译成Scheme。第五个Scheme标准规范R5RS本身就是一个很好的教育;它可能是我读过的最好的语言和库规范,也可能是最全面的最短语言和库规范。该PLT的计划(现在的球拍)平台包括一个相当体面的解释器和编译器,对于脚本好,也有一些可视化工具,使得它非常适合学习。
普通Lisp。可能是最可移植和最全面的变体,如果您要编写诸如商业软件之类的东西,则很可能是您想要的。该标准定义了广泛的库,还有更多可用的库,它具有CLOS,它可能比任何OO语言都可以教给您更多有关OO的知识,并且其中一些编译器非常出色。缺点包括Scheme所没有的一些缺点(例如为引用函数的变量使用单独的命名空间),不够简洁明了(就像任何必须具有扩展名和做出必要折衷处理的事情一样) (对于现实世界中的大型应用程序而言),没有卫生宏,并且强调递归要比Scheme少得多。
Clojure。它可以在JVM上运行,这可以为Java开发人员提供一站式服务。它有很多缺点(例如,您必须明确要求进行尾部调用优化,尽管如果将TCO添加到JVM,这可能有一天会改变)。宏虽然不卫生,但确实具有一些功能来帮助您避免变量捕获,因此,如果确实需要,则可以捕获变量,而与CL相比,意外捕获的风险较小。您可以轻松访问所有Java库。对于“现实世界”代码而言,这可能是一件好事,而对于学习而言,这毫无意义。它具有一组用于持久数据结构和对STM的支持的库,从并发的角度来看,这非常有趣。这可能是您最好的选择 有兴趣了解更多有关处理并发和并行编程的新方法的信息。似乎Clojure可以像Java在大型生产应用程序中使用一样,从某种意义上说,它可以处理您宁愿不愿做和不愿意做的生产应用程序中的“丑陋事情”在学习时。
Emacs Lisp。就LISP而言,这不是最好的例子之一。其最大的缺点之一是动态范围界定,但还有许多其他缺点。但是,如果您是Emacs用户,则它可能是您可以学习的最强大的工具,可以改善对编辑器的使用。但是,除了学习如何扩展Emacs之外,您从学习Emacs Lisp中真正学到了多少东西,这对我来说是一个开放的问题;我不知道Emacs Lisp中真正使用有趣的技术(例如高阶函数)的频率。
2018更新
自从我写这篇文章以来已经过去了将近十年,而Lisp语言家族现在似乎已在一般程序员意识中获得了很大的吸引力。其中很多似乎与Clojure有关,Clojure不仅本身已成为Lisp的一种适当的独立方言,引入了许多自己的好主意,而且现在具有针对JavaScript的几乎完全相同的版本,并激发了许多其他Lisps针对其他平台。例如,Hy以CPython AST和字节码为目标,首先是为了与Python互操作,而在“有疑问时”使用Clojure思想。(尽管从最近的提交来看,后者可能有所变化。)
这给您的决策过程带来了巨大的变化,那就是您还应该考虑使用哪些Lisps或类似Lisp的语言并与已经使用的语言或平台进行互操作,例如Perl,Ruby,Erlang,Go甚至是微控制器上的C ++。
我之所以说Scheme,完全是因为Little Schemer,这是我尝试阅读的最令人激动的有趣但又非常难的书之一。
如今,Clojure也获得了很多关注,这是有充分理由的。出色的数据结构,出色的并发支持(在这方面让Scheme和CL感到遗憾)和一个强大的社区。它也相对简单,CL至少和C ++一样复杂。
这并不是说我不喜欢CL或Scheme。我通过SICP学习了Scheme。CL带我去了Clojure。我想这一切都取决于您的目标。如果您想学习非常实用的Lisp,请选择Clojure。否则,CL或Scheme都很棒。
我更喜欢CL,因为我喜欢面向对象的编程,而CLOS是周围最好的对象系统。
我在学校学习了Scheme。这是一次很棒的学习经历,我将永远不会忘记函数式编程的基础。只要了解LISP的核心功能-无状态Lambda演算,选择哪个版本的LISP可能都不重要。
这是一篇有趣的文章,介绍了MIT为何在其入门编程课程中从Scheme转向Python。
LFE(Lisp风味Erlang)会很好。您可以在Erlang VM上使用lisp语法。