Elixir,这个程序在做什么?

时间:2017-03-15 04:20:16

标签: concurrency elixir spawn

我的老师给了我这个代码。我无法遵循此代码的功能。到目前为止,这就是我所知道的:[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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

z -> z就像函数定义一样:fun(z) {return z} z 是从接收功能获得的参数。