Erlang:能否在编译时计算数据结构字面值(常量)?

4
这可能是一个幼稚的问题,我猜答案是“是”,但是在这里和其他地方搜索“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}}.
3个回答

4
不,Erlang编译器不会对调用外部模块的函数进行部分求值,其中包括set。您可以使用著名的parse_transct_expand模块来实现这种效果。

1

鉴于集合不是Erlang的本地数据类型,而实际上它只是一个用Erlang编写的库,我认为编译器在编译时创建集合是不可行的。


这个集合只是一个例子 - 不要根据它来回答问题。如果你暗示Erlang将使用某些数据结构进行优化,那么哪些数据结构符合条件? - X Z
@XZ,我猜这可能对你很有趣 http://forum.trapexit.org/viewtopic.php?t=6009 - Odobenus Rosmarus

1

正如你所见,Erlang 中的集合没有进行优化(就像其他用 Erlang 编写的库一样)。 解决问题的方法是计算集合一次,并将其作为参数传递给函数,或者使用 ETS/Mnesia。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接