为什么要学习Lisp?[关闭]


125

我真的觉得我应该学习Lisp,并且那里有很多好的资源可以帮助我做到这一点。

我不会为复杂的语法所困扰,但是我会在“传统商业程序设计”中找到合适的地方使用它而不是过程语言。

有没有用Lisp编写的商业杀手级应用程序?


5
很难被不存在的东西拖延。
卡兹(Kaz)2012年

阅读Philip Greenspun的简历。真正的Lisp工作非常流行。
卡兹(Kaz)2014年

1
也在这里。Greenspun从事使用Lisp或涉及Lisp的数据包交换网络仿真,DSP设计,处理器设计,VLSI布局,机械工程自动化,土方工程自动化等等。他使用Lisp机器上开发的工具帮助设计了惠普的PA-RISC体系结构。
卡兹(Kaz)2014年

以下是在Lisp中开发的一些应用
-Emacs

Answers:


55

Lisp的主要用途之一是在人工智能中。我大学的一个朋友上了研究生AI课程,他为他的主要项目写了“在Lisp中 Lights Out ”求解器。他的程序的多个版本使用了稍有不同的AI例程,并在40台左右的计算机上进行了测试,得出了一些非常整洁的结果(我希望它可以在线链接到我的电脑上,但我认为不是)。

两个学期前,我使用Scheme(一种基于Lisp的语言)编写了一个交互式程序,该程序模拟了Abbott和Costello的“ Who's on First”例程。将来自用户的输入与一些非​​常复杂的数据结构(类似于其他语言的地图,但更加灵活)进行匹配,以选择适当的响应。我还编写了一个例程来解决3x3 幻灯片难题(该算法可以轻松扩展到更大的幻灯片难题)。

总而言之,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用,但正如许多其他人所述,这是极其宝贵的学习经验。使用Lisp之类的功能语言进行编程也将帮助您进行递归思考(如果您在使用其他语言进行递归时遇到麻烦,这可能会很有帮助)。


5
为什么说Lisp只对AI有好处?而且,它是一种多范式语言。功能只是它启用的几种范例之一。
路易斯·奥利维拉

6
我不是说它仅用于AI,而是说AI的主要用途之一。你读过它吗?
贾斯汀·贝内特

32
“请不要假设Common Lisp仅对数据库,单元测试框架,垃圾邮件过滤器,ID3解析器,Web编程,Shoutcast服务器,HTML生成解释器和HTML生成编译器有用,仅因为这些是恰好在其中实现的东西这本书实用CL”
Mikael Jansson

23
@JustinBennett是的,你说了。在这里:“总的来说,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用”。我讨厌人们在错误的情况下发生对抗。
卢卡·拉米什维利

127

Lisp是一种庞大而复杂的语言,具有庞大而复杂的运行时来支持它。因此,Lisp最适合大型和复杂的问题。

现在,一个复杂的问题是不一样的一个复杂的一个。一个复杂的问题是有很多小细节的问题,但这并不难。编写机票预订系统是一项复杂的业务,但是有了足够的资金和程序员,这并不难。有所不同?

一个复杂的问题是一个令人费解的问题,传统的分而治之是行不通的。控制机器人,或使用非表格数据(例如语言)或高度动态的情况。

Lisp非常适合解决方案必须扩展的问题。经典示例是emacs文本编辑器。它是完全可编程的,因此它本身就是一个编程环境。

在他的著名著作PAIP中,Norvig说Lisp是探索性编程的理想选择。也就是说,为尚未完全理解的问题编写解决方案(与在线预订系统相对)。换句话说:复杂的问题。

此外,学习Lisp会让您想起一些被遗忘的基本知识:冯·诺依曼和图灵之间的区别。众所周知,图灵的计算模型是一个有趣的理论模型,但对于设计计算机却毫无用处。另一方面,冯·诺依曼(Von Neumann)设计了一个计算机和计算执行方式的模型:冯·诺依曼(Von Neumann)模型。冯·诺依曼模型的核心是只有一个内存,并在其中存储代码和数据。请注意,Java程序(或C#或您喜欢的任何东西)是Turing模型的体现。一劳永逸地将程序设置为具体。然后,您希望可以处理所有抛出的数据。

Lisp维持冯·诺伊曼(Von Neuman)模型;在代码和数据之间没有明确的预定边界。使用Lisp编程可以让您放心使用冯·诺依曼模型的强大功能。使用Lisp进行编程可以使您以新的眼光看待旧概念。

最后,是交互式的,您将在开发程序时学习与程序的交互(而不是编译和运行)。这也改变了编程的方式以及查看编程的方式。

有了这个介绍,我终于可以回答您的问题:您会找到比“传统”语言更好的地方吗?

如果您是高级程序员,则需要高级工具。而且没有比Lisp更先进的工具。或者换句话说:如果您的问题很困难,答案是肯定的。没有其他。


30
“但是有了足够的钱和程序员,这并不难” –也就是说,如果有足够多的程序员,这将变得不可能;-)
JonasKölker09年

