[erlang-questions] Question about order of matching
Allen McPherson
mcpherson@REDACTED
Wed Mar 4 02:17:37 CET 2009
I have the following receive loop:
getResults(0) ->
'getResults ok';
getResults(N) ->
receive
{Test, ET, N, Bytes, Pid} ->
io:format("~p: ET: ~p~n", [Test, ET]),
getResults(N-1);
'unknown test' ->
io:format("unknown test~n"),
getResults(N-1);
Any ->
io:format("~p~n", [Any]),
getResults(N-1)
end.
When it is sent the following message:
MasterPid ! {allpairs, timer(wall_clock), N, Bytes, self()},
..the Any clause (which I put in for debugging purposes because nothing
was matching and the receive was blocking) matches and prints the
following:
{allpairs,2346,100,1048576,<6083.48.0>}
{allpairs,2109,100,1048576,<6084.38.0>}
{allpairs,2152,100,1048576,<6041.48.0>}
{allpairs,2159,100,1048576,<6082.48.0>}
I would have thought the first clause should have matched?
I tested in the shell:
(foo@REDACTED)1> {Test, ET, N, Bytes, Pid} = {allpairs,
2346,100,1048576,<6083.48.0>}.
1: syntax error before: '<'
The shell does not like the Pid syntax and I've Googled around to see
why this
is a problem even when using pid_to_list and list_to_pid.
This works though:
(foo@REDACTED)1> {Test, ET, N, Bytes, Pid} = {allpairs,
2346,100,1048576,self()}.
{allpairs,2346,100,1048576,<0.37.0>}
And, removing Pid in shell works too:
(foo@REDACTED)1> {Test, ET, N, Bytes} = {allpairs,2346,100,1048576}.
{allpairs,2346,100,1048576}
The same tactic (removing Pid) in the code still matches the Any clause.
Perhaps I'm not understanding something fundamental here? I suspect
this is
a dumb mistake on my part but I can't see it.
--
Al
More information about the erlang-questions
mailing list