5.4.3 条件,赋值,定义

xiaoxiao2025-04-17  7

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部分的推迟解释器。

转载请注明原文地址: https://www.6miu.com/read-5028486.html

最新回复(0)