For a List in Lisp, Car is the First, Cdr is the Rest, and Lisp means List-Proccessing.
前段时间偶然在网上看到这个bootstrap scheme 这个开源程序,读来简洁明了,十分有趣。我对 scheme 有一点了解,毕竟以前看过一段时间 SICP,自己做练习的代码也是 scheme 写的。scheme 本身属于 Lisp 方言,语法也极其简单,学习起来非常快的。
看看这个简单的 scheme 实现,不禁再次感叹递归的优美。Lisp 这样的语言直接使用语法树结构来表示程序,不仅使得表示出来的程序异常简洁,就是用 C 语言来实现这种语言的解释器代码也看起来非常优美。在这里区区 2000 行的 C 语言代码,当然没有完整地实现 scheme 所有的内容,甚至只支持了整数。但是包含 scheme 的基本语法层面的东西,还有 lambda。抛开实现的效率不说,递归是易于编写和理解代码的一种方式,这里语法是递归的,parser 是递归的,eval 也是递归的。在这里所有的东西都是 object,没有显示的列表结构,但是嵌套的 pair 里蕴含着列表和树的关系。在 parse 阶段建立好一个以 object 为基本元素的树结构,做 eval 的时候顺着往下走就是了。
推荐对语言实现感兴趣的同学阅读一下这个代码,如果对 scheme 不了解也没关系,用一个小时看几个 scheme 程序基本就了解了。再看这个解释器,你就懂了代码是如何被运行的。