我为什么要学 Lisp?

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

我并不反感复杂的语法,但在“传统的商业编程”中,我在哪里能找到使用它而不是工作语言的合适位置呢。

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

59627 次浏览

复杂的语法 ? ?

Lisp 的语法是 非常简单

用 Lisp 写的杀手级应用程序: Emacs。Lisp 将允许您随意扩展 emacs,以完成几乎任何您能想到的编辑器可能会做的事情。

但是 ,你应该只有在 想要的情况下学习 lisp,而且你可能永远不会在工作中使用它,但是它仍然很棒。

另外,我还想补充一点: 即使您找到了使用 lisp 的地方,您可能也无法说服其他人使用它,比如 java、 c + + 、 c # 、 python、 ruby 等等。

我不能从第一手的经验回答,但你应该读什么 Paul Graham写的 在 Lisp 上。至于“杀手级应用”部分,请阅读 打破平均水平

我同意 Lisp 是那些你可能永远不会在商业环境中使用的语言之一。但是,即使你不能做到这一点,学习它肯定会扩展你对整个编程的理解。例如,我在大学里学习了 Prolog,虽然之后我再也没有用过它,但是我对许多编程概念有了更深的理解,并且(有时)更加欣赏我使用的语言。

但是如果你想学的话,请务必阅读 在 Lisp 上

语法复杂吗?Lisp 的美妙之处在于它有一个简单得可笑的语法。它只是一个列表,其中列表的每个元素可以是另一个列表或基本数据类型。

这是值得学习的,因为它增强了您的编码能力,可以将函数作为另一种数据类型来考虑和使用。这将改进您使用命令式和/或面向对象语言编写代码的方式,因为它将允许您更灵活地处理代码的结构。

好吧,我可能有点奇怪,但是我真的不太喜欢 Paul Graham 的文章 & 如果你还没有掌握 Common Lisp 的话,那么关于 Lisp 是一本非常粗糙的书。相反,我建议用 Siebel 的 实用 Common Lisp。至于“杀手级应用”,Common Lisp 似乎在像 ITA这样的利基商店中找到了自己的位置,所以尽管没有一个应用像 Rails 对 Ruby 那样是 CL 的同义词,但是如果你深入挖掘一下,就会发现业界有很多地方在使用它。

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

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

总之,学习 Lisp (或 Scheme)可能不会产生许多 AI 之外的实际应用,但正如许多其他人所说的,它是一种极其宝贵的学习经验。使用 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))))))

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

我发现学习一门新的语言,总是会影响你已经掌握的语言的编程风格。对我来说,它总是让我以不同的方式思考如何用我的主要语言,也就是 Java 来解决问题。我认为总的来说,它只是拓宽了你编程的视野。

如果你必须问自己是否应该学 Lisp,你可能不需要。

学习 lisp 将把 Javascript 放在一个完全不同的角度!Lisp 确实迫使你同时掌握递归和整个“作为第一类对象的函数”——范例。参见 Crocfords 关于 Scheme 与 Javascript的优秀文章。Javascript 可能是当今最重要的语言,因此更好地理解它是非常有用的!

这是我自己思考了一会儿的话题,但我还没有真正做出决定,因为通常时间是主要问题... ;)

因为我不能在这篇文章中找到这些链接,所以为了公众的利益,我添加了这些链接:

成功与失败的故事: 在喷气推进实验室工作

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

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

如果你喜欢编程,你应该为了纯粹的乐趣而学习 Lisp。XKCD完美地表达了随之而来的智力启蒙。学习 Lisp 对于程序员来说就像禅修对于佛教徒一样(我的意思是没有任何亵渎的含义)。

补充其他答案:

因为 SICP课程(视频是可用的 给你)是令人敬畏的: 教你 Lisp 还有更多

杀手级应用?弗朗茨公司。有一个很长的 成功的故事列表,但是这个列表只包括 AllegroCL 的用户... ... 可能还有其他用户。我最喜欢的是 淘气狗的故事,因为我是一个撞车班迪库特游戏的超级粉丝。

对于学习 Common Lisp,我推荐使用 实用 Common Lisp。它有一个实践的方法,至少对我来说,它比我看过的其他书更容易。

Lisp 对于创建小型 DSL 非常有用。我有一个 Lisp 的拷贝在一个 Box 中运行,我还编写了一些 DSL 来查询 SQL 服务器数据库并用 C # 生成数据层等等。现在,我所有的锅炉板代码都是用输出到 C # 的 lisp 宏编写的。我用它生成 HTML,XML,各种各样的东西。虽然我希望我可以在日常编码中使用 Lisp,但是 Lisp 可以带来实际的好处。