我已经读过lisps即时生成代码的能力,但是我也读过它可以被编译。.是否有可以混合解释和编译执行的实现?还是其中包含自己的编译器?
centaurian_slug 2011年

@centaurian_slug:是的,绝对如此。这就是力量的一部分。任何没有被故意削弱的版本都将在运行时提供其编译器/解释器。因此,例如,开发人员可以登录其Web服务器上的特殊连接,进行一些调试,更新一些类和函数的定义,并在需要时可以重新编译依赖于那些定义的内容。在服务器启动和运行期间。大概在一个企业不合法的担心SOX合规性,但是这是一个原因,行业使用新空房禁地语言如Java和C#
詹姆斯


46

复杂的语法

Lisp的语法非常简单

用Lisp编写的Killer应用程序:emacs。Lisp允许您随意扩展emacs,以执行编辑器可能会想到的几乎所有操作。

但是,如果需要,您应该只学习Lisp,而且您可能永远都不会在工作中使用它,但是它仍然很棒。

另外,我想补充一点:即使您找到了可以使用lisp的地方,您也可能不会说服其他人将其用于Java,C ++,C#,Python,ruby等。


@Justin:值得注意的是emacs核心是用C编写的。但这只是挑剔-所有命令都是用elisp编写的。
伯纳德

3
或更确切地说,通用lisp的核心语法很简单。defmacro允许扩展语法,并且某些内置宏(例如defmacro)会变得异常复杂。Lambda列表,嵌套的反引号等
Aaron

可以肯定地说emacs的C部分是粘合代码。
卢卡·拉米什维利

根据Emacs参考手册,“ Emacs中的大多数编辑命令都是用Lisp编写的;少数例外本可以用Lisp编写的,但是为了提高效率,使用C代替。” gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch,


17

我用Lisp专业编程大约一年,这绝对值得学习。通过能够在可能的地方用函数替换所有样板代码,而在可能的地方不使用宏,您将有无与伦比的机会来消除代码中的冗余。您还将能够在运行时访问无与伦比的灵活性,从而在代码和数据之间自由转换。因此,Lisp真正发挥作用的地方是用户操作可以触发需要动态构建复杂结构的需求。流行的航空公司航班时刻表是用Lisp编写的,并且Lisp中也有很多CAD / CAM。


9

如果您喜欢编程,则应该学习Lisp的纯粹乐趣。XKCD完美地表达了随之而来的智力启蒙。学习Lisp对程序员而言,冥想对和尚而言(我的意思是,这没有任何亵渎的含义)。


9

Lisp对于创建少量DSL非常有用。我有一个Lisp的副本在运行中的Box中运行,我写了一些DSL来查询SQL Server数据库并在C#中生成数据层等。现在,我所有的样板代码都写在输出到C#的lisp宏中。我用它生成HTML,XML和各种各样的东西。虽然我希望可以将Lisp用于日常编码,但Lisp可以带来实际的好处。



5

如果不使用一种语言的通用缩进约定,则任何一种语言看起来都会困难得多。当人们遵循Lisp时,就会看到它如何很容易地表达语法树结构(请注意,这不太正确,因为预览位置有点; r应与递归quicksort参数中的fns对齐):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))

1
我认为您的言论受到了公正的批评。我的意思只是说:“它看起来比您介绍的要难得多,并且看起来比这里介绍的要清晰得多”。我认为您必须同意,如果不遵守缩进约定,许多语言看起来会更加混乱。此外,如果我们比较一下Java和Lisp的缩进,我会说它们通常需要对每种语言的基本构造有相同程度的了解才能正确缩进。但是,可以说尽管看起来仍然很主观,但这是很公平的。
约翰与华夫饼,2010年

1
为了简化一点,您可以使用标准,letdefun在函数开始时使用a 来定义fn它,因为它不会更改。
亚伦·罗布森

