0

プロセス Pid に値を設定する関数があり、プロセスを別のプロセスに依存させることができます。したがって、プロセスに値を設定すると、それに依存するプロセスにも値を設定する必要があります。ただし、プロセス間に円がある場合

i.e. A depends on B and B depends on A 

次に、エラーメッセージを返したいです。

既に値が変更されている Pid のリストを渡して、同じ Pid に 2 回遭遇した場合 (Pid のリストのメンバーであるかどうかを確認することによって)、関数全体が停止するようにします。これは私のコードです:

set_values(Pid, Value, PidSet, PidList) ->
  case lists:member(Pid, PidList) of 
    false -> io:format("Setting Value~n"),
    lists:map(fun(Pid) ->
     Pid ! {self(), set_value, Value, [Pid | PidList]} end, PidSet);
    true -> io:format("circle_detected~n"),
    Pid ! {circle_detected}
  end.

実行すると、次のエラーが表示されます。

=ERROR REPORT==== 2-Nov-2014::17:47:45 ===
Error in process <0.888.0> with exit value: {badarg,[{lists,member,
[<0.888.0>,empty_list],[]},{process,set_viewer_values,4,[{file,"process.erl"},{line,56}]},
{process,looper,2,[{file,"process.erl"},{line,116}]}]}

私が理解していることから、私はリストに悪い引数を与えます:メンバー関数。私は何をすべきか?

ありがとう

4

1 に答える 1

2

エラー メッセージを読むと{lists,member, [<0.888.0>,empty_list] ...listsはモジュール、memberは関数名、[<0.888.0>,empty_list]は引数 (2 つ) がリストとして表示されています。したがって、変数が atom であると呼び出しlists:nenber/2PidListます empty_list。そして、これはあなたにエラーを与えます。

したがって、関数がどのように呼び出されているか (推奨) を調べるか、またはPidListlikeでパターン マッチを作成する必要があります。

set_values(Pid, Value, PidSet, _PidList = empty_list) ->
   ...
于 2014-11-02T17:49:57.057 に答える