Lisp为什么有用?[关闭]


64

Lisp显然是AI方面的优势,但是对我而言,Lisp的速度似乎不比Java,C#甚至C都快。我不是Lisp的高手,但我发现很难理解它的优势人们会用Lisp编写商业软件。

但是,它被认为是黑客的语言。

保罗·格雷厄姆(Paul Graham)为什么提倡Lisp?为什么ITA Software选择Lisp而不是其他高级语言?这些语言有什么价值?


20
“我认为Lisp不会比Java,C#快,或者事实上不比C快”这一行有点令人困惑。C通常被当作“快速代码的标准,因为您正在接近金属而编写” –它是几乎所有方面都可以超越的基准。现在,Java和其他GC语言可以在某些情况下击败它,例如内存分配/清除的速度。但是,这句话似乎还是有些倒退。
Michael H. 2010年

2
Lisp是比您提到的语言更高级别的语言,因此通常较慢。
segfault

5
@薄天:“高级语言”需要一个明确的定义。即使它有一个,这听起来像是一个不讲道理的人。(感谢@Mark)
Mike Dunlavey

5
@BoTian的“较高级别”默认情况下不等于“较慢”。

24
Lisp的存在是为了展示其他语言设计者的错误。

Answers:


78

我要努力胜任Common Lisp的原因有几个。

  1. 同音代码。这允许结构化的自我修改代码。
  2. 语法可识别的宏。它们允许重写样板代码。
  3. 实用主义。Common Lisp旨在使工作的专业人员完成工作。通常,大多数功能语言都不是。
  4. 灵活性。它可以以合理的速度完成许多不同的事情。
  5. 警惕。现实世界是凌乱的。语用编码最终不得不使用或发明混乱的构造。Common Lisp具有足够的警惕性,可以完成工作。

可以说,选择Common Lisp的唯一真正原因是标准库已过时。

我会大胆地说,在一般情况下,语法对于专业软件工作者来说应该不成问题。


8
如果语法严重影响可读性或可写性,则可能是一个问题。我认为Lisp并非如此。好的编辑器或IDE可以完成足够好的语法突出显示和paren匹配,没什么大不了的。
Matt Olenik

4
另外,我只使用了Lisp一点(Common Lisp),我的总体感觉是#2是Lisp的最大好处。也许我在错误的范式中思考,但我认为我从来没有遇到过需要自我修改代码的情况。如果您有特定的原因使用它,则可以,但是否则,这些宏看起来像是真正的杀手级功能。编辑:刚刚意识到这些实际上是相同的功能。
Matt Olenik

3
@Matt:是的。FWIW,我最近遇到了Nemerle,一种带有宏的C#式CLR实验语言。nemerle.org。我认为在某些时候值得一试,只是为了体验。
保罗·内森

2
“实用主义。CL旨在让工作的专业人员完成工作。通常,大多数功能语言都不是。”:我不同意这一说法。我对Lisp非常感兴趣,并尝试花一些时间来学习它。但是我发现其他FP语言对于“完成任务”也非常有效,至少到目前为止,这是我在Scala和Haskell的经验。
乔治

1
“ CL旨在让工作的专业人员完成工作。通常,大多数功能语言都不是。”:您能详细说明一下吗?特别是在句子的第二部分。你能举几个例子吗?
乔治

23

我喜欢Lisp,因为它

  • 表示代码和数据的统一,简单,优雅的方式。
  • 独特的观点,这使我在解决难题时获得了至关重要的80点IQ奖励(给Alan Kay小费)
  • 极为敏捷,互动和对话的开发环境
  • 创建和操纵抽象的空前力量

编程与复杂性作斗争。抽象是克服日益增加的复杂性(具有非常有限且恒定的头骨尺寸)的唯一有效工具。使用Lisp管理抽象就像拥有一个n + 1个愿望的精灵。