八十年代的时候,我在大学里上过 Lisp 的课。尽管我理解了课堂上提出的所有概念,但是我没有理解 任何是如何让 lisp 变得伟大的。恐怕很多人只把 lisp 看作是另一种编程语言,这也是多年前我在大学里学到的东西。如果你看到有人抱怨 lisp 语法(或者缺乏这种语法) ,很有可能他们就是那些没有领会 lisp 的伟大之处的人之一。很长一段时间,我都是这样的人。

直到20年后,当我重新燃起对 lisp 的兴趣时,我才开始“了解”使 lisp 变得有趣的东西——至少对我来说是这样。如果您在学习 lisp 时没有被闭包和 lisp 宏所震撼,那么您可能没有抓住要点。

Lisp 是一种大型而复杂的语言,支持它的是一个大型而复杂的运行时。由于这个原因,Lisp 最适合处理大型和复杂的问题。

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

一个复杂的问题是一个复杂的问题,一个传统的分而治之不起作用的问题。控制一个机器人,或者处理非表格式的数据(例如语言) ,或者高度动态的情况。

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

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

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

Lisp 维护 Von Neuman 模型; 代码和数据之间没有明显的、预先确定的边界。用 Lisp 编程可以让你了解 Von Neumann 模型的威力。用 Lisp 编程可以让你从新的角度看待旧的概念。

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

通过这个介绍,我最终可以回答你的问题: 你会找到比“传统”语言更优秀的地方吗?

如果你是一个高级的程序员,你需要高级的工具,没有比 Lisp 更高级的工具了。 或者,换句话说: 如果你的问题很难,那么答案是肯定的。

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

有时候 Java 语言本身会妨碍为 Java 代码编写测试(包括“传统的商业编程”)。(我并不是指对 Java 的控诉——其他语言也有同样的问题——但这是事实。既然这个话题不是 Java,我就不多说了。如果有人想讨论,请随时开始一个新的话题。)Clojure 消除了许多障碍。

AutoCAD 支持 LISP 和 DCL 运行时,这不是一个理由。如果您不想使用 VBA 或它们的 C + + 或。NET SDK,或者如果一个 DIESEL 表达式不削减它。

很多 AutoCAD 的函数实际上是 LISP 例程。

Gimp 的 Script-Fu 有点 Lisp,那是个 Photoshop 杀手级应用。

Lisp 可以在任何使用传统编程的地方使用。没什么不同,只是更强大了。写一个网络应用程序?你可以在 Lisp 上编写桌面应用程序吗?你可以在 Lisp 上完成,无论是什么,你可以在 Lisp,Python,或者其他任何泛型上完成(有一些语言只适合一个任务)。

最大的障碍可能是接受你的老板,你的同事或者你的顾客。你必须和他们合作。选择一个实用的解决方案,比如 Clojure,它可以利用 Java 基础设施的当前安装基础,从 JVM 到库,这可能会对您有所帮助。另外,如果您有一个 Java 程序,那么您可能需要做一个插件架构,并为其编写 Clojure 插件,最终只需要用 Clojure 编写一半的代码。

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

仅仅是为了了解六个嵌套纯函数之间的区别,以及六个带有副作用的嵌套函数之间的差异,就值得花时间投资。

不是说这是一个杀手级的应用程序,但它看起来可以很酷 Http://code.google.com/p/plop/

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

至于“为什么”,它很可能会使您成为一个更好的开发人员,并且极不可能使您成为一个更差的开发人员。但是,它可能使您更喜欢 lisp 方言而不是其他语言。

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

最常见的重复之一 关于 Lisp 的流言是它已经“死了” 诚然 Common Lisp 不是 像 VisualBasic 一样被广泛使用 或 Java,这似乎很奇怪的描述 继续使用的语言 新的发展,并继续 以吸引新用户为“已死” 最近 Lisp 的成功故事包括 保罗 · 格雷厄姆的 Viaweb 当雅虎收购他的雅虎商店时 ITA 软件公司的机票 定价和购物系统,QPX,使用 由网上售票员 Orbitz 和 淘气狗的游戏 PS2杰克和达斯特 很大程度上是写在 领域特定的 Lisp 方言顽皮 狗发明了一种叫做 GOAL 的东西 编译器本身是用通用语言编写的 还有 Roomba,自动的 机器人吸尘器的软件 是用 L 写的,一个向下的 Common Lisp 的兼容子集。 也许更能说明问题的是 Common-Lisp.net Web 的发展 网站,其中托管开放源码公共 Lisp 项目,以及本地 已经出现的 Lisp 用户组 在过去的几年里。

Lisp 是值得学习的,因为当你最终得到它的时候,你将获得深刻的启蒙经验; 这种经验将使你在余下的日子里成为一个更好的程序员,即使你实际上从来没有经常使用 Lisp 本身。”

——埃里克 · S · 雷蒙德,“如何成为一名黑客”

Http://www.paulgraham.com/avg.html