1 如何使用Py thon 编写一个Lisp 解释器 原文: Peter Norvig 译者: johnc 本文有两个目的: 一是讲述实现计算机语言解释器的通用方法,另外一点,着重展示如何使用Py thon 来实现Lisp 方言Scheme 的一个子集。我将我的解释器称之为Lispy(lis.py)。几年前,我介绍过如何使用Jav a 编写一个Scheme 解释器,同时我还使用Common Lisp 语言编写过一个版本。这一次,我的目的是尽可能简单明了地演示一下Alan Kay 所说的“软件的麦克斯韦方程组” (Maxwell's Equations of Software)[1]。 Lispy 支持的Scheme 子集的语法和语义 大多数计算机语言都有许多语法规约 (例如关键字、中缀操作符、括号、操作符优先级、点标记、分号等等),但是,作为Lisp 语言家族中的一员,Scheme 所有的语法都是基于包含在括号中的、采用前缀表示的列表的。这种表示看起来似乎有些陌生,但是它具有简单一致的优点。(一些人戏称"Lisp"是" Lots of Irritating Silly Parentheses"— — “大量恼人、愚蠢的括号“— — 的缩写;我认为它是" Lisp Is Syntactically Pure"— — “Lisp语法纯粹” 的缩写。考虑下面这个例子: Java Scheme if (x.val() > 0) { z = f(a * x.val() + b); } (if (> (val x) 0) (set! z (f (+ (* a (val x)) b)))) 2 注意上面的惊叹号在Schem e 中并不是一个特殊字符;它只是"set!"这个名字的一部分。 (在Schem e 中)只有括号是特殊字符。类似于(set! x y)这样以特殊关键字开头的列表在Schem e 中被称为一个特殊形式 (special form);Schem e 的优美之处就在于我们只需要六种特殊形式,以及另外的三种语法构造——变量、常量和过程调用: 形式 (Form) 语法 语义和示例 常量引用 var 一个符号,被解释为一个变量名;其值就是这个变量的值。 示例: x 常量字面值number 数字的求值结果为器本身。 示例: 12 或者 -3.45e+6 引用(quote exp) 返回 exp的字面值; 不对它进行求值 示例: (quote (a b c)) ⇒ (a b c) 条件测试 (if test conseq alt) 对 test进行求值; 如果结果为真,那么对 conseq进行求值并返回结果; 否则对 alt进行求值并返回结果。 示例: (if (< 10 20) (+ 1 1) (+ 3 3)) ⇒ 2 赋值(set! varexp) 对 exp进行求值并将结果赋值给 var, var必须已经进行过定义 (使用 define或者作为一个...