2017-03-15 29 views
0

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

此外,教授问什么`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) 
+0

将'x1'和'x2'设置在最底部。虽然,我没有看到'x2'或'y2'可能会被设置。递归参考:http://elixir-lang.org/getting-started/recursion.html – BenMorganIO

回答

1
  1. Output2.abc(2)被调用。
  2. 链接的流程被启动,使用n(z)作为接收机
    1. 原工艺等待来自最近生成的进程的消息spawn_link/3
  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)返回级联的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)
  5. 原工艺所接收的列表作为z,并返回zz -> z
  6. 模式匹配用于分配X1 = 2,和y 1 = z1是剩下的尾巴,它是空的。
+0

感谢您的帮助。谢谢 –

0

z -> z就像函数定义:fun(z) {return z}ž参数是从了接收功能。