我有条件表达式<e1?e2:e3>
。如果e1的计算结果为零,那么整个表达式的计算结果为e2的值,如果e1的计算结果为其他任何值,则整个表达式的值为e3。有人可以帮我指出如何添加条件表达式的正确方向吗?
答案 0 :(得分:2)
2评论:
0
和not 0
不是布尔表达式的常用值,在erlang中,它们是原子true
和false
。
虽然可以使用参数定义宏,但在许多模块之间通过包含文件共享这些宏并不常见。例外是应用程序或库范围内的记录定义。
我认为编写此选项的两种常用方法可以直接在代码中使用:
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),
答案 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).