2017-03-15 10 views
0

私は先生からこのコードを受け取りました。私はこのコードが何をしているかに悩まされています。これまで私が知っていたのは、[x1, y1 | z1] = Output2.abc(3)が呼び出されたため、abc(2)ファンクションはyという新しいプロセスを生成します。次に、値2をyに送信します。 2を受け取ったとき、私は受け取っているものについています。 z -> zの意味は?エリクサー、このプログラムは何をしていますか?

また、profは `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. 連結プロセスは、元のプロセスは、最近生成されたプロセスからのメッセージを待つ受信機
    1. としてn(z)を用いspawn_link/3で開始されます。プロセスは#2をで始めた#2
    2. (2 IE)プロセスに送信され
  3. パラメータxはn(x, y)ためのxへの呼び出しがあるn(v * v, v)
    1. n(v * v, v)の結果を送り返しで開始しました、およびyは異なる値である。
    2. だから、私たちはn(2*2, 2)です。 yのリストはn(x, x) 4.2 [4]
    3. の単一アイテムリストを返す、[2を起動している、と呼ばれるn(x, y+y) X = 4、Y =前のステップn(4, 2+2)から2
    4. と連結返しn(x,y) | [4]]の結果は[2 | 4](二つの要素のリスト:2、4)元のプロセスは、zz -> z
    5. パターンマッチングをX1 = 2を割り当てるために使用されzとしてリストを受信し、そして戻り
  4. とY1 = 4. z1は残りの部分の尾であり、空です。
+0

あなたの助けに感謝します。ありがとう –

0

z -> z機能を定義するだけのようなものです:fun(z) {return z}Zは受信機能から得たパラメータです。

関連する問題