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