Programming Erlang, 2 e., Chapter 2, Exercise 4, put_file()
Yao Bao
free7by@REDACTED
Sat Jan 1 08:56:23 CET 2022
Underscore (_) or variable (Any) works, but in this case the receiver needs to know the sender’s address to send a reply.
We have to include the address of the sender in the message or register it with a name.
Cheers,
Yao
> 在 2022年1月1日,13:36,Nalin Ranjan <ranjanified@REDACTED> 写道:
>
>
> How about using an underscore(_) inside the receive ??
>
> नमस्ते।
> नलिन रंजन
>
>> On Sat, Jan 1, 2022, 8:24 AM Yao Bao <free7by@REDACTED> wrote:
>> Hello,
>>
>> > Now that we have figured out the bug -- the shell sent a command to the server for which there was no matching receive pattern -- it begs the question: how do I detect when a process is sent a message for which there is no matching receive pattern?
>>
>> Perhaps we cannot put any guarantee on this.
>>
>> > receive
>> > {Client, list_dir} ->
>> > Client ! {self(), file:list_dir(Dir)};
>> > {Client, {get_file, File}} ->
>> > Full = filename:join(Dir, File),
>> > Client ! {self(), file:read_file(Full)};
>> > {Client, {put_file, File, Bytes}} ->
>> > Full = filename:join(Dir, File),
>> > Client ! {self(), file:write_file(Full, Bytes)};
>> > {Client, U} ->
>> > Client ! {self(), {error, "Unknown command", U}};
>> > {Client, U, A} ->
>> > Client ! {self(), {error, "Unknown command", U, A}};
>> > {Client, U, A, B} ->
>> > Client ! {self(), {error, "Unknown command", U, A, B}}
>> > end,
>>
>> We cannot enumerate all kinds of patterns in the limited receive expression,
>> but we can solve this problem via properly designed message pattern.
>>
>> For the receiver, we can say, it can receive one kinds of message,
>> which is: {Client, Command}, then the sender should send messages matching
>> this pattern, or, the server has no responsibility for replying anything.
>>
>> With this design, the receive expression can be written as:
>>
>> > receive
>> > {Client, list_dir} ->
>> > Client ! {self(), file:list_dir(Dir)};
>> > {Client, {get_file, File}} ->
>> > Full = filename:join(Dir, File),
>> > Client ! {self(), file:read_file(Full)};
>> > {Client, {put_file, File, Bytes}} ->
>> > Full = filename:join(Dir, File),
>> > Client ! {self(), file:write_file(Full, Bytes)};
>> > {Client, Command} ->
>> > Client ! {self(), {error, "Unknown command", Command}}
>> > end,
>>
>> The sender can send such messages:
>>
>> > Server ! {self(), foo}
>>
>> > Server ! {self(), {foo, bar}}.
>> > Server ! {self(), {foo, bar, baz}}.
>>
>> After sending, the sender say:
>>
>> receive C -> C end
>>
>> And pattern C can match those messages happily.
>>
>> By the way, in my understanding, in the worst case, message passing
>> is reliable but no guarantee, so the receiver might consider that worst case and
>> handle it properly (add timeout mechanism is an example).
>>
>> Cheers,
>> Yao
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20220101/d79c499f/attachment.htm>
More information about the erlang-questions
mailing list