我知道有一些不同的Lisp方言.在决定学习Lisp将是一种新的智力体验之后,我想知道要学习哪种Lisp方言,以及为什么.
有没有比其他人更受欢迎的?他们中的任何一个是否更"完整",如更好地记录和支持?这种方言的优点和缺点是什么?
您希望在简洁性和清洁度,有吸引力的功能以及允许您编写有趣且有用的软件(自己)以及作为学习工具的平台之间寻求平衡.(这最后会让你继续学习更长时间.)这里有一些可能性:
方案.可能是所有方言中最干净的.毫无疑问,为什么The Little Schemer被从LISP翻译成Scheme.第五个方案标准规范R5RS本身就是一种很好的教育方式; 它可能是我读过的最好的语言和图书馆规范,也是最短的,相当全面的.该PLT的计划(现在的球拍)平台包括一个相当体面的解释器和编译器,是很好的脚本,也具有一定的可视化工具,使得它非常适合学习.
Common 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,这是我曾经尝试阅读过的最令人兴奋但最难写的书之一.
我可以在SBCL上推荐Common Lisp .这种组合快速,强大,成熟且记录良好.
此外,Clojure在这些日子里获得了大量的关注,并且有充分的理由.出色的数据结构,非常好的并发支持(在这方面使Scheme和CL变得羞耻),以及一个伟大的社区.它也相对简单,CL至少和C++一样复杂.
这并不是说我不喜欢CL或Scheme.我和SICP学习了Scheme.CL让我去了Clojure.这一切都取决于我的目标.如果你想学习一个非常实用的Lisp,请去Clojure.否则CL或Scheme都很棒.
我更喜欢CL,因为我喜欢面向对象的编程,而CLOS是最好的对象系统.
我在学校学习了Scheme.这是一次很棒的学习经历,我永远不会忘记函数式编程的基础知识.只要您了解其有用性的核心 - 无状态lambda演算,您可能选择哪个版本的LISP并不重要.
这是一篇关于为什么MIT在其入门编程课程中从Scheme切换到Python的有趣文章.