5
+1表示“编程是与复杂性作斗争。抽象是克服日益复杂性(具有非常有限且恒定的头骨大小)的唯一有效工具。” (我希望我可以给+10。)
乔治(Giorgio

什么是“极端敏捷,交互式和对话式开发环境”?
2014年

6
那不是(+ 1 n)理想,还是更好的实用性(incf n)
Reb.Cabin '16

21

我相信正确的Lisp答案更符合基因组学。诸如:“如果必须要问,您还没有准备好。”

然后,如果有人进一步提出疑问,则正确答案是“是”(如果是一个/或一个问题)或“您尚未准备好”。


5
保罗·格雷厄姆(Paul Graham)引用路易斯·阿姆斯特朗(Louis Armstrong)的话:“如果你要问爵士是什么,那你永远不会知道。”
杰森·贝克

25
+1。尽管有时会出现诸如“如果您必须要问,您还没有准备好”之类的短语,但我认为这么说的人根本无法解释
superM 2012年

5
@superM Lisp和类似Lisp的函数式语言具有的特性是,一旦人们学会了它们,就无法再对其进行解释!
esoterik

18

我认为所有人都提到的Lisp在人工智能(AI)领域的优势有点历史性的意外... Lisp最初是在AI中使用的,但它是一种通用语言。

我相信执行速度不是语言的唯一重要方面(不过我曾经做过一次)。但是,我喜欢Lisp的方面之一是对我来说,它将Python和C结合在一起。我可以立即开始编写没有声明的代码,并立即快速原型化(运行时和REPL对于此非常重要)。运行完某些内容后,我会逐渐添加类型声明并“优化”我的代码。按下SLIME中的键并查看为我感兴趣的功能生成的机器语言真是一个奇迹。在Python中,没有类型声明,因此无法获得更快的速度,但是在C中,快速完成所有操作是更加痛苦。Lisp在这种情况下非常有用。

话虽如此,我之所以喜欢Lisp,主要是因为。当您最终了解了宏可以实现的功能后,我认为您很容易忍受括号。此外,像Emacs这样的编辑器自己管理括号,因此您不必这样做。但是,我承认,起初我并没有发现所有的括号都不好,而且我知道有些人无法忍受。但是由于宏的全部目的是在编译时生成代码,因此Lisp中的代码使用标准的数据结构,并且括号只是将代码表示为列表,这对于使宏易于编写是必需的。

我不知道可以使用Lisp轻松编写其他一些小语言来更好地描述您的问题的其他语言。这就是保罗·格雷厄姆(Paul Graham)在击败平均水平中谈到的优势。这是极端的模块化和简洁性。在Java中,我必须写很多原始文本来表达一个想法。在Lisp中,我可以编写一些自动生成该代码的宏,然后再使用这些宏。无论如何,您必须了解一些示例,然后自己判断。当我“看到”它时,我被震撼了,仅出于这个原因,我仍然认为Lisp是最出色的语言。我一直在寻找主流语言中的宏,以查看它们是否与Lisp宏的功能相匹配,但是到目前为止,我还没有找到任何宏。第四位紧随其后。

最后,我将对商业软件提出一些批评:

  1. 商业软件需要库,也需要好的库,而Lisp在这方面并不擅长。我通常不需要它们,但是当我这样做时,我必须从少数人使用的一些不完整软件中进行选择。我应该解决这个问题,我想...

  2. 商业软件通常是由大批人构建的,我认为宏可能会阻碍通信,因为宏会改变语言。即使程序文本更长且更具重复性,许多程序员也更愿意检测代码中的某些模式。我想在ITA他们有一些有关宏的规则,或者它们有一个庞大的宏库使协作变得容易(或更简单地说,所有程序员都是Lisp专家)。


7
尝试clojure,这对JVM来说是轻率的。因此,通过使用JVM,您可以使用所有Java东西。
Zachary K

@zachary:JVM上至少有2个Common Lisp实现。ABCL相对成熟。
拉里·科尔曼

Clojure是100%与Java兼容的(至少我从未在Java中找到Clojure无法改进的任何东西,而且Javaists不会抱怨这种方式)。Clojure在很大程度上受Common Lisp和FP的影响。有了SBCL,CLisp和Emacs,如今任何Lisper都应该像国王一样。
Reb.Cabin '16

13

我不喜欢Lisp。

(我确实喜欢它使用的许多概念,如何使本机可用的强大技术等等。

但是我从来没有说过要真正使用它((即使有几个人已经尝试过),因为该语言的好处可以通过其他编程语言(一些直接或间接)实现,所以没有足够的好处让我花时间学习它并忍受可怕的语法。)))

但是,是的,出于某些人喜欢的原因,请检查以下堆栈溢出问题:

与此相关的问题中可能还有更多。


26
“使用可怕的语法”。也许从我成为Lisp新手开始就已经太久了,但是Lisp语法的简单性和规则性是一个巨大的功能,因为这使我可以扩展Lisp本身。我可以添加自定义迭代器,也可以添加新的“ with-xxx”作用域结构,这些结构会在执行完后自动清除,因此开发人员不必这样做,等等。语法是一种功能,而不是错误。
Michael H. 2010年

5
自身扩展语言的能力不需要将语法限制为六个字符。另外:“语法是功能,而不是错误”?- 我知道。我没有称它为错误。
彼得·布顿

