You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

关键修改说明

  1. 给eval_inner添加Map参数:所有eval_inner子句新增第二个参数M,递归处理表达式时持续传递map,确保原子变量分支能正确获取映射值。
  2. 统一eval/1逻辑:让eval/1调用eval/2并传入空map,避免重复编写错误处理代码。
  3. 精准错误捕获:
    • 捕获maps:get抛出的bad_key异常,返回{error, variable_not_found};
    • 其他所有异常统一返回{error, unknown_error},符合要求的错误类型定义。

验证示例调用

  1. eval({add, 1, 2}, #{}) → {ok, 3}
  2. eval({add, a, b}, #{a=>1}) → {error, variable_not_found}
  3. eval({add, {add, a, b}, {add, 1, 2}}, #{a=>2, b=>3}) → {ok, 8}

内容的提问来源于stack exchange,提问作者Alseify

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:25:21