为什么我应该学习Lisp?

132

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

虽然Lisp的语法复杂,但我并不会被吓到。但在传统商业编程中,我应该在哪里使用它而不是过程式语言呢?

是否存在一个在Lisp中编写的商业Killer App?


6
难以被不存在的东西所打发。 - Kaz
阅读 Philip Greenspun 的简历。其中涉及大量真实的 Lisp 工作。 - Kaz
1
此外,Greenspun 还在使用 Lisp 或涉及 Lisp 的各种领域工作过,包括分组交换网络模拟、DSP 设计、处理器设计、VLSI 布局、机械工程自动化、土方机械自动化等等。他曾协助设计惠普的 PA-RISC 架构,并使用 Lisp 机器上开发的工具进行了设计。 - Kaz
这里有一些用Lisp开发的应用程序 - Emacs、G2、AutoCad、Igor Engraver和Yahoo Store。 - Arulx Z
29个回答

135

Lisp是一种庞大而复杂的语言,需要一个庞大而复杂的运行时来支持它。因此,Lisp最适合解决庞大而复杂的问题。

现在,“复杂”的问题与“复杂”的问题并不相同。“复杂”的问题是一个有很多小细节的问题,但并不难。编写航空公司订票系统是一个复杂的业务,但只要有足够的资金和程序员,就不难。看出区别了吗?

“复杂”的问题是一个曲折复杂的问题,传统的分而治之方法无法解决。控制机器人、处理非表格化数据(例如语言)或高度动态的情况都是复杂的问题。

Lisp非常适合需要可扩展解决方案的问题;典型例子是emacs文本编辑器。它是完全可编程的,因此也是一个完整的编程环境。

在他著名的书《PAIP》中,Norvig说Lisp非常适合探索式编程。也就是说,编程解决一个并未完全理解的问题(而不是在线订票系统)。换句话说:复杂的问题。

此外,学习Lisp将使您想起一个被遗忘的基本概念:冯·诺伊曼和图灵之间的区别。正如我们所知,图灵的计算模型是一个有趣的理论模型,但作为设计计算机的模型是无用的。另一方面,冯·诺伊曼设计了一种计算机和计算如何执行的模型:冯·诺伊曼模型。 冯·诺伊曼模型的核心是您只有一个内存,并在其中存储代码和数据。仔细注意Java程序(或C#等)是图灵模型的体现。您一次性将程序设置在具体中,然后希望您可以处理所有被投入其中的数据。

Lisp遵循冯·诺伊曼模型,代码和数据之间没有明确的、预先确定的边界。在Lisp中编程可以让你认识到冯·诺伊曼模型的威力,并且以新的视角看待旧概念。

最后,由于交互性强,你将学会在开发程序时与它们进行交互(而非编译和运行)。这也会改变你编程的方式,以及你对编程的看法。

通过以上介绍,我终于可以回答你的问题:它是否比“传统”语言更优秀?

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


31
“但是只要有足够的钱和程序员,这并不难。” ——话虽如此,如果拥有足够多的程序员,那么做起来就变得不可能了;-) - Jonas Kölker
我已经了解到Lisp语言可以动态生成代码,但是我也读到过它可以被编译。是否有实现可以混合解释执行和编译执行?或者是否有自己的编译器? - centaurian_slug
@centaurian_slug:是的,绝对没错。这就是它的强大之处。任何没有被故意削弱的版本都会在运行时提供其编译器/解释器。例如,开发人员可以登录到他的Web服务器上的特殊连接,进行一些调试,更新一些类和函数定义,并在需要时重新编译依赖于这些定义的任何内容。而所有这些都是在服务器正在运行的情况下完成的。这可能不符合关注SOX合规性的企业的法律要求,但这也是为什么行业使用像Java和C#这样的愚蠢语言的原因之一。 - James

58
Lisp的主要应用之一是人工智能。我在大学时有个朋友上了一个研究生AI课程,他的主要项目是用Lisp编写了一个"Lights Out"求解器。他的程序有多个版本,使用略有不同的AI例程,在40多台计算机上测试产生了一些很棒的结果(我希望它在线上某个地方,可以链接到它,但我认为没有)。
两个学期前,我使用Scheme(一种基于Lisp的语言)编写了一个互动程序,模拟Abbott和Costello的“Who's on First”例程。用户输入与一些相当复杂的数据结构进行匹配(类似于其他语言中的映射,但更加灵活),以选择适当的响应。我还编写了一个解决3x3 slide puzzle的例程(这个算法可以轻松扩展到更大的滑块谜题)。
总之,学习Lisp(或Scheme)可能不会带来太多实际应用,但它是一种非常有价值的学习经历,正如许多其他人所说的那样。在像Lisp这样的函数式语言中编程也将帮助您递归思考(如果您在其他语言中遇到递归问题,这可能会很有帮助)。

6
为什么你说Lisp只适用于人工智能?另外,它是一种多范式语言。函数式编程只是它所支持的几种范式之一。 - Luís Oliveira
6
我没有说它只用于人工智能,我是说它的主要用途之一是人工智能。你读到了吗? - Justin Bennett
33
请不要认为Common Lisp只适用于数据库、单元测试框架、垃圾邮件过滤器、ID3解析器、Web编程、Shoutcast服务器、HTML生成解释器和HTML生成编译器,仅因为这些是实现在《Practical CL》一书中的事情。 - Mikael Jansson
23
@JustinBennett,是的,你说得对。这里是你的话:“总的来说,学习Lisp(或Scheme)可能不会带来许多实际应用,除了人工智能之外”。我讨厌别人在错误的情况下进行对抗。 - Luka Ramishvili