8
好的,您如何获得宏系统的好处?在一个相当短的章节中,有多少种语言允许您为它们构建面向对象的扩展(Paul Graham,“ On Lisp”)。
David Thornley,2010年

6
语法没有其他语言那么恐怖。我发现一段时间后括号只是在视觉上“消失”了。通过良好的缩进,代码易于阅读。
巴里·布朗

8
但是,具有在S表达式之间轻松移动的能力似乎是巨大的……然后,在括号的主题上,我喜欢以下引用:括号?什么括号?自从Lisp编程的第一个月以来,我还没有发现任何括号。我想问那些抱怨Lisp括号的人是否被报纸上所有单词之间的空格所困扰”-肯·蒂尔顿
塞德里克·马丁

9

我将把“ Lisp”解释为“ Common Lisp ”;我毫不怀疑其他答案会说“ 计划 ”。(提示:Lisp是一门语言。)

“更快”是什么意思?就运行基准测试所花费的时间而言,不,它不比C快(但可以)。

“快速”方面的问题是,Joe Random Hacker花了多长时间编写一个正常运行的程序或修复了大型软件系统中的错误?几乎可以确定。

对于这个黑客,我之所以使用它是因为我想编写代码,而不是样板。我想只写一次,而不要不断重复自己。而且我想在编写程序时与程序进行交互。


如果您可以在编辑器中编写一个可以立即对其余代码进行某些操作的小函数,那岂不是很棒吗?还是可以做到这一点?
Mark C

4
@Mark:我认为您是在描述Emacs。
Ferruccio

@Ferruccio我认为您必须先运行代码。
Mark C

2
@Mark C:好的,您必须先突出显示区域,然后再突出显示M-x eval-region(或eval-buffer),仅此而已。
Frank Shearar 2011年

1
@MarkC:另外,如果您位于暂存缓冲区中,则只需编写函数并按C-j(在道德上等同于enter),它将立即生效。
蒂洪·耶维斯

7

我喜欢Lisp,因为它是表达思想的绝佳媒介。我最喜欢的语言的谓词是“如果我能挑出任何东西来表达想法,那将是什么?”。当前是Lisp *(具体来说是Scheme),以至于我发现自己在其中编写了编程说明。作为IRL,纸笔笔记。即使在考虑程序时,也需要在PHP或Ruby或Python中实现。

这不是我自学的窍门,也不是我为获得书呆子信誉所做的事情(无论如何,没人会看到笔记本的内部)。Lisp 对我的思考比任何其他选择都更加自然,任何与您产生共鸣的语言都是您珍惜的语言。

*不过,作为一个脚注,Haskell将在我了解更多信息后迅速缩小差距。


6

问题是力量。功率=工作(程序功能)/时间

“我们并没有赢得Lisp程序员的青睐;我们追求的是C ++程序员。我们设法将其中许多人拖到Lisp的中间。”

-Java规范合著者Guy Steele

在C ++和Java之间绘制某种曲线。继续前进,沿路线的某个点您会发现Lisp。


2
这里的问题是,使用Java时,您失去了很多C ++功能,但是使用Lisp时,又重新使用了它(通常以改进的形式)。
David Thornley

@DavidT该确切引号上的SO问题具有到源的链接(搜索“引用”)。此报价不应被当真。
Mark C

