Versions:2013-03-26 2013-04-18 2014-07-01 2014-09-08 2015-03-22 2016-10-01 2017-05-04 2017-10-29 2017-11-29 2017-12-16 2019-12-08 2020-02-28 2024-04-16

Lisp 已死,Lisp 万岁!

有一句古话,叫做“国王已死,国王万岁!”它的意思是,老国王已经死去,国王的儿子现在继位。这句话的幽默,就在于这两个“国王”其实指的不是同一个人,而你咋一看还以为它自相矛盾。今天我的话题仿效了这句话,叫做“Lisp 已死,Lisp 万岁!”希望到最后你会明白这是什么意思。

首先,我想总结一下 Lisp 的优点。你也许已经知道,Lisp 身上最重要的一些优点,其实已经“遗传”到了几乎每种流行的语言身上(Java,C#,JavaScript,Python, Ruby,Haskell,……)。由于我已经在其他博文里详细的叙述过其中一些,所以现在只把这些 Lisp 的优点简单列出来(关键部分加了链接):

想不到吧,现代语言的很多优点,其实都是来自于 Lisp — 世界上第二古老的程序语言。所以有人才会说,每一种现代语言都在朝着 Lisp 的方向“进化”。如果你相信了这话,也许就会疑惑,为什么 Lisp 今天没有成为主流,为什么 Lisp Machine 会被 Unix 打败。其实除了商业原因之外,还有技术上的问题。

早期的 Lisp 其实普遍存在一个非常严重的问题:它使用 dynamic scoping。所谓 dynamic scoping 就是说,如果你的函数定义里面有“自由变量”,那么这个自由变量的值,会随着函数的“调用位置”的不同而发生变化。

比如下面我定义一个函数 f,它接受一个参数 y,然后返回 x 和 y 的积。

(setq f 
      (let ((x 1)) 
        (lambda (y) (* x y))))