我知道有一些不同的Lisp方言。在决定学习Lisp将是一种新的智力体验之后,我想知道要学习哪种Lisp方言,以及为什么。
有没有比其他人更受欢迎的?他们中的任何一个是否更“完整”,如更好地记录和支持?这种方言的优点和缺点是什么?
答案 0 :(得分:67)
您希望在简洁性和清洁度,有吸引力的功能和平台之间寻求平衡,该平台将允许您编写有趣且有用的软件(对您自己)以及作为学习工具。 (这最后会让你继续学习更长时间。)以下是一些可能性:
Scheme。可能是所有方言中最干净的。毫无疑问,为什么The Little Schemer从LISP转换为Scheme。第五个方案标准规范R5RS本身就是一种很好的教育;它可能是我读过的最好的语言和图书馆规范,也是最短的,相当全面的。 PLT Scheme(现在的Racket)平台包括一个相当不错的解释器和编译器,适用于脚本编写,还有一些可视化工具,使其非常适合学习。
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++ on microcontrollers。
答案 1 :(得分:21)
我会说Scheme,完全是因为Little Schemer,这是我曾经尝试阅读过的最令人兴奋但最难写的书之一。
答案 2 :(得分:9)
我可以在SBCL上推荐Common Lisp。这种组合快速,强大,成熟且记录良好。
答案 3 :(得分:8)
此外,Clojure在很多人心目中也是如此,并且有充分的理由。出色的数据结构,非常好的并发支持(在这方面使Scheme和CL变得羞耻),以及一个伟大的社区。它也相对简单,CL至少和C ++一样复杂。
这并不是说我不喜欢CL或Scheme。我和SICP学习了Scheme。 CL让我去了Clojure。这一切都取决于我的目标。如果你想学习一个非常实用的Lisp,请去Clojure。否则CL或Scheme都很棒。
答案 4 :(得分:5)
我更喜欢CL,因为我喜欢面向对象的编程,而CLOS是最好的对象系统。
答案 5 :(得分:5)
我在学校学到了Scheme。这是一次很棒的学习经历,我永远不会忘记函数式编程的基础知识。只要您了解其有用性的核心 - 无状态lambda演算,您可能选择哪个版本的LISP并不重要。
这是一篇关于Why MIT switched from Scheme to Python的入门编程课程的有趣文章。
答案 6 :(得分:3)
我会说所有这些,至少在一开始。最终你可能会对Scheme或Common Lisp产生偏好,但是它们都有足够的差异,最好能够处理那里的所有内容。
例如,Scheme有延续,并且很好地了解Scheme中的那些,即使它们可以在Common Lisp中实现。
学习词汇和动态范围之间的区别很重要,如果你学习Common Lisp和elisp,你会发现两者的含义。
答案 7 :(得分:0)
LFE(Lisp Flavored Erlang)会很好。您可以在Erlang VM上使用lisp语法。
答案 8 :(得分:0)
是一种"装载"问题一开始,但OP可能并不知道。通常,Common和Scheme lispers就像PC和Apple计算机" people&#34 ;,他们不会混合。哪一个是最好的可能不像哪个"工作"为了你。真的,没有太大的区别。可能一个人对另一个人的偏好可能会受到你先学习哪一个的影响。 (对我来说,一个空列表应该是"没有",在CL中称为NIL,这使我成为Common Lisper。)我喜欢使用EMACS将SBCL与Slime集成,但SBCL并不适合所有人。首先,SBCL非常严格。如果你只是想要玩得开心的话。 GNU clisp非常简单,几乎适用于所有平台。