@David:就像宏一样。不仅仅是因为他们放弃了使用Java(以及使用C#)的机会,而且还使缺少它们的人成为了“美德”。如果我要在基本语言之上构建DSL,则宏非常方便。
Mike Dunlavey

@Mike Dunlavey:我真的不喜欢C ++中的宏(哎呀,我不喜欢C语言中的宏,但是那里没有太多选择)。我真的很喜欢Common Lisp中的宏。您知道,我认为我的评论的问题在于,与Java相比,我更喜欢C ++和Common Lisp。
David Thornley

@David:我和您100%都支持Lisp中的宏。在C / C ++,他们是丑陋的,容易被滥用,但对于那种(诚然条纹)的东西我做的,他们是那么有总比没有好得多。当然,当我在C ++中执行此操作时,它很可能被视为滥用,但在Lisp中,它被热情地视为聪明。去搞清楚。
Mike Dunlavey

6

保罗•格雷厄姆(Paul Graham)自己在“使Lisp与众不同的原因”中回答了这个问题。

请记住,他是在1990年代中期将其用于创业的,因此PythonRuby在那时还没有真正成熟(甚至可能还没有诞生)。

Lisp基本上具有动态语言的所有优点,并且我认为对于当今的大多数Web应用程序,Python和Ruby都很棒,它们具有框架和文档以及活跃的社区的优点。

杀手级功能可能是整个程序都是由表达式组成的。这意味着您可以将一些代码块传递给函数(或宏...),因为代码块不过是一个表达式。

Python并不完全具有此功能。您必须定义函数并传递它们。Ruby似乎有块,与Lisp可以做的相比,也许有些局限(我不确定)。


保罗·格雷厄姆(Paul Graham)的文章很有趣,因为除了一些项目外,如今大多数语言似乎都具有他列出的功能。所以也许Lisp在那个年代更有吸引力。如今,作为引入这些功能的语言更有价值吗?
安德列斯·F

AST作为语言语法仍然是Lisp的领域。我不知道在编译期间宏可以使用全部语言的非lisp语言(是的,编译器基本上将宏调用交给了本身就是Lisp程序的宏定义。您想在编译时在宏中执行http和db ?)
przemo_li

6

过去,我对Scheme有过分的反应,但现在我可以试一试 Lisp(实际上是Clojure)。

您会看到,多年来,我学习了Java,C#,C ++,Python之类的语言,这些东西不再具有挑战性。

Clojure具有许多前景,看起来非常干净,并且可以解决许多实际问题。像Clojure这样的简洁语言的一个有力例证是多核计算机的出现。

是的LISP!

编辑:ITA软件是由MIT毕业生创建的,而Scheme / Lisp是许多MIT毕业生学习的唯一语言。公平地说,可以在正在运行的生产系统上热交换Lisp算法,这是一个巨大的优势。


8
回复:事情不再具有挑战性-让Haskell努力,让我们知道您的想法。此外,您始终可以尝试学习一些INTERCAL进行更改!
Mark C

3
@Mark C,对不起,但我没有碰INTERCAL。挑战不是唯一标准。它也必须能够快速解决实际问题。至少Haskell被许多人使用和喜爱。
工作

当然,那是在开玩笑。
Mark C 2010年

1
在生产服务器上更新运行代码(小心!)是Lisp的乐趣之一,是的。Python,至少在我玩它的时候,做得不好。您必须手动重新编译引用您所做更改的所有函数/方法,而所有Common Lisp实现都可以为您处理。我使用相同的功能进行开发:编写,测试某些东西,编辑,测试-无需编译循环,并且您可以进行交互式测试,并根据需要将其转换为单元测试。
Michael H.

@工作我忘了... PLEASE
Mark C

6

我喜欢Lisp的地方在于它超越了范式。有人会说Lisp是功能性的,其他人会说它是声明性的,其他人会说它是多范式的。我认为所有这些都错了。当您使用Lisp时,范式不再是约束。

想要对象吗?您可以拥有它们。需要函数式编程吗?你可以拥有它。是否需要Prolog风格的逻辑编程?写一些宏。是否需要SQL风格的声明式编程?去吧。是否要使用尚未发明的范例?我相信可以在Lisp中完成。

除了类似Forth的语言之外,我还没有看到另一种语言提供这种级别的灵活性。


+1多范式编程,比F#提前了几十年,非常好。
2011年

我希望我可以投票十次。没有汤匙...没有范式...它非常准确地描述了我对Common Lisp的感觉:)
MadPhysicist

5

衡量“更快”并非一件容易的事,它实际上取决于您基准测试的哪个方面。根据任务和Lisp的实现,速度可以接近C。查看“最佳基准大战”以深入了解细节。Lisp的SBCL实现与Java 6 Server相当,并且比Ruby或Python快得多。

但是,纯粹的速度并不是选择编程语言的主要原因-如果是这样,我们仍然会使用汇编语言进行编程,对吗?对我来说,Lisp的日常乐趣在于代码已被编译,但我不必关闭应用程序,重新编译所有内容,然后从头开始运行。相反,我可以更改一个函数,并且该更改将在所有地方生效,并且可以立即在应用程序中看到该效果。此外,这种非常快速的“编写,测试,编写更多,测试更多”方法使编写代码时立即进行前端测试变得更加容易(然后您可以稍后将这些交互式探针转换为单元测试)。

想象一下在每行之后写电子邮件的地方,您必须单击一个按钮将电子邮件输出编译到屏幕上,然后再继续思考。这就是用Java或其他类似语言编写的内容。有时候,这样做是有原因的,我喜欢Java,但Lisp的响应速度更快,并且更容易完成工作。


如果我今天刚从头开始,我可能会选择Ruby-它继承了Lisp的大部分特性,但是它具有更现代的库和一个推动它前进的仁慈独裁者。但是,这不是OP提出的问题。
Michael H. 2010年

实际上,我确实选择了红宝石作为起点,现在我正在尝试学习newLisp。
philosodad 2011年

5

