我想给大家介绍一门语言。

C*。

C*有什么特点呢?很著名很流行。

我们可以看看TIOBE Index:到2017年12月,这门语言的rating达到了30.965%以上,比Java,下一个最热的语言,高了一倍有余。

这门语言被广泛使用于各种领域:操作系统(Linux, Windows),分布式(Spark),深度学习(部分tensorflow),区块链(bitcoin),游戏引擎(Unity)。

同时,C*的方言包含C, C++, Java, C#等知名语言。

我们先从语法开始介绍:C*的一个程序,由多个声明组成。其中,一些声明属于函数声明,而一个函数又由多条语句组成。。。

是不是觉得很荒谬?C没有Class, C++没有垃圾回收,Java跟C#水火不容,为什么被认作同一语言?

而如果我告诉你,现实比这还魔幻呢?世界上有很多语言正被冠以‘C*’这样的名字,而这些语言中,毫无共通点?这些语言中,有的有静态类型,有的有动态类型,有的两个都有,有的GC,有的是为Arduino设计的,有的在JVM上,有的有Class,有的有Reflection,有的没有Assignment,有的基于Lambda Calculus,有的则不是,有的可以任意改自身语法,有的语法是二维的,是个表格,而不是线性的,而有的甚至自带GUI,是livecoding的鼻祖之一。。

而这些语言,通通被称作同一个语言:Lisp。

而更魔幻的在后面:于是,有很多人开始讨论,为啥这门语言没有取得主流化,为啥这门语言效率这么高。。。然后得出很多答案,其中一半的直接是错误的,如:

Lisp是第二早的高级语言,所以XXX,所以效率很高

最早的编程语言Plankalkül,是1942到1945设计的,然后Fortran也比任何被称为Lisp的语言早。就算我们取最乐观的时间,1946到1955之间差了10年,里面出现了各种语言,AutoCode, ShortCode, Flow Chart, Haskell Curry的语言。。。

不过上述问题是技术错误,下面的论证则更离谱:

Lisp社区很分裂,大家无法合作,所以没有流行

。。。Excuse Me?如果有一天,C, C++, Java, C#都衰落了,再也没有人用,是不是因为C*社区很分裂,C/C++/Java/C#,你任意选出一对,肯定在互捏?大家无法合作也是啊,Java自己有一套库,C#自己一套,C跟C++也是,这么分裂,不衰退才怪!

欲加之罪,何患无辞啊!本来就不是同一个语言,为啥要放一起论证,然后去吐槽大家之间不兼容?

在一推只是因为历史原因被称作一家族的语言之间,找共通点,然后去论证这些语言的兴衰,特性,适用范围。。。能找出啥有价值,nontrivial的insight才怪。

至于S表达式?Logo不用括号,Racket有2d syntax,也有infix expression, Common Lisp有reader macro。。。试问这些语言是不是Lisp?而JMC也说过我们应该往M表达式迁移,那是不是JMC 发现了Lisp的本质劣根性?我们也可以用argument by absurdity,论证C*这个词的合理性 - 有花括号跟分号的就是C*,C*成为世界上最主流语言,C*万岁!

‘Lisp’,这个词,已经没有任何有价值的意义,早就该被废弃,或者仅仅指JMC在1950末造的一个语言。就如同C*这个词不应该被引入一样。

另:最后,我想吐槽小部分所谓的‘Lisp’ 厨。往往,当你问,‘Lisp有什么优势/值得学’的时候(我们先不吐槽这问题提得很糟糕,就如同你不会问为啥要学C*/C*有啥优势),会跳出大致如下的答案:‘大部分主流语言的特性,早在Lisp中存在。主流PL发展只不过是catch up 1960 Lisp。’

这回答并很具误导性。

因为1960的时候,JMC 的确公开了一个语言,但是这个语言没有macro,是dynamic scope(读作:没有符合lambda calculus的first class function),连special form quote也没有(取而代之的是一个atom,换句话说你要quote compound expression得手动把(A B)转成(pair A B))。在1967年,影响了Smalltalk跟无数学计算机人士的Logo出世,而在1970年,Scheme借鉴了Algol,修复了dynamic scope,也有macro跟continuation。Common Lisp在1984诞生,又在1990带来了Common Lisp Object System,跟metaobject protocol。1994,racket诞生,又在2002带来了composable & compilable macro。在今年,则出现了Collapsing Tower of Interpreter,实现了看上去有无数个interpreter,并且可以到达任何一个interpreter,更改语义,最后再运行普通的代码(并且看到更改语义带来的change),也出现了Type System as Macro,可以用宏代表静态类型。

这些语言都很有价值,很多都值得看。

但是没有一门叫Lisp的,在1960,搞对了Lambda Calculus,拥有大量影响力,有各种现代语言特性(Continuation, Type, Reflection, Macro),有各种库,然后只有7条规则的语言。

我希望大家在讨论/宣传这些语言之一的时候,明白自己是在说啥。想说历史影响,可以用Scheme,玩极简主义,可以用JMC的Lisp,讨论OO,上Common Lisp,用Type/Contract,搞Racket。而不是一棒子打死,认为这些语言之间有任何共通点。