Elixir,这个程序在做什么?

Elixir, what is this program doing?

老师给了我这个密码。我无法理解这段代码的作用。这是我目前所知道的全部:[x1, y1 | z1] = Output2.abc(3) 被调用,因此函数 abc(2) 将产生一个分配为 y 的新进程。然后它将值 2 发送到 y。当它收到 2 时,我被困在接收正在做的事情上。 z -> z 是什么意思?

另外,教授问'x1, y1 是什么。我不明白这些变量在这段代码中的位置。如果有人可以指导我完成此操作,将不胜感激。谢谢

defmodule Output2 do
  def abc(x) do
    y = spawn_link(__MODULE__, :n, [self()])
    send y, x
    receive do
      z -> z
    end
  end

  def n(z) do
    receive do
      v -> send z, n(v * v, v)
    end
  end

  defp n(x, x), do: [x]
  defp n(x, y), do: [y | n(x, y + y)]
end

[x1, y1 | z1] = Output2.abc(2)
  1. Output2.abc(2) 被调用。
  2. 链接进程以 spawn_link/3 开始,使用 n(z) 作为接收者
    1. 原始进程等待来自最近生成的进程的消息。
  3. 参数 x(即 2)被发送到 #2 中启动的进程
  4. #2 中启动的进程发回 n(v * v, v) 的结果
    1. n(v * v, v) 是对 n(x, y) 的调用,因为 x 和 y 是不同的值。
    2. 所以,我们有 n(2*2, 2)n(x,y) returns yn(x, y+y) 连接的列表,其中 x = 4,y = 2
    3. 从上一步调用 n(4, 2+2),它调用 n(x, x) 返回 [4]
    4. 的单个项目列表
    5. 从 4.2 开始,[2 | [4]] 结果为 [2 | 4](两个元素的列表:2、4)
  5. 原进程接收列表为z,returnsz(z -> z)
  6. 模式匹配用于赋值x1 = 2,y1 = 4,z1为其余尾部,为空

z -> z 就像函数定义:fun(z) {return z} z 是从 receive 函数得到的参数。