我真的觉得我应该学习Lisp,有很多好的资源可以帮助我学习。
虽然Lisp的语法复杂,但我并不会被吓到。但在传统商业编程中,我应该在哪里使用它而不是过程式语言呢?
是否存在一个在Lisp中编写的商业Killer App?
我真的觉得我应该学习Lisp,有很多好的资源可以帮助我学习。
虽然Lisp的语法复杂,但我并不会被吓到。但在传统商业编程中,我应该在哪里使用它而不是过程式语言呢?
是否存在一个在Lisp中编写的商业Killer App?
Lisp是一种庞大而复杂的语言,需要一个庞大而复杂的运行时来支持它。因此,Lisp最适合解决庞大而复杂的问题。
现在,“复杂”的问题与“复杂”的问题并不相同。“复杂”的问题是一个有很多小细节的问题,但并不难。编写航空公司订票系统是一个复杂的业务,但只要有足够的资金和程序员,就不难。看出区别了吗?
“复杂”的问题是一个曲折复杂的问题,传统的分而治之方法无法解决。控制机器人、处理非表格化数据(例如语言)或高度动态的情况都是复杂的问题。
Lisp非常适合需要可扩展解决方案的问题;典型例子是emacs文本编辑器。它是完全可编程的,因此也是一个完整的编程环境。
在他著名的书《PAIP》中,Norvig说Lisp非常适合探索式编程。也就是说,编程解决一个并未完全理解的问题(而不是在线订票系统)。换句话说:复杂的问题。
此外,学习Lisp将使您想起一个被遗忘的基本概念:冯·诺伊曼和图灵之间的区别。正如我们所知,图灵的计算模型是一个有趣的理论模型,但作为设计计算机的模型是无用的。另一方面,冯·诺伊曼设计了一种计算机和计算如何执行的模型:冯·诺伊曼模型。 冯·诺伊曼模型的核心是您只有一个内存,并在其中存储代码和数据。仔细注意Java程序(或C#等)是图灵模型的体现。您一次性将程序设置在具体中,然后希望您可以处理所有被投入其中的数据。
Lisp遵循冯·诺伊曼模型,代码和数据之间没有明确的、预先确定的边界。在Lisp中编程可以让你认识到冯·诺伊曼模型的威力,并且以新的视角看待旧概念。
最后,由于交互性强,你将学会在开发程序时与它们进行交互(而非编译和运行)。这也会改变你编程的方式,以及你对编程的看法。
通过以上介绍,我终于可以回答你的问题:它是否比“传统”语言更优秀?
如果你是一位高级程序员,那么你需要高级工具。而没有比Lisp更高级的工具了。 换句话说:如果你的问题很难,那么答案是肯定的。否则就是否定的。
复杂的语法??
Lisp 的语法非常简单。
用 Lisp 写的杀手级应用程序:Emacs。Lisp 将允许您随心所欲地扩展 Emacs,实现几乎所有您能想到的编辑器可能要做的事情。
但是,只有当您想要学习 Lisp 时,您才应该去学习它,并且您可能永远无法在工作中使用它,但它仍然很棒。
此外,我想补充一点:即使您发现 Lisp 在某些地方有意义,您也可能无法说服任何人使用它,而不是使用 Java、C++、C#、Python、Ruby 等等。
我曾经职业性地使用Lisp编程约一年的时间,学习它一定是值得的。你将拥有无与伦比的机会来消除代码冗余,通过能够在可能的情况下用函数替换所有样板代码,并使用宏来实现不可能的操作。同时,你还能够在运行时访问无与伦比的灵活性,自由地在代码和数据之间进行翻译。因此,在用户操作可以触发需要动态构建复杂结构的情况下,Lisp真正闪耀出光芒。流行的航空公司航班调度程序都是用Lisp编写的,还有很多CAD/CAM软件也使用Lisp。
Lisp非常适合创建小型领域特定语言(DSL)。我在工作中运行了一个Lisp in a Box,并编写了一些DSL来查询SQL Server数据库,在C#中生成数据层等。现在我的所有样板代码都是用Lisp宏编写的,可以输出到C#中。我使用它来生成HTML、XML等各种东西。虽然我希望能够将Lisp用于日常编码,但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))))))
let
并在函数开头使用 defun
来定义 fn
,因为它不会改变。 - Aaron Robson从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用户组数量。