我真的觉得我应该学习Lisp,并且那里有很多好的资源可以帮助我做到这一点。
我不会为复杂的语法所困扰,但是我会在“传统商业程序设计”中找到合适的地方使用它而不是过程语言。
有没有用Lisp编写的商业杀手级应用程序?
我真的觉得我应该学习Lisp,并且那里有很多好的资源可以帮助我做到这一点。
我不会为复杂的语法所困扰,但是我会在“传统商业程序设计”中找到合适的地方使用它而不是过程语言。
有没有用Lisp编写的商业杀手级应用程序?
Answers:
Lisp的主要用途之一是在人工智能中。我大学的一个朋友上了研究生AI课程,他为他的主要项目写了“在Lisp中 Lights Out ”求解器。他的程序的多个版本使用了稍有不同的AI例程,并在40台左右的计算机上进行了测试,得出了一些非常整洁的结果(我希望它可以在线链接到我的电脑上,但我认为不是)。
两个学期前,我使用Scheme(一种基于Lisp的语言)编写了一个交互式程序,该程序模拟了Abbott和Costello的“ Who's on First”例程。将来自用户的输入与一些非常复杂的数据结构(类似于其他语言的地图,但更加灵活)进行匹配,以选择适当的响应。我还编写了一个例程来解决3x3 幻灯片难题(该算法可以轻松扩展到更大的幻灯片难题)。
总而言之,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用,但正如许多其他人所述,这是极其宝贵的学习经验。使用Lisp之类的功能语言进行编程也将帮助您进行递归思考(如果您在使用其他语言进行递归时遇到麻烦,这可能会很有帮助)。
Lisp是一种庞大而复杂的语言,具有庞大而复杂的运行时来支持它。因此,Lisp最适合大型和复杂的问题。
现在,一个复杂的问题是不一样的一个复杂的一个。一个复杂的问题是有很多小细节的问题,但这并不难。编写机票预订系统是一项复杂的业务,但是有了足够的资金和程序员,这并不难。有所不同?
一个复杂的问题是一个令人费解的问题,传统的分而治之是行不通的。控制机器人,或使用非表格数据(例如语言)或高度动态的情况。
Lisp非常适合解决方案必须扩展的问题。经典示例是emacs文本编辑器。它是完全可编程的,因此它本身就是一个编程环境。
在他的著名著作PAIP中,Norvig说Lisp是探索性编程的理想选择。也就是说,为尚未完全理解的问题编写解决方案(与在线预订系统相对)。换句话说:复杂的问题。
此外,学习Lisp会让您想起一些被遗忘的基本知识:冯·诺依曼和图灵之间的区别。众所周知,图灵的计算模型是一个有趣的理论模型,但对于设计计算机却毫无用处。另一方面,冯·诺依曼(Von Neumann)设计了一个计算机和计算执行方式的模型:冯·诺依曼(Von Neumann)模型。冯·诺依曼模型的核心是只有一个内存,并在其中存储代码和数据。请注意,Java程序(或C#或您喜欢的任何东西)是Turing模型的体现。一劳永逸地将程序设置为具体。然后,您希望可以处理所有抛出的数据。
Lisp维持冯·诺伊曼(Von Neuman)模型;在代码和数据之间没有明确的预定边界。使用Lisp编程可以让您放心使用冯·诺依曼模型的强大功能。使用Lisp进行编程可以使您以新的眼光看待旧概念。
最后,是交互式的,您将在开发程序时学习与程序的交互(而不是编译和运行)。这也改变了编程的方式以及查看编程的方式。
有了这个介绍,我终于可以回答您的问题:您会找到比“传统”语言更好的地方吗?
如果您是高级程序员,则需要高级工具。而且没有比Lisp更先进的工具。或者换句话说:如果您的问题很困难,答案是肯定的。没有其他。
回应@lassevk:
复杂的语法?
Lisp的语法非常简单。
用Lisp编写的Killer应用程序:emacs。Lisp允许您随意扩展emacs,以执行编辑器可能会想到的几乎所有操作。
但是,如果需要,您应该只学习Lisp,而且您可能永远都不会在工作中使用它,但是它仍然很棒。
另外,我想补充一点:即使您找到了可以使用lisp的地方,您也可能不会说服其他人将其用于Java,C ++,C#,Python,ruby等。
根据第一手经验,我无法回答,但是您应该阅读Paul Graham 在Lisp上写的内容。至于“杀手级应用”部分,请阅读击败平均值。
Lisp对于创建少量DSL非常有用。我有一个Lisp的副本在运行中的Box中运行,我写了一些DSL来查询SQL Server数据库并在C#中生成数据层等。现在,我所有的样板代码都写在输出到C#的lisp宏中。我用它生成HTML,XML和各种各样的东西。虽然我希望可以将Lisp用于日常编码,但Lisp可以带来实际的好处。
如果不使用一种语言的通用缩进约定,则任何一种语言看起来都会困难得多。当人们遵循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))))))
let
并defun
在函数开始时使用a 来定义fn
它,因为它不会更改。
如果您必须问自己是否应该学习口齿不清,您可能不需要。
我在八十年代的大学里参加了“ lisp课堂”。尽管所著的Grokking在课堂上讲解的所有概念,我被留下,不用任何的什么使口齿不清高度赞赏。恐怕很多人将Lisp视为另一种编程语言,这就是这么多年前大学课程为我所做的。如果您看到有人抱怨Lisp语法(或缺乏Lisp语法),那么他们很可能是未能掌握Lisp的伟大之处的人之一。我很长一段时间就是其中之一。
直到二十年后,当我重新点燃了对Lisp的兴趣时,我才开始“发现”了使Lisp变得有趣的东西-无论如何对我来说。如果您在学习Lisp时没有被闭包和Lisp宏吓到,那么您可能已经错过了重点。
从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用户组的数量。
“ Lisp对于您最终获得的深刻启发经验值得学习;即使您从未真正使用Lisp本身,这种经验也将使您在余下的时间里成为一名更好的程序员。”
-埃里克·雷蒙德(Eric S. Raymond),“如何成为黑客”
学习Lisp将使Java完全不同!Lisp确实迫使您掌握递归和整个“作为一流对象的功能”范式。请参阅Crockfords关于Scheme vs Javascript的出色文章。Java语言也许是当今最重要的语言,因此更好地理解它非常有用!
好的,我可能很奇怪,但是我真的不喜欢Paul Graham的论文,如果您还不了解Common Lisp,那么关于Lisp的书将是一本非常粗糙的书。相反,我会说Siebel的《实用Common Lisp》。至于“杀手级应用程序”,Common Lisp似乎在诸如ITA之类的小众商店中都可以找到它的位置,因此,虽然没有像CL一样同义词的应用程序,但Rails还是Ruby的,但如果您愿意的话,行业中也会有使用它的地方。有点挖。
杀手级应用?Franz Inc.有很多成功的案例,但是此列表仅包括AllegroCL的用户...可能还有其他的。我最喜欢的是关于顽皮狗的故事,因为我是Crash Bandicoot游戏的忠实粉丝。
为了学习Common Lisp,我建议您使用Practical Common Lisp。它有一个动手的方法,至少对我来说,它比我看过的其他书更容易。
这是我本人已经思考了一段时间的话题,但我还没有真正决定,因为平时是主要问题...;)
由于在这篇文章中找不到这些链接,因此出于公共利益考虑将它们添加:
成功与失败的故事: 在JPL上倾听
真正令人印象深刻的成功故事: Orbitz公司使用Lisp
是否使用Lisp代替Java的比较和分析: Lisp替代Java
并不是说这是一个杀手级应用,但看起来http://code.google.com/p/plop/可能很酷