Oz/Mozart表达式求值:如何为Eval函数新增变量与环境支持?
表达式求值函数修改方案
你只需要给函数新增环境参数、补充变量匹配分支,同时调整递归调用的传参逻辑即可,修改后的完整代码如下:
fun {Eval X Env} case X of int(N) then N [] add(X Y) then {Eval X Env} + {Eval Y Env} [] mul(X Y) then {Eval X Env} * {Eval Y Env} [] var(A) then Env.A end end
修改说明
- 首先给
Eval函数新增第二个入参Env,用来接收传入的环境记录 - 新增
var(A)的匹配分支,直接通过变量名原子A从环境记录中读取对应变量的取值 - 加法、乘法的递归调用逻辑中,需要把当前环境
Env作为第二个参数传入,保证子表达式中的变量可以正常查询取值
验证测试
调用你给出的示例:{Eval add(var(a) mul(int(3) var(b))) env(a:5 b:5)}
计算逻辑为:a + (3 * b) = 5 + (3*5) = 20,和预期结果一致。
可选扩展
如果需要处理未定义变量的异常场景,可以给变量分支增加存在性校验:
[] var(A) then if {HasFeature Env A} then Env.A else raise undefined_variable(A) end end
内容的提问来源于stack exchange,提问作者Nhabbott
相关产品推荐
相关产品推荐

