-3

私はErlangを初めて使用し、Pidに他のいくつかのPidにメッセージを送信させようとしています。

Pid、文字列(メッセージ)、および整数R(半径)を引数として取る関数があります。

broadcast(P, M, R) ->
  P ! {self(), friends},
  receive
    {P, Friends} ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->
  end.

新しいメッセージが受信されるのを待つこのリスナー関数があります。

looper({Name, Friends, Messages}) ->
  receive
    {From, friends} ->
       From ! {self(), Friends},
       looper({Name, Friends, Messages});
    {{broadcast, ID, M, R}, Friends}  ->
       % From ! {From, {self(), {ID, M}}},
       looper({Name, Friends, [{ID, M} | Messages]});
    terminate ->
      ok
  end.

関数ブロードキャストを呼び出すと、次のメッセージが表示されます。

faceinsok:broadcast(Pid, "asd", 1).                     
** exception error: bad argument
     in function  faceinsok:'-broadcast/3-lc$^0/1-0-'/5 (faceinsok.erl, line 56)

56 行目は次の行です。

[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],

私が理解していることから、メッセージを正しく渡していません:/何が間違っていますか?

4

1 に答える 1

1

また。55 行目で を受け取っており、それがリスト{P, Friends}であると仮定しFriendsます。しかし、53 行目で を送信しているので、そうではないと思います{self(), friends}。また、atom でリストの理解を行うことはできませんfriends

Friendsが実際にリストであるかどうかをチェックするガードを追加する必要があります。

  receive
    {P, Friends} when is_list(Friends) ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->

そして、あなたが思っているように機能しているかどうかを確認してください。

于 2014-10-05T15:09:50.993 に答える