FAQ terminology harmonisation
Joe Armstrong
joe@REDACTED
Tue Apr 1 15:10:22 CEST 2003
On Tue, 1 Apr 2003, Ulf Wiger wrote:
> On 1 Apr 2003, Bjorn Gustavsson wrote:
>
> >Actually, we think that Erlang being a functional language
> >have scared too many programmers, so we plan some radical
> >changes.
>
> And about time too! I've suffered through 11 years of
> traditional erlang programming waiting for this!
...
Another improvement - which I've long awaited is to remove send and
receive (since they are redundant) - the enclosed code shows how to
send a message between two processes *without* using send and receive.
Here's a trace
1> c(send).
{ok,send}
12> send:demo(hello).
Sending :hello to <0.70.0>
<0.70.0>: received:hello
Observe that no send or receive is used only the more intuitively
understandable method of remote polling of the process dictionary with
process_info(Pid, dictionary) -
Unfortunately this code has a busy wait - so we'll have to ask Björn and
co to add a few more primitives, probably
on_put(Pid, Key, Fun)
meaning evaluate Fun() when Pid does put(Key, Val)
/Joe
----------- cut -----------------------
-module(send).
-compile(export_all).
demo(Term) ->
Self = self(),
Pid = spawn(fun() -> receiver(Self) end),
io:format("Sending :~p to ~p~n",[Term, Pid]),
new_send(Pid, Term),
ok.
new_send(Pid, Term) ->
put({to,Pid}, Term).
receiver(From) ->
Value = new_receive(From),
io:format("~p: received:~p~n", [self(), Value]).
new_receive(Pid) ->
{dictionary,D} = process_info(Pid, dictionary),
case check_dictionary(self(), D) of
{ok, Val} ->
Val;
error ->
new_receive(Pid)
end.
check_dictionary(S, [{{to,S},Term}|_]) ->
{ok, Term};
check_dictionary(S, [_|T]) ->
check_dictionary(S, T);
check_dictionary(S, []) ->
error.
sleep(N) ->
receive
after N ->
true
end.
More information about the erlang-questions
mailing list