协助Erlang表达式

时间:2017-02-27 22:37:30

标签: erlang

我有条件表达式<e1?e2:e3>。如果e1的计算结果为零,那么整个表达式的计算结果为e2的值,如果e1的计算结果为其他任何值,则整个表达式的值为e3。有人可以帮我指出如何添加条件表达式的正确方向吗?

2 个答案:

答案 0 :(得分:2)

2评论:

  • 0not 0不是布尔表达式的常用值,在erlang中,它们是原子truefalse

    < / LI>
  • 虽然可以使用参数定义宏,但在许多模块之间通过包含文件共享这些宏并不常见。例外是应用程序或库范围内的记录定义。

我认为编写此选项的两种常用方法可以直接在代码中使用:

Result = case E1 of
    0 -> E2;
    _ -> E3
end,

定义一个本地函数:

choose(0,E2,_) -> E2;
choose(_,_,E3) -> E3.
...
Result = choose(E1,E2,E3),

当然(尽管我的第二句话意味着你会一次又一次地重复宏定义)你可以使用宏编写第一个:

-define(CHOOSE(E1,E2,E3),case E1 of 0 -> E2; _ -> E3 end).
...
Result = ?CHOOSE(E1,E2,E3),

另见本主题:How to write “a==b ? X : Y” in Erlang?

答案 1 :(得分:1)

case E1 =:= 0 of
    true -> E2;
    _    -> E3
end

如果在守护中允许E1表达式,它将生成与

完全相同的字节码
if E1 =:= 0 -> E2;
   true     -> E3
end

您可以将其设为宏:

-define(IF(E1, E2, E3), case E1 =:= 0 of
                           true -> E2;
                           _    -> E3
                        end).