传说中的lisp语言
学习c语言,能让你成为一个更好的程序员。
而学习lisp语言,则一定能让你成为一个程序员。
lisp这门编程语言真有这种魔力吗?
它确实能改变一个人的思维方式吗?
使用lisp编程,就能成为业界大牛吗?
学习并不是一件值得骄傲的事情
没有学习它时,我们听到看到的都是别人的说法。lisp语言的真实面目,淹没在了他人的赞美之中。
我们看不到负面消息,得不出有价值的判断。就像皇帝的新衣一样,似乎你说lisp语言坏话就证明你愚蠢一样。
我不能忍受这种想法,也为了验证怎样才能确实成为一个程序员,于是我就开始学习lisp了。
摆正自己的学习态度其实很重要。
如果你想成为神枪手,偷了他的枪是没有用的。
学习lisp并不是一件值得吹嘘的事情。
应该虔诚的看待这一门古老的语言。因为无知,所以学习。
学习过程中,我路过了我所谓的lisp语言的“三座大山”:词法作用域,continuation,宏。
为什么称为“三座大山”呢,因为学习起来颇费周折,总是不能给自己一个满意的答案。
然而每过一座大山,我都感觉好像脱胎换骨一样。
为了学习词法作用域,我看了编译原理,学了词法分析,语法分析,明白了静态作用域和动态作用域。知道了什么是闭包,知道了符号表,理解了高阶函数是怎样实现的。
为了学习continuation和宏,几乎把TSPL4翻译了一遍。call/cc,CPS,编译宏,读取宏。学习了编译器设计,区分了读取期,编译期和运行期。理解了元编程。
就这样,lisp的面目逐渐清晰了,也不是那么神秘了。
这正是,不识庐山真面目,只缘身在此山中啊。
欲穷千里目,更上一层楼。
平淡的认识
随着学习的深入,和其他小知识的触类旁通。lisp语言在我眼中已经不再是万能的了,它是那么暗淡又深沉。
同时我也认为任何学习都会经历这个过程,从抵触到崇拜,再到宠辱不惊。
人的世界观真的会随着知识的积累而改变呀。
然而,我知道以后的路还长着呢,我这才刚起步。
我回想了一下当时的心态,确实是有些不同了。
- 编程语言是什么
首先,编程语言是一个模型,它编码了计算过程。
而区分模型和它指代的东西很重要。
正如1,2,3,...代表了自然数一样,这些符号其实不是自然数本身,它们只是自然数的一种表示而已。
有了这样的认识,对理解宏,理解编程语言,很有帮助。
一般的编程语言,解决实际工作问题,比如写个网站呀,做个科学计算什么的。
而宏语言是建立在这个编程语言之上的,专门解决这个编程语言代码的问题,比如制作一个模板来生成代码,对代码进行分析等等。
而lisp的可贵之处在于,实际工作问题中数据的表示方式和lisp语言代码的表示方式是一样的。
这是天大的好事,因为这样的话就可以用统一的语法来处理了。
这事实上不自主的暗中扩大的语言使用者的能力。
为什么这么说呢,如果不是高级程序员,一般不会想到编程来处理代码。
他们只会做编程语言的“分内之事”,因为程序代码是一串字符,没办法轻易操作。
例如:你没有直接办法从字符串中,取出一个函数的定义。
你得使用正则表达式或antlr进行分析。c语言的话你可能得使用lex和yacc。
但是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程序员。
他思维诡异,别人经常都不知道他在说什么,似乎很蠢。
也请接纳他,付之一笑吧。
因为,至少他是个好学之人呀。