我真的觉得我应该学习Lisp并且有很多好的资源可以帮助我做到这一点。
我并没有被复杂的语法所拖延,但在“传统商业编程”中,我会找到使用它而不是过程语言的地方。
那里有一个用Lisp编写的商业杀手级应用程序吗?
答案 0 :(得分:124)
Lisp是一种庞大而复杂的语言,具有支持它的大型复杂运行时。因此,Lisp最适合处理大而复杂的问题。
现在,复杂问题与复杂问题不同。 复杂问题是一个有很多小细节的问题,但这并不困难。编写航空公司预订系统是一项复杂的业务,但有足够的资金和程序员并不难。有所作为吗?
一个复杂的问题是一个复杂的问题,一个传统的分而治之无效的问题。控制机器人,或处理非表格(例如语言)或高度动态情况的数据。
Lisp非常适合解决方案必须可扩展的问题;经典的例子是emacs文本编辑器。它是完全可编程的,因此它本身就是一个编程环境。
在着名的书PAIP中,Norvig说Lisp是探索性编程的理想选择。也就是说,为一个尚未完全理解的问题(与在线预订系统相对)编制解决方案。换句话说:复杂的问题。
此外,学习Lisp会让你想起一些被遗忘的基本知识:冯诺依曼和图灵之间的区别。众所周知,图灵的计算模型是一个有趣的理论模型,但作为设计计算机的模型毫无用处。另一方面,冯·诺伊曼设计了一个如何执行计算机和计算的模型:冯·诺依曼模型。 Von Neumann模型的核心是你只有一个内存,并将你的代码和数据存储在那里。请注意,Java程序(或C#,或任何您喜欢的程序)是图灵模型的一种表现形式。您可以一劳永逸地设置您的程序。那么你希望你可以处理所有被抛出的数据。
Lisp维护Von Neuman模型;代码和数据之间没有明确的预定边界。 Lisp中的编程让您了解Von Neumann模型的强大功能。使用Lisp编程可以让您以全新的视角看待旧概念。
最后,在进行交互时,您将学习在开发程序时与程序进行交互(而不是编译和运行)。这也改变了你编程的方式,以及你查看编程的方式。
通过这个介绍,我终于可以回复你的问题了:你会找到比“传统”语言更胜一筹的地方吗?
如果您是高级程序员,则需要高级工具。并且没有比Lisp更先进的工具。 或者,换句话说:如果你的问题很难,答案是肯定的。没有其他。
答案 1 :(得分:57)
回应@lassevk:
答案 2 :(得分:55)
Lisp的主要用途之一是人工智能。我在大学的一位朋友参加了一个研究生人工智能课程,在他的主要项目中,他在Lisp中写了一个“Lights Out”求解器。他的程序的多个版本使用了稍微不同的AI例程,并且在40台左右的计算机上进行了测试,得到了一些非常简洁的结果(我希望它可以在某个地方联机,但我认为不是。)
两个学期前,我使用Scheme(一种基于Lisp的语言)编写了一个模拟Abbott和Costello的“Who's on First”例程的交互式程序。来自用户的输入与一些相当复杂的数据结构(类似于其他语言中的地图,但更灵活)相匹配,以选择适当的响应。我还编写了一个例程来解决3x3 slide puzzle(一种可以很容易扩展到更大幻灯片拼图的算法)。
总之,学习Lisp(或Scheme)可能不会产生除AI之外的许多实际应用,但正如许多其他人所说的那样,它是一种非常有价值的学习体验。用Lisp这样的函数式语言编程也可以帮助你递归思考(如果你在其他语言的递归方面遇到麻烦,这可能是一个很好的帮助)。
答案 3 :(得分:43)
复杂的语法 ??
lisp的语法是非常简单。
以lisp编写的杀手级应用:emacs。 Lisp将允许您随意扩展emacs以完成您可以想到的编辑器可能做的几乎任何事情。
但是,如果你想要,你应该只学习lisp,而且你可能永远不会在工作中使用它,但它仍然很棒。
另外,我想补充一点:即使你找到了lisp有意义的地方,你也可能不会说服其他人在java,c ++,c#,python,ruby等上使用它。
答案 4 :(得分:23)
我无法从第一手经验中回答,但您应该阅读Paul Graham撰写on Lisp的内容。至于“杀手级应用”部分,请阅读Beating the averages。
答案 5 :(得分:17)
我在Lisp专业编程了大约一年,这绝对值得学习。您将有无可比拟的机会从代码中删除冗余,能够在可能的情况下用所有函数替换所有样板代码,而在没有代码的情况下替换宏。您还可以在运行时访问无与伦比的灵活性,在代码和数据之间自由转换。因此,用户操作可以触发动态构建复杂结构的需求的情况是Lisp真正发挥作用的地方。受欢迎的航空公司航班时刻表是用Lisp编写的,Lisp中也有很多CAD / CAM。
答案 6 :(得分:9)
Lisp对于创建小型DSL非常有用。我在工作中运行的盒子里有一个Lisp的副本,我写了很少的DSL来询问SQL服务器数据库并在C#中生成数据层等。我的所有样板代码现在都是用输出到C#的lisp宏编写的。我用它生成HTML,XML,各种各样的东西。虽然我希望我可以使用Lisp进行日常编码,但Lisp可以带来实际的好处。
答案 7 :(得分:8)
如果您喜欢编程,您应该学习Lisp以获得纯粹的快乐。 XKCD完美地表达了随后的智力启蒙。学习Lisp对于程序员来说是禅修的冥想(我的意思是没有任何亵渎的含义)。
答案 8 :(得分:5)
当一个语言不使用语言的常见缩进约定时,任何语言都会变得更难。当一个人跟随Lisp时,人们会看到它如何很容易地表达语法树结构(注意,这不是很正确,因为预览有点; r应该与递归quicksort参数中的fns对齐):< / p>
(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))))))
答案 9 :(得分:4)
“Lisp值得学习,当你最终获得它时,你将获得深刻的启蒙经验;即使你从未真正使用Lisp本身,这种经验会让你成为更好的程序员。” / p>
- Eric S. Raymond,“如何成为黑客”
答案 10 :(得分:4)
来自http://www.gigamonkeys.com/book/introduction-why-lisp.html
最常见的一种 关于Lisp的神话是它已经“死了”。 虽然Common Lisp确实不是 像Visual Basic一样被广泛使用 或Java,描述似乎很奇怪 一种继续使用的语言 对于新的发展而言仍在继续 吸引新用户“死了”。一些 最近的Lisp成功案例包括 保罗格雷厄姆的Viaweb,成了 雅虎收购他的雅虎商店 公司; ITA Software的机票 定价和购物系统,QPX,使用 由在线售票员Orbitz和 其他;顽皮狗的游戏 PlayStation 2,Jak和Daxter,其中 主要写在一个 特定领域的Lisp方言Naughty 发明的狗称为GOAL,其中 编译器本身是用Common编写的 Lisp的;以及自治的Roomba 机器人吸尘器,其软件 用L写的,向下 Common Lisp的兼容子集。 也许更有说服力的是 Common-Lisp.net Web的增长 站点,主持开源Common Lisp项目,以及本地的数量 涌现出来的Lisp用户群 在过去的几年里。
答案 11 :(得分:4)
学习LISP / Scheme可能不会给你任何增加的应用程序空间,但它将帮助你更好地理解函数式编程,它的规则和它的例外。
值得投入的时间只是为了学习六种嵌套纯函数的美感差异,以及六种具有副作用的嵌套函数的噩梦。
答案 12 :(得分:4)
八十年代,我在大学读了一个“lisp课”。尽管学习了课堂上提出的所有概念,但我仍然没有任何赞赏使得lisp成为伟大的东西。我担心很多人将lisp视为另一种编程语言,这就是多年前大学里的这门课程。如果你看到有人抱怨lisp语法(或缺乏语法),那么他们很可能是那些未能掌握lisp优秀的人之一。很长一段时间我都是那些人之一。
直到二十年后,当我重新点燃我对lisp的兴趣时,我才开始“得到”让lisp变得有趣的东西 - 无论如何。如果你设法学习lisp而不会被闭包和lisp宏所迷惑,你可能会错过这一点。
答案 13 :(得分:4)
我发现学习一门新语言总会影响你已经掌握的语言的编程风格。对我来说,它总是让我以不同的方式思考用我的主要语言解决问题,即Java。我认为总的来说,它只是在编程方面拓宽了你的视野。
答案 14 :(得分:3)
学习lisp会让Javascript完全不同! Lisp真的迫使你把握递归和整个“作为第一类对象的函数” - 范式。请参阅Crockfords关于Scheme vs Javascript的优秀文章。 Javascript可能是当今最重要的语言,所以更好地理解它是非常有用的!
答案 15 :(得分:3)
如果你不得不问自己是否应该学习口齿不清,你可能不需要。
答案 16 :(得分:3)
Gimp的剧本 - 傅是嘴唇。这是一个photoshop杀手级应用程序。
答案 17 :(得分:3)
好吧,我可能很奇怪,但我真的不喜欢保罗格雷厄姆的文章那么多&amp;如果你已经掌握了Common Lisp,那么Lisp是一本非常粗略的书。相反,我会说去Siebel的Practical Common Lisp。至于“杀手级应用程序”,Common Lisp似乎在小众商店中找到了自己的位置,比如ITA,所以虽然没有一个与CL同义的应用程序Rails的方式对于Ruby来说,有些地方在行业中使用如果你做一点挖掘就行了。
答案 18 :(得分:3)
我同意Lisp是您在商业环境中永远不会使用的语言之一。但即使你没有达到,学习它肯定会扩展你对整个编程的理解。例如,我在大学学习了Prolog,虽然之后我从未使用它,但我让我对许多编程概念有了更多的理解,并且(有时)对我使用的语言有了更多的了解。
但如果您要学习它......请务必阅读On Lisp
答案 19 :(得分:2)
答案 20 :(得分:2)
杀手级应用? Franz Inc.有一长列success stories,但此列表仅包含AllegroCL的用户......可能还有其他人。我最喜欢的是the story about Naughty Dog,因为我是Crash Bandicoot游戏的忠实粉丝。
为了学习Common Lisp,我建议Practical Common Lisp。它有一个实践方法,至少对我来说比我看过的其他书更容易。
答案 21 :(得分:2)
您今天可以使用Clojure在Java VM上编写测试和脚本。虽然在JVM上实现了其他Lisp语言,但我认为Clojure在与Java集成方面做得最好。
有时Java语言本身会妨碍编写Java代码测试(包括“传统商业编程”)。 (我并不是说这是对Java的起诉 - 其他语言遭遇同样的问题 - 但这是事实。既然主题,而不是Java,我不会详细说明。请随意开始一个新主题有人想讨论它。)Clojure消除了许多这些障碍。
答案 22 :(得分:2)
Lisp可以在任何使用传统编程的地方使用。它并没有那么不同,它更强大。写一个网络应用程序?你可以在Lisp上编写桌面应用程序吗?你可以在Lisp上做,无论如何,你可以在Lisp,Python或任何其他通用编程上执行它(有一些语言只适用于一个任务)。
最大的障碍可能是接受你的老板,同事或客户。这是你必须与他们合作的东西。选择一个实用的解决方案,如Clojure,可以利用当前的Java基础架构安装基础,从JVM到库,可能对您有所帮助。另外,如果你有一个Java程序,你可以做一个插件架构并为它编写Clojure插件,最后在Clojure中写下你的一半代码。
答案 23 :(得分:2)
复杂的语法? lisp的优点在于它具有非常简单的语法。它只是一个列表,列表中的每个元素可以是另一个列表或基本数据类型。
值得学习,因为它增强了你的编码能力,可以将思考和使用函数作为另一种数据类型。这将改进您在命令式和/或面向对象语言中编码的方式,因为它可以让您在编写代码结构时更加灵活。
答案 24 :(得分:1)
这是我自己已经考虑了一段时间的话题,但我还没有真正做出决定,因为通常时间是主要问题......;)
由于我在这篇文章中找不到这些链接,因此我将它们添加为公众利益:
成功与失败的故事: Lisping at JPL
真正令人印象深刻的成功故事: Lisp in use at the Orbitz corporation
是否使用Lisp而不是Java的比较和分析: Lisp as an Alternative to Java
答案 25 :(得分:1)
不是理由,而是(微不足道的)AutoCAD有LISP&amp; DCL运行时支持。如果您不想使用VBA或其C ++或.NET SDK,或者如果DIESEL表达式没有删除它,则可以方便地编写复杂的宏(包括ActiveX自动化)。
很多AutoCAD的功能实际上都是LISP例程。
答案 26 :(得分:0)
语法无关紧要,可读性不是!
答案 27 :(得分:0)
不是说这是一个杀手级的应用程序,但看起来它可能很酷 http://code.google.com/p/plop/
答案 28 :(得分:0)
杀手级应用? ITA Software的航班搜索引擎就是其中之一。
至于“为什么”,它很可能会让你成为一个更好的开发者,并且极不可能让你变得更糟。但是,它可能会使您更喜欢使用其他语言的lisp方言。