回到未来:永恒的lisp

2016-12-20

lisp我学不会。我研究了很久的lisp,仍然没能领会到本质。它并不是一门语言,而是一种精神,一门哲学,信仰或者宗教类似的东西。

一开始我以为是一堆的括号,是cons,car和cdr,括号只是表象。抑或是map,是闭包和高阶函数?lisp是一门函数式语言?那函数式又是什么?后来发现了lambda calculate。自然是打开了一扇窗。简单的背后,隐藏了太多东西。慢慢的迷失在lisp是什么。看一看lisp里面到底有什么。

副作用和不可变状态,这是函数式语言比较强调的,其它语言里也有,lisp也没有过于强调这个。

垃圾回收,被很多语言学去了,现在出现的高级语言,哪个不是自带垃圾回收?lisp是第一门支持垃圾回收的语言,可惜它出现的太早了,太超前了。直到java一类的垃圾回收的语言普及,花掉了几十年时间才让社区能普遍接受,是的,lisp太超前了。

call/cc,除了scheme,直接暴露控制流的语言还真不多。协程不就是简简单单包装一下的事情。然而协程只不过是continuation的应用场景之一。不过我觉得这并不是一项有价值的feature,也不是它的先进之处。当年lisp刚出来时可没有这项feature。

卫生宏。对于宏评价,人们褒贬不一。它带来了灵活性,也导致了分裂,不得不承认宏确实是lisp里非常特色的一个地方,虽然我不喜欢。

想必大家听过这个故事:

在 ILC 2002 大会上前Lisp大神,当今的Python倡导者Peter Norvig,由于某些原因,做一个类似于马丁路德在梵蒂冈宣扬新教的主题演讲,因为他在演讲中大胆地声称Python就是一种Lisp。 讲完后进入提问环节,出乎我意料的是,Peter点了我过道另一侧,靠上面几排座位的一个老头,他衣着皱褶,在演讲刚开始的时候踱步进来,然后就靠在了那个座位上面。 这老头满头凌乱的白发,邋遢的白胡须,像是从旅行团中落下的游客,已经完全迷路了,闲逛到这里来歇歇脚,随便看看我们都在这里干什么。我的第一个念头是,他会因为我们的奇怪的话题感到相当失望;接着,我意识到这位老头的年纪,想到斯坦福就在附近,而且我想那人也在斯坦福 —— 难道他是…… “嗨,John,有什么问题?” Peter说。 虽然这只是10个字左右的问题,我不会假装自己记住了Lisp之父约翰麦卡锡说的每一个字。他在问Python程序能不能像处理数据一样,优雅地处理Python代码。 “不行。John, Python做不到。” Peter就回答了这一句,然后静静地等待,准备接受教授的质疑,但老人没有再说什么了。此时,无语已胜千言。

我第一次看这个故事还是在许多以前,直到现在,有了更深的体会。

了解过类型理论的人大概都知道这是个很复杂的东西。lisp一般是无类型的,但我见过有一门叫做shen的lisp方言,它实现了类型,而且它的类型系统只用了511行的代码。怎么做到的?用这些代码它会生成大约200多条规则和公理,然后将这些规则变成大约27,000行的Common Lisp代码!天呐,这么神奇?因为lisp的代码即数据呀。写一行lisp相当于其它语言写一百行,何等恐怖的生产力。

在编程语言鄙视链里面,Java鄙视C不是面向对象的,python鄙视的Java还不够灵活,haskell的学院派则鄙视C、Java、python等一切非函数式语言,而唯有lisp是站在编程语言进化论的终点,傲视群雄。如果将编程语言比作爬山,C在山脚,Java爬得稍快一点,但还远远看不到haskell的影子。只有lisp,它站在山顶,透过重叠的云层,看到蜗牛一样的haskell都还没爬过半山腰!

但是,为什么它没能流行起来?

如果说编程语言是宗教,那么lisp一定是佛教禅宗。佛教里是没有上帝的,宣称每个人都是可以成佛。但是佛教讲究缘份,需要开悟,对于没有慧根的人,lisp也就无缘了。所以我看到但凡能对lisp有一些心得的,都属于程序员中最聪明的那一类人。各个年代也总有一些能参悟lisp的人,从而将这种香火传承下来。

这种传承却不是靠口口相传能够解决。正如优秀的程序员不够多,是函数式语言永远无法解决的问题。能够悟到函数式语言这一层就已经是凤毛麟角了,而lisp又不知道高明到哪去。

凑一堆天才在一起是很困难的,比集齐七颗龙珠还难,而天才一般都有自己的个性,难免凑在一起了不打架。lisp的灵活性更是让状况雪上加霜。为什么有这么多的lisp呢?因为每个深刻理解lisp的人,都有自己的对lisp不同的理解。即便是每个悟道成佛的人,悟的东西其实都不尽然相同,所谓"道可道,非常道"。

lisp没有流行并不可怕,lisp本来是孤独的。我觉得引用这个句子非常合适:

只有当你独自一人深入荒漠,用树枝在黄沙上为自己喜欢的Lisp方言写解释器时,你才成为一名真正的Lisp程序员。

软件开发却不是单打独斗的工作,这个时代已不是靠一个天才就能创造出什么。只是大师的光辉会照耀着我们。当年一手创立了GNU的大胡子,其实他同时也是位lisp高手,lisp machine失败后,Emacs算是硕果仅存的"伪装成操作系统的编辑器"。lisp的编译器很多,我最后一个觉得比较有意思的是shen,当然经历不同感悟会不同。觉得lisp不是函数式语言的人,大概不懂函数式。觉得括号难看的,可能不知道模式匹配,当然,更不可能领悟代码即数据的重要性。真要觉得有类型才算牛逼的,去看下逻辑编程。其实所有的一切,lisp都有,一沙一世界,就看能领悟多少。

既然提到佛,真心信佛的人不多。大概就两类:要么是上了年纪的大妈,要么是清华退学的天才。嗯,就好比最牛逼的语言只能是PHP跟lisp一样。

lisp是上世纪的东西了,但是它的出现超前了何止一个世纪,直到今天,我们所有主流的语言还不停地向它"借"一些东西。所以可以看到很多语言里都流趟着lisp的基因,但,它们都不是lisp。

这个恐龙时代的语言真的有这么神奇?是,大概就是回到未来的感觉吧,lisp的精神将永存于世。

(全文胡扯,只有开头第一句正经的。准备放弃lisp了,瞎写点东西留作记念吧)

lisp