Lisp有什么优点?

111

我不了解足够的Lisp语言以确定它是好还是坏。似乎每个使用Lisp的人都喜欢它,然而现在最流行的语言都是由C衍生而来。

Lisp有什么值得称道的特点,为什么它没有被更广泛地使用呢?除了无休止的括号之外,Lisp还有什么明显的缺点吗?


7
现今最流行的编程语言表面上继承自C,但仅就特性而言,现代语言与Lisp并没有太大区别,并且越来越接近。比如,在C#、Python或Ruby中,程序看起来更像是Lisp而不是C。 - Ken
12
一个看起来像C语言但更像Lisp的语言的好例子是JavaScript。它的设计很多方面与Scheme相似。 - JAL
1
好观点,Ken:越来越多曾经只存在于Lisp中的特性(一级函数、函数作为数据、甚至宏)正在出现在其他语言中。反馈也不是单向的:Lisp正在发展新的技术和习惯用法,以响应其他语言的发展(例如,CLOS是对面向对象范式成功的回应)。 - itowlson
7
Lisp从各方面汲取了思想,但CLOS是为了应对什么而产生的? CLOS(1986-1987)在很大程度上是对Lisp早期对象系统的标准化,例如Lisp Machine Lisp(1980)包括Flavors。我不认为“面向对象编程范例的成功”在1980年就已经显现出来:“带类的C语言”只有一年历史(距离被重命名为“C ++”还有3年时间),而且我不知道Simula-67是否曾经非常流行。 Lisp拥有许多当今流行语言所没有的其他高级功能; 面向对象编程恰好取得了成功,但Lisp之所以没有采用它,不是因为它在流行时没有,或者没有选择它。 - Ken
1
我不认为使用Lisp的人都喜欢它。我的经验是不同的。试着问问从Scheme开始学习计算机科学的学生。大约有10%会喜欢它,30%会尊重它,60%会讨厌它。我也不认为大多数流行的编程语言都起源于C语言。 - Rainer Joswig
显示剩余6条评论
7个回答

85

Lisp之所以好,是因为它有一个非常简洁、简单、规律的语法。

Lisp之所以不好,是因为它有一个非常简洁、简单、规律的语法。


