个人简介 何婧誉(Loretta),英文昵称Loretta,是一枚剑桥大学计算机科学系毕业的妹子,平时爱好各种新鲜事物,不会的都想学一点看一点。兴趣范围从技术、数学到桌游、国标、英文书法、语言学、哲学、钢琴等范围极广,属于样样都知道一些的典型jack of all trades。有收集德式桌游及大型乐高模型的癖好。技术上主要擅长jvm语言,有几年java经验,2010年遇见Clojure之后顿时因其简洁的语法、简单的写法及极具表达力的特性坠入爱河,2011年得以开始专业clojure至今,主要用其做数据流处理,但也曾用其做过网络应用乃至安卓应用。JVM之外亦与python、perl等主流语言,以及ML等非主流函数语言打过交道。 约两年前开始与国内的Clojure社区有所接触,业余时间致力于解答Clojure相关问题,并希望能将Clojure的影响范围继续扩大。
QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦、北京、东京、纽约、圣保罗、杭州、旧金山召开。自2007年3月份首次举办以来,已经有包括传统制造、金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。
1. 这里是QCon2015上海站,坐在我面前的是Clojure的分享嘉宾Loretta,今天我们请Loretta给我们分享一些她在Clojure方面的经验,Loretta请做个自我介绍好吧?
Loretta He:大家好,我是Loretta,中文名是何婧誉,我现在是在英国的一家软件公司Swiftkey做自然语言/软件工程师,我专业用Clojure已经4年了,在这个过程当中也是有笑有泪,但是也一直坚持到现在了,大概就是这样。
2. 跟我们来说几个血泪的事情吧,这个估计大家都比较愿意听,就是哭诉一下Clojure?
Loretta He:哭诉一下Clojure吗?这个我还挺难喷的,因为这是我自己做的选择。怎么说呢?它是JVM上的语言,所以理论上说跟Java的交互方面应该是非常紧密。但是有时候事实不是那么的美好,现实世界不是那么的美好,打个比方,我们做的纯Clojure的安卓键盘就是一个很好的例子,虽然说Dephi它不是JVM,但是理论上来说,自解码一般都应该是可以运行的,但是我们在做这个项目的时候,安卓升级到棒棒糖了,就Lollipop,我们要在棒棒糖上编译的时候,出了个很大的问题,就是它的Dex不能编译,那也出不了package,后来我是看了大概一两个星期安卓的编译器的C++之后,痛苦万分那个时候,发现他们编译器的一个Bug,给Google提交了之后,又请了谷歌内部的人去帮我推一下这个Bug,因为他们Bug实在太多了棒棒糖的,没法吐槽这个,他们也没有办法立即release这个fix,所以那个时候,就把Clojure的核心的库改了一下,改了以后又重新编了一下,公司内部那个项目用的就是改编过的这个版本,它就可以编译的过去。
3. 你很会打太极,我问你Clojure血泪史,然后你不是一个非常端正的态度。那我们可以讲讲Clojure你感觉比较好的那些东西,就是你体会有笑有泪,那笑的那部分是都有什么?
Loretta He:非常快,我不是光说运行速度,运行速度的话,它可能启动速度有点慢,因为它要加载很多Class,但是一旦加载之后,我觉得速度还是可以的,然后开发速度是非常的快,我觉得Clojure最好的地方是做原型是非常非常好的,两三天,再复杂的东西,可能到一个礼拜,你大概原型可以出来。
4. 那也有的人说,像Ruby这样的也适合非常快速的开发,但是大家可以看到报道,有很多很多的项目从Ruby迁到这个,迁到那个,然后获得了几十倍性能的提升。虽然说大家对它的语言特性没有什么太多可吐槽的地方,但是它的性能就是经常不高,那你在Clojure的时候有没有这种困惑?就是它做原型好,但是做到生产里的话,可能还是有这样那样的问题呢?
Loretta He:我自己生产有用。Clojure它现在有一个稍微大一点的问题,今天早上那个IBM的专家也有提到这个事情,因为它的每一个函数都是一个Class,所以代码量多了之后,内存很可能会有点问题,因为你选的越大,Class就越多,甚至有的时候你做一些稍微进阶一点的事情,Class就生成的更多了,这是Clojure现在有的一个问题,但是我们也在尝试客服这个问题,要去build另一个Run Time,这个可能1.8左右会出现。我不会说它是一个完美的语言,但是我们也是一直在努力往前走。之前的Bug,比如说Boxing,因为Java有Boxing跟unboxing。
5. 以前经常坑大家?
Loretta He:对,我记得当年Clojure1.2、1.3的时候, Boxing给它造成了一个很大的困扰,然后后来就修正了,当时Boxing/unboxing造成了Performance上面一个很大的问题,后来好像是1.4还是1.5的时候,把这个问题给Fix了一下,怎么Fix的我就不多说了,因为我自己了解也不是特别多。就是说问题是肯定有的,但是因为一直在进步,我觉得Clojure社区它也是一个非常友善的,大家都可以互相帮助的一个社区,那么一起往前走的话,我自己用到生产上的话,问题我觉得不是特别的大。
6. 如果大家是把它作为一个快速的语言,那就是在早期的话,一个人会做些原型,有很多人也吐槽这个东西是不是学习起来比较困难,不适合在团队内部去推,毕竟它跟我们常见的普通大众语言长相上差异非常非常大,如果没有一些函数式编程的经验的话,你是有函数式编程经验的是吗?
Loretta He:在Clojure之前有ML,但是那也只是一门课而已,也就是这样。
7. 那起码你的课没挂掉对吧?
Loretta He:没挂,还好没挂。
8. ML也好,或者H askell也好,它毕竟是有联系,而且这样的技术会很有帮助,但是从国内来讲,大部分人在教育的过程中是没有遇到过这种函数式编程的,原来有的学校会有,但是后来从2000年之后,可能把所有的这个课程都砍掉了,大家毕业的时候就没有这样的基础,所以说他们接触Clojure时候,觉得这个语言很陌生,学起来很慢,你对这个东西是怎么体会的,你周围的人是有什么样的想法?
Loretta He:我是在一个很不同的环境学的计算机,比如说我们剑桥那边,我们第一门课就是ML,老师说你把以前所有学过的东西都忘了,C++、Pascal之类,全部都忘掉,我们重新开始来学习计算机这一门课,基础就是ML。我对这一方面,可能会有一点偏见,因为我也是大学的时候是活在一个很美好的泡泡里面。学习函数编程这个事情,我觉得这个不是语法上的障碍,这个真的是思维上的障碍,因为它跟顺序式编程是非常不一样的,一个是从上往下,然后我觉得函数式编程有点像从左往右,它很适合建造一些管道。他Care的不是说你要做什么事情,他Care的是你要把数据变成什么样子,如果说你能够把这关想通的话,我觉得语法什么的根本不是问题,有编辑器对吧,括号根本不是什么问题。最大的问题,我觉得是思维方式上,如果说大家能够把思维扭转过来,可能会有一点难度,这个我承认,但是一旦能过了这个关卡,我觉得可能两三个月,或者说如果你一直很努力的去理解,比如说去读一下SICP,如果你能够看到至少一半,哪怕是1/4也是有启发的,我觉得。
9. ML是你的第一门编程语言吗?
Loretta He:我之前是Pascal。
10. 那更好,你在学ML的时候,有没有一种特别毁掉自己原来业已建立的那些观念的感觉?
Loretta He:特别的漂亮,非常的漂亮,Haskell是比较高冷,ML反而比较亲切,它用于教学语言是非常非常好,因为它非常简单,非常非常的漂亮,非常符合数学的审美,你学到这个东西之后,你就觉得,原来问题可以这么看的,可以把它分析成数学上的一个小问题,这个是非常重要的,包括你的后面对计算机理论方面的理解,图灵机之类的东西,我觉得都是有非常大的帮助。
11. 那可以说这就是一个典型的,如果一门语言不给你带来新的思维方式,就不值得学习的一个例子吗?
Loretta He:我不会那么绝对的说一个语言不能带给你新的思维方式,那就不学了。但是它可能有其它原因,可能会很popular,比如说生态,我一直在说生态,我昨天也在说生态,生态是非常非常重要的,因为我个人不是那么的喜欢造轮子。我喜欢站在巨人的肩膀上。
12. 那你觉得Clojure生态跟其他的JVM语言的生态相比的话,有什么优点和缺点呢?
Loretta He:我想强调一点,就是社区特别的好,我知道上一次Qcon,你也跟我提了,有人过来分享Scala跟Clojure的比较。Clojure社区我觉得确实质量非常高,而且我们也不是那么的自傲,我们不会说我们是best programming language,我觉得我们还是比较虚心的可以接受一些批评。
13. 你们总是说自己是第二好的,然后在心里头觉得没有第一好的?
Loretta He:没有银弹,这个是我们自己很接受的一件事情。但是因为这个事情,我们可以认识到自己的缺点,所以我们可以一直往前走,一直去吸收新的东西,比如说core.async,之前我们有refs,有atoms,有agents,可能很多人觉得并行上面已经是蛮够的了,agents已经是async的了,但是Rich Hickey就把这个概念进行了进一步的扩张,扩张了之后,大家说这个真的非常好用,好用到我现在有时,写一些不需要异步的东西,我也喜欢把异步的东西加进去,好用到变成这个语言的一部分了。我也有朋友用了这个异步可能三四个月之后,他说我现在写什么都想用这个东西。
14. 就像一个笔特别好用,你天天拿在手里,然后你拆个快递也用这根笔来拆,对吗?
Loretta He:这有人该说我是“你拿着个锤子,看什么都是钉子了”。
15. 现在回过头来说这个问题,就是如果一个人没有接触过函数式语言的话,他现在打算去尝试一下Clojure您有什么建议呢?
Loretta He:自己写东西,哪怕你写的非常的过程,还是先写东西。Clojure有个非常棒的网站,是4clojure,它本身是Clojure写的,然后它上面有非常多的题目。
16. 150道?
Loretta He:对,我觉得那个蛮够的,因为我自己最高难度的也有几道没做,因为太懒。它是非常循序渐进的,你可以写非常过程式的东西把它做完。
17. 那个题目是什么类别的,数学类的多一些还是什么类的都有?
Loretta He:它有很多,刚开始的时候,可能它会介绍map是什么东西,介绍filter是什么东西,它可能会敦促你自己去写个MAP,MAP可能太难了,那么filter之类的,他会敦促你自己去写,去理解这个概念是什么东西,哪怕你写的非常过程式,但是它有个好处,就是说那些大神全部已经做完了,你可以Follow它,你做完可以看他的答案,你可以看他为什么可以只写一行两行,但是你要写十行,你看完之后会觉得这个东西原来是可以这样做的,然后写着写着看着看着大概就理解了。
18. 是不是有点像是做作业,你突然看见了学霸是怎么做的
Loretta He:对,这个完了之后,我觉得就可以自己尝试去写一些库,然后你也看一下别的高质量的库,他们是怎么写的。
19. 可以举个例子吗?
Loretta He:高质量的库,我觉得core底下的都可以看一下,像简单的,比如说data.json,data.csv之类的,比较简单的数据处理,读入读出,怎么把它弄到一个数据结构里面,这个是比较简单的一个应用,然后你觉得自己可以接受这个挑战,你可以继续挑战异步库,异步库的原码是稍微难懂一些。
20. 大家学一门新的语言总是想尽快的从这门语言中获取一点点乐趣,说做的一个网站,然后一下做出来了,可能有一点点欣喜的感觉,如果是Clojure的话,除了你刚才说的做那样的题以外,它有什么可以做的实际的东西的例子,或者是玩具之类的?
Loretta He:我刚刚接触的时候,我把它做了一个什么东西呢?我就是玩儿,我下载了一些往年的股票数据。然后读进去,你可以生成一个chart之类的东西,甚至是趋势分析如果你愿意的话,这个其实不是那么难做的。如果你喜欢网站的话,也有luminus,虽然说我个人不是特别喜欢这个框架,但是我觉得是比较容易上手的,如果你要做个简单的APP的话,是非常非常快的,包括Leiningen这个东西,我觉得它简直是个神器。
21. 包管理器和依赖性管理的这些东西多了去了,为什么你觉得她是神器呢?
Loretta He:它非常的轻便,而且很容易写插件,然后就是依赖这些东西,我觉得是最好读的版本。
22. 没有之一?
Loretta He:我在想要不要加之一,还是加个之一吧。我觉得依赖方面他们写的非常清楚,你自己用的话不需要花太多的脑子,它有一个sample,大概use case,基本上都cover了,我基本上没有遇到过自己需要去define的这个东西。
23. 这个跟Clojure给你的感觉是不是有点像,就是它满足了最小精细原则,当你猜一个什么特性的时候,你基本上猜的会比较准,不用去看太多的东西?
Loretta He:因为Clojure社区很乐意填坑,如果说他觉得这个东西没有,那我就写一个,它还是比较全。它原型非常快,所以你搞一个东西出来是非常快的,然后大家就说这个东西我也可以用,这个是开源的,大家都可以去贡献,这里发现个坑了我填一填,合作性还是比较强的我觉得。
24. Clojure社区的人大部分都来自于哪?在中国有很多这样的程序员吗?
Loretta He:我今天晚上要去见一批。Clojure有个QQ群,我今天晚上正好要去一起吃个饭,见一面,像上海我知道有,我忘了他叫做什么名字,他的游戏公司就是在用Clojure做后端的。可能不多,但是还是有的,可能没有像欧美那么的多,因为中国,昨天我们几个讲师也在讲这个事情,我觉得函数式语言不够普及,中国大学是要负主要责任的。
25. 这个事情,我倒听说过,其实在早期,清华他们还教过Prolog。
Loretta He:Prolog也是要看的,我们剑桥的时候也是学了Prolog。
26. 最近的风气反正是觉得差了很多,早期包括北航,他们用人工智能的系统还是很多很多,而且有很多博士。
Loretta He:现在觉得,neural nerworks他们那些牛人都不用,prolog、lisp、rule base learning已经淘汰了,我们为什么要看这种东西,对吧。
27. 可能新的人觉得那些是古董,其实本质上也并不太奇怪,应该说。
Loretta He:就是追求有用的,看起来现在就立即可以用的东西
28. 实际上真正的程序员,不是写程序就是真正的程序员,还是对这个东西愿意进行深入思考的人,可能并不那么多。
Loretta He:我的理解就是说有些东西用过程式解决起来是非常的难看。
29. 你可以举一个例子。
Loretta He:这个例子特别难举,我做的那个东西就是自然语言的模型的质量检测的一个框架,如果用Java来写的话,简直不可想象,这个复杂度。因为我们公司支持一百种以上的自然语言,他们是长得非常不一样的,特别是中文,中文是一个很头痛的语言,经常有人问我为什么你们中国人会讲这种东西。实在是太奇怪了,刚刚有老师在讲entropy,我觉得中文的熵是非常大的,因为它有很多的不确定性,拼音到汉字有非常大的不确定性。
30. 不确定性大这样产生的信息量才大啊?
Loretta He:Entropy也大呀。对于我们这帮做预测的人是比较困难的,那他打字方式又不一样,我举个例子,有的人可能喜欢一个词一个词打字,有的人喜欢把一整句拼音都打完了,然后他一个词一个词去commit,如果说整句的预测不对的话,那他就要一个词一个词去找,就是有很多不同的打字方式。英文也是,英文有的人喜欢把一个词打完了就按空格,然后不管我打的是什么东西,我希望它把我自动纠正到对的词上面去,那也有人他喜欢打一个字母,打一个字母,看到上面已经出了这词了,再按一下,有非常不同的打字方式。语言方面的话,语言看起来也不一样,中文不是所打即所得的,就是你打拼音但你看到的是汉字,但像英文就是所打即所得的语言,这里面有非常大的复杂度。然后我们要测什么东西?我们要测自动纠正,我们要测滑动方面的失败率,我们要测如果是一个字母一个字母打的,可以省略多少打字的keystroke,零零总总可能有30几种标准。如果用Java来写这个东西,就在命令行上,要测越南语的滑动失误,然后我要用这个数据测一百行,或者说是一千个单词,最后把这个数字做成个报表,我觉得用Java来写,我没有办法想象这个东西,实在是太恐怖了,Clojure就是说五千行。
31. 在可控的范围里?
Loretta He:我觉得是非常可控的,然后我把它做成一个可以插拔的东西,就是很模块化的一个东西。
32. 大家总在想一个问题,就是它的维护性好,到底是语言的特性,还是程序员的功力的问题,大家都在想能学懂Clojure的人如果用Java的话,maybe也能做得非常不错?
Loretta He:我觉得Java有个问题,是很容易就不动脑子就写下去了,我有的时候会碰到这个问题,我写着写着,我最后要干吗,我上一步在干吗,我下一步在做这个事情,好像就忘了这个method是什么东西,这是很容易介绍bug的,因为你Care你每一步在做什么东西,但是有的时候你只顾着沿途看风景,就忘了你最后目的地是什么东西,这是我觉得Bug比较多的有一个原因是这样的。然后函数式编程的话,你要时刻关注着你最核心的东西是什么,最核心的东西是数据,你要这个数据变成什么样子,所以说你不会忘记这个事情,然后要达到这个目的的话,先要把思路整理好才能写代码,思路不整理好是不能写的,所以这个我觉得是一个蛮大的优势。我刚开始的时候写Clojure,我就觉得这个东西好像写到可以编译,基本上就可以运行了,可能会有一点点edge case的问题,但是大多数情况下是完全OK的。
33. 很多函数式编程的人都会这么说,包括Haskell的人也有,说只要把类型定义好了,这个程序基本能写完了。
Loretta He:非常放心。
34. 那如果这么写程序的话会不会很累呢?或者说它的工程化的东西就丢失了一些呢?比如说我们传统上,过程式强调的测试,强调的工程化,强调的一些代码风格或者什么的,如果用Clojure是不是就会被忽略掉呢?
Loretta He:我觉得测试这个没有关系,测试总是要写的,而且Clojure有个神器从haskell那抄来的,库名字我忘了,就是生成性测试,我不知道Java有没有这个东西,对,是quicktest。我上一次去欧洲Clojure大会的时候,有人用这个东西可以检查你异步的项目里面可能会出现的死锁,或者其他事情,我觉得这个太棒了,太牛了,我觉得测试是没有问题的。框架方面的话,我觉得函数式语言作为框架来说不是问题,我觉得要有个稳定的框架,其实最大的问题还是类型,这方面我是同意的。稳定性你要把它做的非常大的话,我觉得静态类型是有一定的优势的,这个我承认。所以我在演讲的时候也有说过,如果你对Clojure不是特别熟悉,你习惯Java静态类型帮你做好检查的话,那你可能还是要用Java或者scala去搭一个框架,然后把Clojure填进去,除非像张松老师说的,他一直在人肉积累型,因为Clojure它是动态的,这也是一个习惯性的,写python的人会觉得非常亲切,他习惯这个灵活性,这是一个双刃剑的。
35. 那话说回来了,大家对Clojure经常抱怨就是,你说Clojure这么好,那么好,为什么在社区里头,Clojure做的开源项目特别牛的非常少,可能最牛的就是大家能知道的Storm,除了Storm大家可能都想不起来什么,反而像scala写的就已经很多了,像Spark,像Kafka。
Loretta He:它非常适合大项目,静态类型确实是比较适合大项目的,这个我是承认的,小东西我觉得就是灵活性。如果是非常大的项目,像Spark这种项目,它为了要稳定的话肯定要牺牲一点灵活性,所以说Clojure它没有大项目这个事情,也不能说完全没有大项目,luminus算一个,虽然说可能外面用的人并不是特别多,这个问题我倒没有想过,为什么没有一个特别大的项目,那什么算大项目呢?
36. 简单来说就是比较流行,我们比较庸俗的说法就是它比较流行,可能在GitHub上它的Star比较多,超过几千,然后有几十上百的contributer,这种大可能是引起的关注更多的意思,Clojure可能一直没有,包括其他Lisp的也是有这样的问题。
Loretta He:都是小小的东西。
37. 用的人确实在用,但是你说在这里头有哪一个类库,或者是常用的在某一个领域的杀手级的东西Lisp有实现,好像很少有这样的例子,它确实有一些好东西,但是说服别人的时候,为什么不流行,这是个问题。
Loretta He:我自己其实也不是特别的推崇用Clojure写很大的东西,它本身的一个理念是简单。比如说网络框架上,Luminus我觉得是比较少见的,整合性非常大的一个框架,它里面什么东西都有,但是对于写惯django,甚至是spring mvc那些人来说,可能还是功能少了点。我们自己内部觉得luminus已经非常反Lisp了,它已经太复杂了,它做的事情实在是太多了,它很推崇的理念是一定要保持灵活性。所以说程序员如果要用这个东西的话,往往要付出比较多一点的努力,因为很多事情要你自己去做决定,我是不会去帮你做决定的,这是它没有大框架的一个原因之一,就是它不是很喜欢去帮你做决定,它没有什么像Hibernate这种东西,它是不会去做的,也不是很屑于做这种事情,它觉得程序员应该是有能力可以搞定你自己想要做的一些东西的。
38. 另一个层面跟Lisp相关的就是传统的Lisp来讲,Lisp的程序员都互相仇视的,你写的宏别人是很难看懂的,确实有这样的说法,但是为什么Clojure社区就变得很和谐,像你说的大家不太仇视别人写的东西?
Loretta He:我觉得Clojure的宏都非常好懂。
39. 那是不是它只是提供一些非常简单的特性?它的宏并不是像Lisp其他东西那么强大?
Loretta He:还是很灵活的,你看它可以把类型检查加进去。我要说读取宏的事情,它没有灵活到可以让你改基本语法,我觉得这个是一个非常正确的决定,可能所有写Clojure的人都会觉得这是个非常正确的决定,你不能把它写成像Scala那样的东西,有一个限制,比如说我不能把它写成,我要读一个一加一然后输出2,没有括号,这个在Clojure里面是办不到的,不允许你这样子,这样会妨碍易读性,我怎么知道你这个宏是怎么写的,突然之间出了这样的代码,完全看不懂是什么,没有读取宏,你就基本上办不到这样的事情,就是说一切看起来还是比较熟悉的。
40. 起码它的程序的整体的结构还是一种Lisp的。
Loretta He:生成修改代码之类的都可以,所以光靠这一块能做到的东西还是非常多的,比如我演讲的时候讲的动态加载版本,然后根据不同版本生成不同的那个语言去扩不同的API这件事情。
41. 所以你不建议大家用宏?就是能不用就不用?
Loretta He:我非常痛恨那种前面加了一个backtick那种syntax quote就完了,我非常讨厌这种东西。没有必要,为什么要做这种事情?一个是增加你Run time时候的负担,另外一个你写了之后,举个例子,我在花旗的时候有个人很喜欢写宏,我当时对Clojure也不像现在那样子,还不是特别熟在花旗时候,就觉得这个事太牛了,就是写了看不懂,它那个宏有大概二三十行,里面各种乱七八糟的东西都有,完全看不懂是什么东西。我当时,你知道,就是很敬仰的心情,太牛了这个人。后来大概一年之后,我就想,这个东西完全没有必要写成宏,为什么要这样子?写成函数就很容易懂。
42. 所以说是程序员互相残害的例子吗?
Loretta He:所以重要的事情说三遍,能不用就不要用,能不用就不要用,真的。
43. 除了宏大家原来吐槽,Lisp还有一个加进去之后大家就比较互相残害的就是continuation,这个clojure是有的吗?
Loretta He:我们有 lazy seq那个算法。
44. 这个应该不算,其他的应该不算吧。
Loretta He:你是说continuation上面的东西,应该是。
45. 经常有些网上的谜题,scheme之类的,要做一些非常奇怪的东西。
Loretta He:我印象当中是没有的。
46. 其实它保持了很大的简洁性,就是一个可以受控制的宏,然后没有continuation,看上去Clojure还是比普通的Lisp好懂的?
Loretta He:它真的是一个非常简单的语言,没有太大的污染问题,它可能加了一些其他数据结构,但是这个也是很快能够上手的,不是像continuation那么难懂难搞的东西。包括惰性,惰性可能大家刚开始接触的时候会有点抵触,这是个什么东西,当时我有个同事在学clojure,这个lazy seq的事情他花了很久去理解,我觉得学函数式的时候,这是一个比较大的砍。
47. 这就跟你看到SICP第三章讲惰性的时候,无穷数列这一篇的时候一样的,确实是。
Loretta He:但是一旦懂了之后,你就觉得可以用这个东西可以做很多事情,像比如说Python里面有yield,这东西就是完全lazy可以做,这个是一点问题都没有的。
48. 毕竟大家都是互联网内的,就不要太吹毛求疵,我们还是可以坐下来一起聊的。
Loretta He:对,没有仇视化python的意思,也没有仇视其他Lisp的意思,世界和平。