58

48

复杂的语法??

Lisp 的语法非常简单。

用 Lisp 写的杀手级应用程序:Emacs。Lisp 将允许您随心所欲地扩展 Emacs,实现几乎所有您能想到的编辑器可能要做的事情。

但是,只有当您想要学习 Lisp 时,您才应该去学习它,并且您可能永远无法在工作中使用它,但它仍然很棒。

此外,我想补充一点:即使您发现 Lisp 在某些地方有意义,您也可能无法说服任何人使用它,而不是使用 Java、C++、C#、Python、Ruby 等等。


@Justin:值得注意的是,Emacs核心是用C语言编写的。但这只是挑刺而已——所有命令都是用Elisp编写的。 - Bernard
3
更确切地说,通用Lisp的核心语法很简单。defmacro允许扩展语法,并且一些内置宏(例如defmacro)可能变得非常复杂;lambda列表、嵌套的反引号等。 - Aaron
1
它几乎可以说是Emacs的C部分是粘合代码。 - Luka Ramishvili
1
根据Emacs参考手册的说法,“Emacs中的大多数编辑命令都是用Lisp编写的;少数例外情况本可以使用Lisp编写,但出于效率考虑使用了C语言。” https://www.gnu.org/software/emacs/manual/html_mono/emacs.html#Intro - dpritch

26

3
这个回答应该提到雅虎商店,第一个Web应用程序,部分使用Lisp编写。引用维基百科的话:1998年,雅虎公司用455,000股雅虎公司的股票以约4900万美元的价值收购了Viaweb,并将其更名为Yahoo!商店。 - Steven Lu

18

我曾经职业性地使用Lisp编程约一年的时间,学习它一定是值得的。你将拥有无与伦比的机会来消除代码冗余,通过能够在可能的情况下用函数替换所有样板代码,并使用宏来实现不可能的操作。同时,你还能够在运行时访问无与伦比的灵活性,自由地在代码和数据之间进行翻译。因此,在用户操作可以触发需要动态构建复杂结构的情况下,Lisp真正闪耀出光芒。流行的航空公司航班调度程序都是用Lisp编写的,还有很多CAD/CAM软件也使用Lisp。


10

Lisp非常适合创建小型领域特定语言(DSL)。我在工作中运行了一个Lisp in a Box,并编写了一些DSL来查询SQL Server数据库,在C#中生成数据层等。现在我的所有样板代码都是用Lisp宏编写的,可以输出到C#中。我使用它来生成HTML、XML等各种东西。虽然我希望能够将Lisp用于日常编码,但Lisp确实可以带来实际的好处。


我使用http://dotlisp.sourceforge.net/dotlisp.htm来完成这个任务。 - Mark Hurd
甚至还有一种Lisp环境,Racket,设计用于创建DSL。 - Lazerbeak12345

9
如果你喜欢编程,那么你应该学习Lisp,因为它会带来纯粹的快乐。 XKCD 完美地表达了随之而来的智力启迪。对于程序员来说,学习Lisp就像对于佛教僧侣来说的冥想一样(我这样说并没有任何亵渎的含义)。

6

当一个人不使用语言的常见缩进约定时,任何语言看起来都更加困难。 当一个人遵循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))))))

2
我认为你所说的话有一定的批评意味。我的意思只是说“按照你的描述,它看起来更难,但按照这里的描述,它看起来更清晰”。我认为你会同意,如果不遵循缩进约定,许多语言看起来更加混乱。此外,如果我们比较Java和Lisp的缩进,我会说它们通常需要相同水平的基本构造知识才能正确缩进。但是,公正地说,虽然完全是主观的,仍然可以说它看起来很难。 - John with waffle
1
为了让它更简单,您可以使用标准的 let 并在函数开头使用 defun 来定义 fn,因为它不会改变。 - Aaron Robson
5
你根据什么标准判断某个东西是否“易于人类阅读”或“自我描述”? 是否与英语相似? 中文是否“易于人类阅读”? 数学符号呢? 它是否“不易于人类阅读”? 这种争论是令人讨厌的无意义辩论,因为它隐含的信息是:“这看起来不像我最初学习推理的方式。” - user713516
3
你的“反驳”听起来更像是抱怨。可以进行编程语言嗅探测试。找一个没有编程经验的人,向他展示一张VB代码页面和一张Lisp代码页面,我非常乐意打赌,这位外行人更容易从中获得有意义的观察结果是哪一种。 - nathanchere
1
我想知道一个中国人、日本人、韩国人、苏美尔人、印度人或阿拉伯人的非程序员会如何看待你为了一个肤浅的争论而放弃你的睾丸的傲慢愿望。 - user713516
显示剩余2条评论

5

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等使用;Naughty Dog的PlayStation 2游戏Jak and Daxter,主要是用由Naughty Dog发明的特定领域的Lisp方言GOAL编写的,其编译器本身也是用Common Lisp编写的;以及Roomba,自主移动的机器人吸尘器,其软件是用Common Lisp的向下兼容子集L编写的。 更有说服力的是Common-Lisp.net网站的增长,该网站托管开源的Common Lisp项目,以及过去几年出现的本地Lisp用户组数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接