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)
Output2.abc(2)
被调用。
- 链接进程以 spawn_link/3 开始,使用
n(z)
作为接收者
- 原始进程等待来自最近生成的进程的消息。
- 参数 x(即 2)被发送到 #2 中启动的进程
- #2 中启动的进程发回
n(v * v, v)
的结果
n(v * v, v)
是对 n(x, y)
的调用,因为 x 和 y 是不同的值。
- 所以,我们有
n(2*2, 2)
。 n(x,y)
returns y
与 n(x, y+y)
连接的列表,其中 x = 4,y = 2
- 从上一步调用
n(4, 2+2)
,它调用 n(x, x)
返回 [4] 的单个项目列表
- 从 4.2 开始,[2 | [4]] 结果为 [2 | 4](两个元素的列表:2、4)
- 原进程接收列表为
z
,returnsz
(z -> z
)
- 模式匹配用于赋值x1 = 2,y1 = 4,z1为其余尾部,为空
z -> z
就像函数定义:fun(z) {return z}
z 是从 receive 函数得到的参数。
老师给了我这个密码。我无法理解这段代码的作用。这是我目前所知道的全部:[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)
Output2.abc(2)
被调用。- 链接进程以 spawn_link/3 开始,使用
n(z)
作为接收者- 原始进程等待来自最近生成的进程的消息。
- 参数 x(即 2)被发送到 #2 中启动的进程
- #2 中启动的进程发回
n(v * v, v)
的结果n(v * v, v)
是对n(x, y)
的调用,因为 x 和 y 是不同的值。- 所以,我们有
n(2*2, 2)
。n(x,y)
returnsy
与n(x, y+y)
连接的列表,其中 x = 4,y = 2 - 从上一步调用
n(4, 2+2)
,它调用n(x, x)
返回 [4] 的单个项目列表
- 从 4.2 开始,[2 | [4]] 结果为 [2 | 4](两个元素的列表:2、4)
- 原进程接收列表为
z
,returnsz
(z -> z
) - 模式匹配用于赋值x1 = 2,y1 = 4,z1为其余尾部,为空
z -> z
就像函数定义:fun(z) {return z}
z 是从 receive 函数得到的参数。