Erlang中实现eval/2函数及map值到变量的映射方法
完善Erlang task1模块的eval/2函数实现
问题核心
现有代码的eval_inner无法访问传入的map参数,导致原子变量无法解析;同时错误处理逻辑未按要求区分variable_not_found和unknown_error两种错误类型。以下是修正后的完整实现:
完整代码
-module(task1). -export([eval/1, eval/2]). % 修正eval_inner,新增Map参数并在递归中传递 eval_inner({add, X, Y}, M) -> eval_inner(X, M) + eval_inner(Y, M); eval_inner({mul, X, Y}, M) -> eval_inner(X, M) * eval_inner(Y, M); eval_inner({'div', X, Y}, M) -> eval_inner(X, M) / eval_inner(Y, M); eval_inner({sub, X, Y}, M) -> eval_inner(X, M) - eval_inner(Y, M); eval_inner(X, _M) when is_number(X) -> X; eval_inner(X, M) when is_atom(X) -> maps:get(X, M). % 让eval/1复用eval/2逻辑,传入空map处理无变量场景 eval(X) -> eval(X, #{}). % 实现eval/2的错误处理逻辑 eval(X, M) -> try eval_inner(X, M) of V -> {ok, V} catch % 捕获map键不存在的异常,返回指定错误 error:bad_key -> {error, variable_not_found}; % 其他异常统一返回未知错误 _:_ -> {error, unknown_error} end.
关键修改说明
- 给eval_inner添加Map参数:所有
eval_inner子句新增第二个参数M,递归处理表达式时持续传递map,确保原子变量分支能正确获取映射值。 - 统一eval/1逻辑:让
eval/1调用eval/2并传入空map,避免重复编写错误处理代码。 - 精准错误捕获:
- 捕获
maps:get抛出的bad_key异常,返回{error, variable_not_found}; - 其他所有异常统一返回
{error, unknown_error},符合要求的错误类型定义。
- 捕获
验证示例调用
eval({add, 1, 2}, #{})→{ok, 3}eval({add, a, b}, #{a=>1})→{error, variable_not_found}eval({add, {add, a, b}, {add, 1, 2}}, #{a=>2, b=>3})→{ok, 8}
内容的提问来源于stack exchange,提问作者Alseify
相关产品推荐
相关产品推荐

