R. Lämmel/Electronic Notes in Theoretical Computer Science 128
(
2005
)
61
(We
省略谓词modifyVarEnv进 行 环 境 修 改 。 ) 下 面 的 部 分 关 注
PURE解释器的发展
3
风格转换意义上的进化
最初的解释者是以大步的风格给出的当选择小步风格时,一些语言扩展
更容易适应,例如,异常处理或并发性属于这种类型。因此,我们将把
PURE解释器从大步长风格转换为小步长风格。
让我们再次考虑二进制表达式的解释器规则:
evaluate(binary(Exp0,Op,Exp1),VarEnv,Val2)
: - evaluate ( Exp0 ,
VarEnv,Val0),
evaluate
( Exp1 , VarEnv ,
Val1 ) ,
applyBop ( Op ,
Val0,Val1,Val2).
这条规则显然是大步长风格的,因为所有的子表达式都是通过递归
应用
evaluate/3来
减少的。甚至谓词的
类型
也不适合小步骤。我们对比
evaluate/3的
当前配置文件和所需配置文件
:
:-
profile evaluate(+exp,+varenv,-val)。
%
固有的大步风格
:-
profile evaluate(+exp,+varenv,-exp)。 采取小步骤
百分比
(We
倾向于在如上所示的改编的节目片段下面加下划线)。
也就是说,对于小步长样式,谓词将描述两个表达式(包括约简
值)上的关系,而不是
表达式和值。我们通过使用一个新的函子val 2 exp/1将值嵌入到表
达式中来适应
evaluate/3
的类型。
我们将函子添加到表达式语法中,如下所示:
:-
data exp
=
val2exp(val)。
为了保持可输入性,对
evaluate/3
类型的修改需要修改所有使用或定
义
evaluate/3的规则。
也就是说,我们用val 2 exp/1系统地包装其结果位
置。例如,二进制表达式的规则修改如下:
evaluate(binary(Exp0,Op,Exp1),VarEnv,val2exp(Val2))
:- evaluate(Exp0,VarEnv,val2exp
( Val0 ) ) , evaluate ( Exp1 ,
VarEnv , val2exp ( Val1 ) ) ,
applyBop( Op, Val0,Val1,
Val2).
事实上,REK提供了一个操作符,它可以自动完成这一任务。以下
othertype应用程序将所有PURE规则转换为启用小步的类型:
:-othertype(evaluate,val2exp)。
这个目标子句说明了记录进化跨
-