[erlang-questions] return list or send message back
Joe Armstrong
erlang@REDACTED
Tue Oct 18 09:12:43 CEST 2011
On Mon, Oct 17, 2011 at 11:09 PM, Wes James <comptekki@REDACTED> wrote:
> I'm trying to learn how message passing works so I have a function
> that sends an "ls" message to another node and then when the other
> node receives it since "ls" is one of the matches for that it then
> runs a routine to list the files in a folder. Should I build a list
> and return the results or send a message back with the results.
The first alternative is easy
"build a list and return the results: yields the code
loop() ->
receive
{From, ls} ->
{ok, Dir} = file:get_cwd(),
{ok, FileNames} = file:list_dir(Dir),
From ! {self(), FileNames},
loop()
end.
(Note: This *implies* a certain directory - so I have used
file:get_cwd() (the current working directory)
But a better interface is to accept the message {ls, Dir} rather than ls.
"send a message back with the results" - but what does "the results" mean?
Does it mean this?
loop() ->
receive
{From, ls} ->
{ok, Dir} = file:get_cwd(),
From ! {self(), file:list_dir(Dir)},
loop()
end.
Note - you could be even *more* general - the server loop might be like this:
loop() ->
receive
{From, F} ->
From ! {self(), F()},
loop()
end.
Then you send the function you want evaluating to the server in a
message like this:
Server ! {self(), fun() -> file:list_dir("/home/joe") end}
As you can see there are many ways to do things.
Which is the "best" way - there is no answer - it depends upon your
criteria for "bestness"
The one that is "easiest to debug" is probably the one that just sends
back a list of files
it's well typed and easy to understand. Sending funs (the last
alternative) is *incredibly* powerful
but can yield code that it difficult to understand and debug.
Cheers
/Joe
>
> thanks,
>
> -wes
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
More information about the erlang-questions
mailing list