6
极简、简单、规范的语法有哪些不好之处? - oskarkv
41
@oskarkv - 完全常规的极简语法意味着没有偏向任何特定用法的倾向。这听起来不错,直到你遇到帕累托原则:倾向于最常出现的情况更高效,停止假装所有情况同等可能。如果您的客户中有20%在纽约,80%在洛杉矶,那么坐在堪萨斯/俄克拉荷马州边界上以保持地理上"公正"是否合理?还是更明智地去大多数客户所在的地方?我们更喜欢倾向于可能出现的问题的语言。 - Daniel Earwicker
5
Lisp的语法非常好。我在学完Clojure后学了Haskell,但那时甚至Haskell的语法也感觉像是一种阻碍。Lisp语法的一致性很棒。所以,我不太清楚你所说的偏见是什么。对于不灵活的偏见吗?听起来不太好。 - oskarkv
5
如果你这样说的话听起来确实不太好。我可没有那么说!那我们考虑一下偏向最常见的情况,最有可能发生的情况怎么样?当然这些都是相对的,所以要看你具体在做什么。如果你真的不知道自己将要做什么,那准备也没有意义。但这种情况很可能不是真的 - 你肯定有一些信息,所以可以(“偏向”)准备一下最有可能需要应对的情况。 - Daniel Earwicker
@csmathhc 很遗憾,它们目前还不存在(以任何成熟的形式)。hazel.org和Racket的“Fructure”(https://www.youtube.com/watch?v=CnbVCNIh1NA)是朝着这个方向的两个好的具体举措。在我的想象中,我们当前的现状——将代码作为文本进行编辑——大致上与通过穿孔卡进行编程在现代环境中看起来一样*相对*低效和压抑。有一个整个社会转型的可能性世界;编程可以且应该更快速、更易于访问。 - iono
显示剩余2条评论

78
“Lisp是一种可编程的编程语言。” - John Foderaro,《CACM》,1991年9月
在表面上,Lisp是一种很好的、简单的函数式编程语言。几乎没有语法,所有部分都以逻辑方式组合在一起。
如果你深入挖掘,阅读SICP并编写一个元环境评估器,你会发现两件事情:一是整个解释器(只给出几个基本操作)只有一页代码,而是代码和数据之间的关系允许使用优雅的编程技巧。
一旦你完全吸收了这一点,就会感觉其他语言在只允许你说几句话时就已经定型了。如果你能为其定义语法和语义,Lisp可以构建任何抽象。

1
你理论上可以将任何语言嵌入到Lisp中,如Rust、Ruby、C、Java、Python和Erlang。因此,Python的s表达式版本(Hy)和Rust的版本被称为(Risp)[虽然我不知道它们有多稳定]。如果你使用Hy而不是Python编写代码,你就可以像parinfer/paredit(https://shaunlebron.github.io/parinfer/)一样具备宏和结构化编辑的能力。宏允许你在Lisp中嵌入自己的DSL,并且它们也可以用于通过编译器宏将慢速代码转换为快速代码。你还可以通过转换S表达式树将Python(Hy)代码转换为Rust(Risp)。 - aoeu256
1
我也听过这句话很多次。@aoeu256,你能再详细解释一下吗? - Student

57

Lisp是编程语言中的“Chuck Norris”。

其他编程语言都会与Lisp进行比较。

了解Lisp展示了开发者的启蒙之路。

我听说过3个缺点(以及它们的反驳):

  1. 动态类型。

    有一个关于静态类型语言的争论,围绕着给编译器足够的信息来捕获某些类别的错误,使得它们不会在运行时发生。但你仍然需要测试。

    这篇文章提倡使用动态类型和更多的测试:强类型与强测试

  2. 难以掌握。

    实际上有两个方面:学习和工具。

    要真正理解Lisp需要一些努力,但这是值得的,因为学习Lisp真的会让你成为其他语言更好的程序员。例如,一旦你真正理解闭包,你就会理解Java的内部类。一旦你理解了一等函数,你就会在使用没有一等函数的语言时感到沮丧。

    我已经阅读了《小Schemer》和正在阅读《实用Common Lisp》,它们都非常优秀。

    接下来是工具。我使用的是Mac,所以我选择了Aquamacs Emacs(使Emacs对于新手更加易用)和Steel Bank Common Lisp(SBCL)。

  3. 缺乏库。

    我现在还不能确定,但我怀疑不是这样的。对于构建网站,看起来HunchentootElephant提供了一套很好的工具。但实际上,我并没有看到Lisper们抱怨缺少库(也许是因为Lisp太强大了,它们根本不需要?)。


4
解决(3)- 你看过Clojure吗? - viksit
5
但是我并没有看到Lisp程序员抱怨缺乏库(也许是因为Lisp非常强大,所以它们并不需要?)我会将最后一句话修改为“(也许是因为Lisp非常强大,所以对于他们来说并不需要?)”,这会有很大的区别。 - Agnius Vasiliauskas
58
没说清楚为什么Lisp很棒,我会给你点踩。 - Kilon
34
因为“X真棒!X太好了!X就像Y那样,Y也很棒,因为我觉得它很棒!”不是回答“为什么X被认为很伟大?”的问题。政治参考也不合适且无益(大多数人甚至认为古典自由主义不是一个好主意)。这三个观点很有帮助,但我希望它们不要是“它有缺点A......但实际上这甚至不是一个弱点!”。 - Superbest
7
Lisp是编程语言中的“查克·诺里斯”,这就是它如此出色的原因。明白了,给你点个踩。 - NiCk Newman
显示剩余4条评论

26

"任何足够复杂的C或Fortran程序都包含了一个特别定制、非正式指定、错误百出、运行缓慢实现了Common Lisp一半功能的程序。"

格林斯潘第十定律


17

1
《On Lisp》很棒(虽然我只看了一半,但我承认宏有点密集);但你需要了解Lisp才能阅读它。除了这个小问题,它是一本伟大的书,不仅涉及Lisp,还涉及软件工程的一般知识。 - J S
“List - Reasons for Using”链接已失效。 - Adam Zerner
@AdamZerner:修复了链接。 - Greg Hewgill

10

1
所以基本上,人们选择编写DSL来解决问题。这难道不会使得新手难以理解代码库吗? - lalala
1
@lalala 代码仍然被抽象成不同的组件,适当地命名、注释等。在足够大的非Lisp代码库中,你已经在阅读类似于DSL的东西,因为你需要知道所有涉及的数据结构和函数签名才能有任何想法在进行什么样的通信。DSL通常存在是为了创建更简单、更优雅/更强大的接口。 - iono

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接