Erlang 传递引用的细微差别

Erlang pass-by-reference nuances

9> A = lists:seq(1,10).
[1,2,3,4,5,6,7,8,9,10]
13> Fn = fun (L) -> [0|L] end.
#Fun<erl_eval.6.90072148>
14> Fn(A).
[0,1,2,3,4,5,6,7,8,9,10]
15> A.
[1,2,3,4,5,6,7,8,9,10]

如果 erlang 内部通过引用传递 (see this),为什么 A 的值没有反映变化?

关于按引用传递erlang,我缺少什么基本原理?

列表是 L=[Head|Tail] 形式的递归构造,其中 Head 是任何有效的 erlang 术语,Tail 应该是列表(如果它是其他东西,L 被称为不正确的列表,在本次讨论的范围)。

说 L 作为引用传递意味着:

  • 没有必要在函数参数中复制列表(对进程堆栈有好处 :o);
  • 函数returns一个值,它从不修改任何参数;
  • 在您的特定情况下,甚至不需要复制 A 来创建返回列表。由于变量是不可变的,如果你写 B = Fn(A),那么 B 将包含 A,它将正好是 [0|A].