这可能是一个幼稚的问题,我怀疑答案是“是”,但是我在这里和其他地方都无法使用“ erlang编译器优化常数”等术语进行搜索。

无论如何,erlang编译器能否(将)创建一个在编译时为常数或文字的数据结构,并使用该数据结构而不是创建一遍又一遍地创建数据结构的代码?我将提供一个简单的玩具示例。

test() -> sets:from_list([usd, eur, yen, nzd, peso]).


编译器能否(将)简单地将集合保留在函数的输出中,而不是每次都进行计算?

我问的原因是,我想在正在开发的程序中有一个查询表。该表只是可以在编译时(至少在理论上)计算出的常数。我只想计算一次表,而不必每次都计算它。我知道我可以通过其他方式做到这一点,例如计算事物并将其存储在流程字典中(例如,也许是ets或mnesia表)。但是我总是从简单开始,对我来说,最简单的解决方案是,如果编译器对其进行优化,则可以像上面的玩具示例一样进行操作。

如果那行不通,还有其他方法可以实现我想要的吗? (我想我可以研究解析转换是否可以解决这个问题,但是比我想的要复杂吗?)

这只是在。我使用带有'S'选项的compile:file / 2来产生以下内容。我不是erlang汇编专家,但似乎未执行优化:

{function, test, 0, 5}.
{label,4}.
    {func_info,{atom,exchange},{atom,test},0}.
  {label,5}.
    {move,{literal,[usd,eur,yen,nzd,peso]},{x,0}}.
    {call_ext_only,1,{extfunc,sets,from_list,1}}.

最佳答案

不,erlang编译器不对set是的对外部模块的调用执行部分评估。您可以使用著名的ct_expandparse_trans模块来实现此效果。

10-06 05:16
查看更多