我学习Lisp(newLisp)的原因有两个。

原因一:Lisp使我有不同的想法,这使我成为更好的Ruby编码器。

用Lisp进行某些处理似乎很尴尬,例如嵌套迭代要遍历多个列表。因此,它迫使我使用其他东西,例如map。我最喜欢的语言Ruby具有相同的映射方法,但我并不总是使用它,因为它并不熟悉:我学会了使用一种较差的技术来做事,并且当该语言支持该技术时,我会继续使用它。

原因之二:Lisp实用且拥有良好的现代图书馆。

有用于newLisp称为一个非常漂亮的,轻量级的Web框架蜻蜓。这使我可以使用newLisp代码而不是PHP来完成某些任务。我不太喜欢PHP,对于这个特定任务,newLisp比Ruby更有趣。

原因三:Lisp在语法和概念上是一致的。

对我来说,这是Ruby和Python之间的最大区别,即一致性。


+1:“ Lisp在语法和概念上是一致的。” 这是语言的一个非常重要的特征。一些设计不良的语言缺乏一致性,它们就像是按某种顺序扔在一起的大量成语(我想到的是一种语言,但我不会命名它:-))。Lisp在这方面非常一致。一有时间,我一定会尝试学习的。
乔治

4

您可以说“品牌忠诚度”吗?

我从Fortran开始。我爱它。

我切换到Lisp。起初我讨厌它。然后我学会了爱它,讨厌Fortran。

后来Pascal,C,C ++,各种汇编程序,C#。(实际上我不喜欢C#。)

我想我善变吗?


4

创建Lisp时,它们是从数学开始的,而不是计算机科学(这实际上还不存在)。Lisp团队确实做了一些正确的事情。Lisp在1960年左右收集了垃圾!他们确实做得很好。

我认为《永恒的火焰》歌曲涵盖了这一点。


是的,显然Lisp是第一种GCed语言。
Mark C

2

一个吸引人的地方就是社区。自从该语言发明以来,Lisp就吸引了最有雄心和最聪明的开发人员。在研究人员试图解决尚未解决的问题的任何地方,您都可能会发现Lisp,例如人工智能(AI)研究,计算机视觉,计划,知识表示和复杂的启发式优化。该语言适合同时解决自下而上和自上而下的问题,这似乎有助于应对最艰巨的挑战。

通过宏的可扩展语法意味着几乎不需要扩展语言定义。Lisp只是一个宏而已,它需要以更受限的语言进行语言扩展的许多功能。因此,Lisp程序员可以自由使用新发明的语言概念,而无需使用新的语言标准,也不必真正提高速度。从根本上讲,通过少量扩展就无需大量样板代码。控制流中的全新思想,例如Prolog风格统一,可以有效,紧凑地实现为扩展。

就灵活性而言,OOP系统CLOS具有其自己的一类。领会到基本的C ++ / Java / C#OOP是非常困难的。GoF  5设计模式变得不必要,因为它们可以简单直接地表达。

该语言没有单一的公司所有者,也没有单一的最终实现,尽管它确实具有ANSI标准以及许多一致的实现。每十年就会出现重大的新实现,而旧的仍然很活跃。专家可以计划在很长一段时间内使用他们的专业知识。这的确引起了一些无政府主义的摩擦和社区的分裂,但是这也意味着,由于公司或项目的政治原因,地毯无法被拉开,语言也不会消亡。总是有多种商业和开放源代码实现正在研究中。更加注重性能的代码定期以最快,资金雄厚的命令式语言实现的2倍作为基准。

Lisp早期商业化的致命弱点是内存占用,以适应语言的类型安全功能和它们所包含的高级软件开发环境,并具有令人难以置信的功能,例如完整的在线文档(包括图形)。与8 MB Sun工作站相比,64 MB Symbolics Lisp计算机在成本上不可行。如今,RAM价格暴跌,并且Lisp语言引起了极大的兴趣,特别是考虑到当今主流的Java,C#和PHP语言在30年前的发展仅很小。

现在有与Lisp竞争的现代语言,可以与智能开发人员进行思想共享:Python,LuaErlangHaskellOCaml。但是,它们都没有提供相同的成熟度,适应性,多种符合标准的实现和速度的组合。


1

我实际上没有做Lisp。但是我工作的地方是有限元素的,主要是Fortran的数百万行。在这里,我最尊重计算人员(对计算流体力学进行编码)的人认为,理想的组合是外部使用Lisp(主要是因为避免了内存管理方面的麻烦问题),而Fortran适用于低级算法(Fortran最适合用于开发)SSE / AVX的向量功能,我们认为这种领先优势不太可能关闭)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.