5.4.3 条件,赋值,定义 作为元循环的解释器,通过选择表达式的解释的片段来处理特殊的形式。对于一个条件的 表达式,我们必须解释判断式和决定,基于判断式的值,解释真值的语句或者是假值时的 语句。
在解释判断式之前,我们保存条件表达式本身,为了我们能在稍后的时候,抽取到 真值时的语句或者是假值时的语句,并且我们保存了continue,它是我们在稍后需要用到的, 为了返回到表达式的解释,这个表达式正在等待条件表达式的值。
ev-if (save exp) ; save expression for later (save env) (save continue) (assign continue (label ev-if-decide)) (assign exp (op if-predicate) (reg exp)) (goto (label eval-dispatch)) ; evaluate the predicate
当我们从解释判断式返回时,我们测试它是真还是假,根据这个结果, 在去eval-dispatch之前,把真值的语句或者是假值的语句放在exp寄存器中。 注意的是为了有正确的环境,为了在接收了条件表达式的值后能回到正确的地方, 在设置eval-dispatch这里恢复env和continue.
ev-if-decide (restore continue) (restore env) (restore exp) (test (op true?) (reg val)) (branch (label ev-if-consequent)) ev-if-alternative (assign exp (op if-alternative) (reg exp)) (goto (label eval-dispatch)) ev-if-consequent (assign exp (op if-consequent) (reg exp)) (goto (label eval-dispatch))
* 赋值和定义 ev-assignment处理赋值,从eval-dispatch带着赋值表达式到达了ev-assignment, 并且赋值表达式放在exp寄存器中。ev-assignment中的代码首先解释表达式的值部分, 并且然后在环境中安装新的值。set-variable-value!被假定是可用的,作为一个机器的操作。
ev-assignment (assign unev (op assignment-variable) (reg exp)) (save unev) ; save variable for later (assign exp (op assignment-value) (reg exp)) (save env) (save continue) (assign continue (label ev-assignment-1)) (goto (label eval-dispatch)) ; evaluate the assignment value
ev-assignment-1 (restore continue) (restore env) (restore unev) (perform (op set-variable-value!) (reg unev) (reg val) (reg env)) (assign val (const ok)) (goto (reg continue))
定义的处理也是相似的:
ev-definition (assign unev (op definition-variable) (reg exp)) (save unev) ; save variable for later (assign exp (op definition-value) (reg exp)) (save env) (save continue) (assign continue (label ev-definition-1)) (goto (label eval-dispatch)) ; evaluate the definition value
ev-definition-1 (restore continue) (restore env) (restore unev) (perform (op define-variable!) (reg unev) (reg val) (reg env)) (assign val (const ok)) (goto (reg continue))
练习5.23 扩展解释器来处理可推导的表达式,例如cond,let,等等(见部分4.1.2) 你可能欺骗或者是假定语法转换器例如cond->if是可用的,作为一个机器的操作。
练习5.24 实现cond作为一个新的基本的关键,而没有把它归结到条件。你将不得不 组装一个循环,测试连续的cond子句的判断式,直到你找到一个是真的,并且 然后使用ev-sequence来解释子句的动作。
练习5.25 修改解释器为了让它能使用正常序来解释,基于4.2部分的推迟解释器。