4
@FerretallicA您是根据什么来确定某事物是“易于人类阅读”还是“自我描述”的?与英语相似?中文“容易被人类阅读”吗?那数学符号呢?是否“不容易被人类阅读”?这种说法令人讨厌,因为它的隐藏信息是:“这看起来不像我最初学会推理的方式。”

3
更像是您的“反驳”听起来像“呜呜呜呜”。尝试编程语言嗅探测试。带一个以前没有编程的人给他们看VB代码页面和Lisp代码页面。我会很乐意打赌,随便观察者可以更轻松地从这两个观察器中提取有意义的观察结果。
nathanchere 2013年

1
我不知道中文,日文,韩文,苏美尔文,印地文或阿拉伯文的非编程人员会如何看待您的粗鲁愿望,希望放弃您的睾丸以进行轻松的辩论。

4

我发现学习一种新语言始终会影响您已经知道的语言的编程风格。对我来说,它总是使我以不同的方式思考以我的主要语言Java解决问题。我认为,总体而言,它只是拓宽了您的编程视野。


这是因为您是一个优秀的程序员。糟糕的程序员不会用新知识来影响旧技能,而会以已知的语言思考,而用新的语言进行写作。但是为什么在Lisp之后使用Java?:) Java在Lisp,imo之后最难使用。
卢卡·拉米什维利

4

如果您必须问自己是否应该学习口齿不清,您可能不需要。


8
我会说相反的话:如果您已经因为使用类似语言的经验而了解lisp,则可能没有必要。如果您不了解Lisp所提供的功能,那么您可以从中受益。
福斯先生08年

@MrFooz没有类似的语言可以消除学习lisp的lispy部分的需要。没有任何语言可以找到lisp的主要功能。虽然大多数。
卢卡·拉米什维利

根据您的目标。如果您想死,就不需要呼吸。但这并不意味着您不应该这样做。
mimoralea 2014年

4

我在八十年代的大学里参加了“ lisp课堂”。尽管所著的Grokking在课堂上讲解的所有概念,我被留下,不用任何的什么使口齿不清高度赞赏。恐怕很多人将Lisp视为另一种编程语言,这就是这么多年前大学课程为我所做的。如果您看到有人抱怨Lisp语法(或缺乏Lisp语法),那么他们很可能是未能掌握Lisp的伟大之处的人之一。我很长一段时间就是其中之一。

直到二十年后,当我重新点燃了对Lisp的兴趣时,我才开始“发现”了使Lisp变得有趣的东西-无论如何对我来说。如果您在学习Lisp时没有被闭包和Lisp宏吓到,那么您可能已经错过了重点。


我同意那个。我目前正在第二次进军Lisp,距离学校5年了。Lisp的一词在您还很绿的时候可能没有足够的效果-我记得我只专注于元编程,而对元编程和灵活性还不了解。
亚伦,

4

学习LISP / Scheme可能不会给您任何增加的应用程序空间,但是它将帮助您更好地理解函数式编程,其规则和异常。

仅仅花时间去学习六个嵌套纯函数的美,以及六个带有副作用的嵌套函数的噩梦,这是值得的时间投入。


4

http://www.gigamonkeys.com/book/introduction-why-lisp.html

关于Lisp的最常见的神话之一是它是“死的”。的确,Common Lisp没有像Visual Basic或Java那样得到广泛使用,但描述一种继续用于新开发并继续吸引“死者”新用户的语言似乎很奇怪。Lisp最近的一些成功案例包括Paul Graham的Viaweb,当Yahoo收购了他的公司时,该公司成为Yahoo Store。在线售票员Orbitz等使用的ITA Software机票价格和购物系统QPX;顽皮狗针对PlayStation 2,Jak和Daxter的游戏,很大程度上是用特定领域的Lisp方言编写的。还有Roomba 自主机器人吸尘器,其软件用L(Common Lisp的向下兼容子集)编写。也许更能说明问题的是,Common-Lisp.net网站(该网站托管了开源的Lisp Lisp项目)的增长以及过去几年中如雨后春笋般涌现的本地Lisp用户组的数量。



3

我同意Lisp是您在商业环境中永远不会使用的那些语言之一。但是,即使您不懂,学习它肯定也会扩展您对整个编程的理解。例如,我在大学期间学习过Prolog,虽然以后从未使用过,但是我使我对许多编程概念有了更深入的了解,并且(有时)对我使用的语言有了更好的理解。

