在Lisp的光环之下

传说中的lisp语言

学习c语言,能让你成为一个更好的程序员。

而学习lisp语言,则一定能让你成为一个程序员。


lisp这门编程语言真有这种魔力吗?

它确实能改变一个人的思维方式吗?

使用lisp编程,就能成为业界大牛吗?


学习并不是一件值得骄傲的事情

没有学习它时,我们听到看到的都是别人的说法。lisp语言的真实面目,淹没在了他人的赞美之中。

我们看不到负面消息,得不出有价值的判断。就像皇帝的新衣一样,似乎你说lisp语言坏话就证明你愚蠢一样。

我不能忍受这种想法,也为了验证怎样才能确实成为一个程序员,于是我就开始学习lisp了。


摆正自己的学习态度其实很重要。

如果你想成为神枪手,偷了他的枪是没有用的。

学习lisp并不是一件值得吹嘘的事情。

应该虔诚的看待这一门古老的语言。因为无知,所以学习。


学习过程中,我路过了我所谓的lisp语言的“三座大山”:词法作用域,continuation,

为什么称为“三座大山”呢,因为学习起来颇费周折,总是不能给自己一个满意的答案。

然而每过一座大山,我都感觉好像脱胎换骨一样。


为了学习词法作用域,我看了编译原理,学了词法分析语法分析,明白了静态作用域和动态作用域。知道了什么是闭包,知道了符号表,理解了高阶函数是怎样实现的。

为了学习continuation和宏,几乎把TSPL4翻译了一遍。call/cc,CPS,编译宏,读取宏。学习了编译器设计,区分了读取期,编译期和运行期。理解了元编程


就这样,lisp的面目逐渐清晰了,也不是那么神秘了。

这正是,不识庐山真面目,只缘身在此山中啊。

欲穷千里目,更上一层楼。


平淡的认识

随着学习的深入,和其他小知识的触类旁通。lisp语言在我眼中已经不再是万能的了,它是那么暗淡又深沉。

同时我也认为任何学习都会经历这个过程,从抵触到崇拜,再到宠辱不惊。

人的世界观真的会随着知识的积累而改变呀。


然而,我知道以后的路还长着呢,我这才刚起步。


我回想了一下当时的心态,确实是有些不同了。


  • 编程语言是什么

首先,编程语言是一个模型,它编码了计算过程。

而区分模型和它指代的东西很重要。

正如1,2,3,...代表了自然数一样,这些符号其实不是自然数本身,它们只是自然数的一种表示而已。

学过λ演算的话,就知道了Church数也是自然数一种表示。


有了这样的认识,对理解宏,理解编程语言,很有帮助。

一般的编程语言,解决实际工作问题,比如写个网站呀,做个科学计算什么的。

而宏语言是建立在这个编程语言之上的,专门解决这个编程语言代码的问题,比如制作一个模板来生成代码,对代码进行分析等等。

而lisp的可贵之处在于,实际工作问题中数据的表示方式和lisp语言代码的表示方式是一样的。

这是天大的好事,因为这样的话就可以用统一的语法来处理了。

这事实上不自主的暗中扩大的语言使用者的能力。


为什么这么说呢,如果不是高级程序员,一般不会想到编程来处理代码。

他们只会做编程语言的“分内之事”,因为程序代码是一串字符,没办法轻易操作。

例如:你没有直接办法从字符串中,取出一个函数的定义。


你得使用正则表达式antlr进行分析。c语言的话你可能得使用lexyacc

但是lisp语言处理lisp代码就出奇的简单。

因为lisp代码本身就是lisp语言的一个“内置对象”,列表,你可以轻易取出函数名,函数体,形参列表等等。

如果操作简单,你就会有更多的思考倾向,所以lisp语言暗中帮助了你。


打破了处理代码比较困难这层隔阂之后。

你就不再惧怕用编程方式解决问题了。

你就学会了用程序员的眼睛来看世界了。

这也许就是lisp语言一定能让成为一个程序员的原因所在吧。


  • 工具是拿来用的

其次,编程语言是工具的一种,没有最好的,只有适用的。

编程语言是为了解决具体问题而已发明的,所以一种编程语言不可能解决所有的问题。

就像停机问题一样,有些问题事实上是不可解的。

语言在面对各种问题时,也是具有优缺点的。

就像人一样,都有擅长处理和不擅长处理的事情。


编程语言之争,只存在于初级程序员的圈子里,因为他们只会一门或一两门语言,不懂语法分析过程,不知道AST,不了解编译器优化,不知道有链接过程,更不知道DSL


那么,争论一门语言好坏,也就是只能靠语感了吧。


当然,即便如此,争论也并没有错。

参与争论把自己搞糊涂,通过努力学习来解惑。


把各种编程语言平等对待,是很好的编程实践。

这样的话,能始终让你找到简洁的解决方案。


读取宏就是这样的一个概念,它赋予了你对读取器进行编程的能力。

使得你读到的任何字符,都会在编译前转换成了lisp代码。

拥有这种能力,你就好像带着一个神奇的眼镜一样,看到的任何东西都是lisp。


然而,不能过分迷恋某个事物,应该时常提醒自己,谨防一叶障目不见泰山。


  • 是什么改变了思维方式

最后,编程语言确实会影响一个人的思维方式,这一点我不否认。

但是,产生影响的作用效果,却不是在使用过程中发挥的,而是在学习过程中发挥的。

你看到黑客在使用lisp编程,不代表着用lisp编程的都是黑客。


学习一门新的编程语言,无论如何都是有帮助的。

它可以开阔视野,放低姿态,击碎傲慢,保持谦虚。

甚至,还可以淘汰一些不爱学习的人。


lisp之所以能对一个学习者产生深远影响,正在于学习它的过程。

为了学明白,可能不得已而去学习形式语言自动机函数式编程λ演算可计算性计算复杂度语义学,还有一些数学,英语等等。

为了进行比较,我也先后学习了很多种编程语言。

C C++ C# Java Scheme CL Haskell Erlang Python Ruby JavaScript Go Clojure

当然,这些语言我都不熟悉也不精通,刚刚了解。


这些收获对于一个程序员的修炼是至关重要的。

能为你从专业的角度来看待问题打下了坚实的基础。


当然,对于软件开发来说,这些知识简直是沧海之一粟,就算成为一个合格的软件工程师都比较勉强。

所以,避开lisp的光环,谦虚自信的学习,不卑不亢。

就把lisp当做漫长学习路上的一段崎岖小路吧。


结语

如果在你的项目组中,发现了一个lisp程序员。

他思维诡异,别人经常都不知道他在说什么,似乎很蠢。

也请接纳他,付之一笑吧。

因为,至少他是个好学之人呀。