我为什么要学习Lisp?
我真的觉得我应该学习Lisp,并且有足够的资源来帮助我做到这一点。
我不会因为复杂的语法而拖延,但是在“传统的商业编程”中,我会发现使用它来代替程序语言是有意义的。
那里有一个用Lisp编写的商业杀手级应用程序吗?
Lisp的主要用途之一是人工智能。 我在大学的一个朋友参加了一个研究生AI课程,在他的主要项目中,他在Lisp写了一个“ Lights Out ”求解器。 他的程序的多个版本使用了稍微不同的AI例程,在40台左右的计算机上进行了testing,得到了一些相当整洁的结果(我希望它可以在某处连接到我,但我不认为是这样)。
两个学期之前,我使用Scheme(一种基于Lisp的语言)来编写一个模拟Abbott和Costello的“Who's First”例程的交互式程序。 来自用户的input与一些相当复杂的数据结构(类似于其他语言的地图,但更灵活)匹配,以select适当的响应。 我还写了一个例程来解决一个3×3 幻灯片拼图 (一个algorithm,可以很容易地扩展到更大的幻灯片拼图)。
总之,学习Lisp(或Scheme)可能不会产生许多AI以外的实际应用,但是像其他许多人所说的那样,这是一个非常有价值的学习经验。 用像Lisp这样的函数式语言进行编程也可以帮助你recursion地思考(如果你在其他语言的recursion方面遇到困难,这可能是一个很好的帮助)。
Lisp是一个庞大而复杂的语言,具有庞大复杂的运行时间来支持它。 出于这个原因,Lisp最适合于大型复杂的问题。
现在,一个复杂的问题不是一个复杂的问题。 一个复杂的问题是一个有很多细节的问题,但这并不难。 写一个航class预订系统是一个复杂的业务,但有足够的钱和程序员,这并不难。 获得差异?
一个复杂的问题是一个复杂的问题,一个传统的分而治之不起作用的问题。 控制机器人,或处理非表格(例如语言)或高度dynamic的情况下的数据。
Lisp非常适合解决scheme必须可扩展的问题。 经典的例子是emacs文本编辑器。 它是完全可编程的,因此它本身就是一个编程环境。
Norvig在他着名的书“ PAIP”中说,Lisp是探索性编程的理想select。 也就是说,对一个尚未完全理解的问题(与在线预订系统相对)进行编程。 换句话说:复杂的问题。
而且,学习Lisp会让你想起被遗忘的一些基本东西:冯·诺依曼和图灵之间的区别。 我们知道,图灵的计算模型是一个有趣的理论模型,但是没有用作计算机devise的模型。 另一方面,冯·诺依曼(Von Neumann)devise了计算机和计算如何执行的模型:冯·诺依曼模型。 冯诺依曼模型的核心是你只有一个记忆,并且在那里存储你的代码和你的数据。 请注意,Java程序(或C#或任何你喜欢的)是图灵模型的一种performanceforms。 你一劳永逸地设定你的程序。 那么你希望你能处理所有的数据。
Lisp维护冯·诺依曼模型; 代码和数据之间没有明确的,预先确定的边界。 Lisp编程打开了冯·诺依曼模型的力量。 在Lisp中编程让你以新的眼光看到旧的概念。
最后,互动,你将学习与你的程序交互,当你开发它们(而不是编译和运行)。 这也改变了你编程的方式,以及你查看编程的方式。
有了这个介绍,我终于可以回答你的问题:你会find超越“传统”语言的地方吗?
如果您是高级程序员,则需要高级工具。 没有比Lisp更先进的工具。 换句话说,如果你的问题很难,答案是肯定的。 没有其他的。
回应@lassevk :
复杂的语法 ?
lisp的语法非常简单 。
用lisp编写的杀手级应用程序: emacs 。 Lisp将允许您随意扩展emacs,以完成编辑可能做的任何事情。
但是 ,如果你愿意的话,你只应该学习lisp,而且你可能永远不会在工作中使用,但它仍然很棒。
另外,我想补充一点:即使你发现lisp有意义的地方,也许你不会说服其他人使用java,c ++,c#,python,ruby等等。
我不能从第一手的经验中回答,但是你应该阅读Paul Graham 在Lisp上写的东西。 至于“杀手级应用”部分,请阅读击败平均值 。
我在Lisp专业编程了大约一年,这绝对值得学习。 您将有无与伦比的机会去除代码中的冗余,能够用尽可能多的函数replace所有的样板代码,而不用代替macros。 您还可以在运行时访问无与伦比的灵活性,在代码和数据之间自由转换。 因此,用户操作可以触发需要dynamic构build复杂结构的情况是Lisp真正闪耀的地方。 受欢迎的航空公司航class调度程序是用Lisp编写的,在Lisp中也有很多CAD / CAM。
如果你喜欢编程,你应该学习Lisp的纯粹的喜悦。 XKCD完美地expression了随之而来的知识启蒙。 学习Lisp是为程序员打坐的佛教僧侣(我的意思是没有任何亵渎的内涵)。
Lisp对创build小型DSL非常有用。 我在工作中运行了一个Lisp的副本,我写了很less的DSL来查询SQL服务器数据库,并在C#中生成数据层等。 我所有的锅炉板代码现在都写在输出到C#的lispmacros中。 我用它生成HTML,XML和各种各样的东西。 虽然我希望我可以使用Lisp进行日常编码,但是Lisp可以带来实际的好处。
当不使用一种语言的通用缩进约定时,任何语言都会变得更加困难。 当我们跟随Lisp的时候,我们可以很容易地看到它是如何expression一个语法树结构的(注意,这并不完全正确,因为预览稍微有些; r应该和recursion的quicksort参数中的fns一致):
(defun quicksort (lis) (if (null lis) nil (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< ax)))) (append (quicksort (remove-if-not fn r)) (list x) (quicksort (remove-if fn r))))))
我发现,学习一种新的语言,总是会影响你的编程风格,你已经知道的语言。 对我来说,总是让我以不同的方式思考用Java这个主要语言来解决问题。 总的来说,我认为它只是在编程方面拓宽了视野。
学习LISP / Scheme可能不会给你任何增加的应用空间,但它会帮助你更好地理解函数式编程,规则和例外。
学习六个嵌套纯函数的美,六个嵌套函数副作用的噩梦是值得的。
从http://www.gigamonkeys.com/book/introduction-why-lisp.html
关于Lisp最常被重复的一个神话之一就是“死”了。 虽然Common Lisp不像Visual Basic或Java那样被广泛使用,但描述一种继续被用于新开发的语言并且继续吸引新用户为“死亡”似乎很奇怪。 最近Lisp的一些成功案例包括Paul Graham的Viaweb,当时雅虎收购了他的公司,成为了Yahoo Store; ITA Software的机票定价和购物系统QPX,由在线门票销售商Orbitz和其他公司使用; 淘气狗的游戏为PlayStation 2,Jak和达克斯特,主要是在一个特定领域的Lisp方言Naughty Dog发明的发明称为目标,其编译器本身写在Common Lisp; 以及自动吸尘器Roomba,其软件是用L编写的,这是一个向下兼容的Common Lisp子集。 也许更有说服力的是Common-Lisp.net Web站点的增长,它承载着开放源代码的Common Lisp项目,以及过去几年出现的本地Lisp用户组的数量。
我同意Lisp是在商业环境中可能永远不会使用的语言之一。 但是,即使你不去,学习它肯定会扩展你对编程整体的理解。 例如,我在大学学习了Prolog,虽然之后我从来没有使用过Prolog,但是我对许多编程概念有了更深入的了解,并且有时候对我使用的语言有了更多的理解。
但是,如果你要学习它……一定要阅读On Lisp
好吧,我可能会很奇怪,但是我真的不喜欢Paul Graham的文章,如果你对Common Lisp没有一点把握的话,那么Lisp是一本非常糟糕的书。 相反,我想说的是Siebel的Practical Common Lisp 。 对于“杀手级应用程序”,Common Lisp似乎在像ITA这样的利基商店中find了自己的位置,所以虽然没有与CL类似的应用程序,但Rails是针对Ruby的,在行业中有些地方可以使用它有点挖。
如果你不得不问自己,如果你应该学习lisp,你可能不需要。
学习lisp将把Javascript放在一个完全不同的灯光下! Lisp确实迫使你把握recursion和整个“作为一stream对象的function” – 范例。 请参阅计划与Javascript上的Crockfords优秀文章。 Javascript也许是今天最重要的语言,所以更好地理解它是非常有用的!
八十年代,我在大学里学了一堂“口语课”。 尽pipe在课堂上提出了所有的概念,但是我却没有理解什么使Lisp变得伟大。 恐怕很多人把lisp当作另外一种编程语言来看,这正是大学那么多年前为我所做的。 如果你看到有人在抱怨口齿不清的语法(或缺乏),那么他们很可能是那些没有把握唇语的人。 我是那些人很长一段时间的人之一。
直到二十年后,当我重新激起我对lisp的兴趣时,我才开始“find”让lisp有趣的东西 – 无论如何。 如果你设法学习lisp而不会被封闭和lispmacros所迷惑,那么你可能已经错过了这一点。
Gimp的脚本 – Fu是lipish。 这是一个Photoshop的杀手级应用程序。
复杂的语法? lisp的美妙之处在于它的语法简单得可笑。 这只是一个列表,列表中的每个元素可以是另一个列表或一个基本数据types。
这是值得学习的,因为它增强了你的编码能力,思考和使用function只是另一种数据types。 这将改进你在命令式和/或面向对象语言中编写代码的方式,因为这样可以让你在代码结构上更加灵活。
要添加到其他答案:
因为SICP课程(video在这里可用)是真棒:教你Lisp 和更多 !
杀手应用程序? 弗朗茨公司有一个很长的成功案例 ,但这个名单只包括AllegroCL的用户…可能还有其他人。 我最喜欢的是关于淘气狗的故事 ,因为我是Crash Bandicoot游戏的忠实粉丝。
为了学习Common Lisp,我推荐Practical Common Lisp 。 它有一个动手的方法,至less对我来说,比我看过的其他书更容易。
您今天可以使用Clojure在Java VM上编写testing和脚本。 虽然在JVM上还实现了其他Lisp语言,但我认为Clojure在与Java集成方面做得最好。
有时候,Java语言本身就会为编写Java代码(包括“传统商业编程”)编写testing。 (我不是说作为对Java的控诉 – 其他语言遭受同样的问题 – 但是这是事实。从题目,而不是Java,我不会详细说明。请随时开始一个新的话题,如果有人想讨论它。)Clojure消除了许多这些障碍。
“Lisp值得您学习深刻的启发经验,当您终于明白了时,即使您从未真正使用过Lisp本身,这种经验也会使您成为更好的程序员。”
–Eric S. Raymond,“如何成为黑客”
Lisp可以在任何使用传统编程的地方使用。 没有什么不同,它更强大。 写一个networking应用程序? 你可以在Lisp上做,写一个桌面应用程序? 你可以在Lisp上做,不pipe怎么说,你可以在Lisp,Python或其他通用编程(有几种语言只适合一个任务)上做。
最大的障碍可能是接受你的老板,你的同事或你的客户。 这是你必须与他们合作的事情。 select像Clojure这样的实用解决scheme,可以利用Java基础架构的当前安装基础,从JVM到库,可能会对您有所帮助。 另外,如果你有一个Java程序,你可以做一个插件架构,为它编写Clojure插件,最后在Clojure中写下一半的代码。
不是一个理由,但(微不足道的)AutoCAD有LISP和DCL运行时支持。 如果您不想使用VBA或其C ++或.NET SDK,或者如果DIESELexpression式不削减它,则编写复杂的macros(包括ActiveX自动化)是一种方便的方法。
很多AutoCAD的function实际上是LISP例程。
这是我自己曾经思考过的一个话题,但是我还没有真正做出决定,像往常一样,时间是主要问题…;)
而且由于我不能在这篇文章中find这些链接,所以我将它们添加为公共利益:
成功与失败的故事: 在JPL倾听
真正令人印象深刻的成功故事: Lisp在Orbitz公司使用
是否使用Lisp代替Java: Lisp作为Java的替代scheme的比较和分析
语法是无关的,可读性不是!
不要说这是一个杀手级的应用程序,但它看起来可能很酷http://code.google.com/p/plop/
杀手应用程序? ITA Software的飞行search引擎是一个。
至于“为什么”,这很可能使你成为一个更好的开发者,而且极不可能让你变得更糟。 但是,它可能会让你更喜欢lisp方言到其他语言。