但是,如果您要学习它……一定要阅读《关于Lisp》


小提示:关于Lisp,不是Lisp的合适介绍,请先阅读其他内容。我建议实用Lisp。
路易斯·奥利维拉(

3

学习Lisp将使Java完全不同!Lisp确实迫使您掌握递归和整个“作为一流对象的功能”范式。请参阅Crockfords关于Scheme vs Javascript的出色文章。Java语言也许是当今最重要的语言,因此更好地理解它非常有用!


1
最重要的语言?先生,我想不是。
TraumaPony

7
嗯,它几乎可以在任何具有Web浏览器的设备上使用(可能有一些没有),因此就运行最终用户应用程序的语言而言,它可能是全球编程语言中普及率最高的。显然,您对重要内容的看法可能完全不同。会用于治疗癌症吗?可能不是。但是,不管您喜不喜欢,它将成为未来几年(Web)应用程序开发的基石之一。
艾伦·哈沃森

1
我也走了!尽管我已经在使用Javascript的功能和原型设计功能,但是在学习了Lisp之后,Javascript对我还是一种新语言。
Luka Ramishvili

3

金普(Gimp)的剧本赋是令人垂涎的。那是一个photoshop-killer应用程序。


3

好的,我可能很奇怪,但是我真的不喜欢Paul Graham的论文,如果您还不了解Common Lisp,那么关于Lisp的书将是一本非常粗糙的书。相反,我会说Siebel的《实用Common Lisp》。至于“杀手级应用程序”,Common Lisp似乎在诸如ITA之类的小众商店中都可以找到它的位置,因此,虽然没有像CL一样同义词的应用程序,但Rails还是Ruby的,但如果您愿意的话,行业中也会有使用它的地方。有点挖。


2

语法复杂吗?Lisp的优点在于它具有非常简单的语法。它只是一个列表,列表中的每个元素可以是另一个列表或基本数据类型。

这是值得学习的,因为它增强了您的编码能力,可以将功能作为另一种数据类型进行思考和使用。这将改善您使用命令式和/或面向对象的语言进行编码的方式,因为它将使您在代码结构方面更加灵活。


2

要添加其他答案:

因为SICP课程(此处提供视频)非常棒:可以教您Lisp 以及更多内容



2

您今天可以使用Clojure在Java VM之上编写测试和脚本。尽管在JVM上实现了其他Lisp语言,但我认为Clojure在与Java集成方面做得最好。

有时,Java语言本身会妨碍编写Java代码测试(包括“传统商业编程”)。(我并不是说要对Java提出起诉-其他语言也会遇到同样的问题-但这是事实。既然不是Java,而是主题,我就不再赘述。如果有,请随意开始一个新主题有人想讨论它。)Clojure消除了许多障碍。


2

Lisp可以在使用传统编程的任何地方使用。没什么不同,只是功能更强大。编写网络应用程序?您可以在Lisp上完成编写桌面应用程序吗?您可以在Lisp上执行此操作,无论如何,您可能可以在Lisp,Python或任何其他通用编程上执行(有几种语言仅适合一项任务)。

最大的障碍可能是您的老板,同事或客户的接受程度。那是您必须与他们合作的事情。选择一个实用的解决方案,例如Clojure,可以利用从JVM到库的Java基础结构的当前安装基础,可能会有所帮助。另外,如果您有Java程序,则可以做一个插件架构,并为其编写Clojure插件,最后用Clojure编写一半的代码。


1

这不是原因,但(平凡的)AutoCAD具有LISP和DCL运行时支持。如果您不想使用VBA或其C ++或.NET SDK,或者DIESEL表达式不能剪切它,这是一种编写复杂宏(包括ActiveX自动化)的便捷方法。

AutoCAD的许多功能实际上都是LISP例程。


1

这是我本人已经思考了一段时间的话题,但我还没有真正决定,因为平时是主要问题...;)

由于在这篇文章中找不到这些链接,因此出于公共利益考虑将它们添加:

成功与失败的故事: 在JPL上倾听

真正令人印象深刻的成功故事: Orbitz公司使用Lisp

是否使用Lisp代替Java的比较和分析: Lisp替代Java




0

杀手级应用?ITA Software的航班搜索引擎就是其中之一。

至于“为什么”,它很可能使您成为更好的开发人员,而极不可能使您变得更糟。但是,与其他语言相比,它可能会让您更喜欢Lisp方言。

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.