As I've been learning Erlang, this has been the hardest thing to get to grips with. The fact that I often don't need to explicitly store my state anywhere, it will hang out in a receive block waiting for me to get back to it seems counter-intuitive. I crave a neat, labelled pigeon hole to store my state in .. but I don't need it.<div>
<br></div><div><br></div><div>Rob Lally.<br><br></div><div><br><div class="gmail_quote">2009/3/18 Thomas Lindgren <span dir="ltr"><<a href="mailto:thomasl_erlang@yahoo.com">thomasl_erlang@yahoo.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im"><br>
----- Original Message ----<br>
> From: bill robertson <<a href="mailto:billrobertson42%2Berlang@gmail.com">billrobertson42+erlang@gmail.com</a>><br>
</div><div class="im">> To: <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
</div><div class="im">> Sent: Wednesday, March 18, 2009 3:59:07 AM<br>
> Subject: Re: [erlang-questions] Please help me relate a past project to Erlang, I'm trying to understand...<br>
><br>
</div><div class="im">> Thats good.  Now, to make it *stateful* (and this is the heart of the<br>
> question).  Suppose you have the requirement to allow a web user to<br>
> view the call as it is in progress and show them who is connected<br>
> (telephone number), and how long they have been connected, and also<br>
> who is disconnected and how long they were connected.<br>
><br>
> To do this, you need to track three items for each participant.  The<br>
> telephone number.  The start time, and a stop time.<br>
><br>
> So network request comes in, we have to enumerate those pieces of<br>
> information for it and send them back to the client.<br>
><br>
> How would you implement this in a typical Erlang system?<br>
<br>
<br>
</div>The simplest approach is to use plain erlang and message passing. Something like:<br>
<br>
start_conference_call(Name) -><br>
   spawn_link(<br>
     fun() -><br>
       register(Name, self()),<br>
       Empty_state = [],<br>
       conf_call_loop(Empty_state)<br>
    end).<br>
<br>
conf_call_loop(Callers) -><br>
   receive<br>
      {join, Caller} -><br>
         Time = erlang:now(),<br>
         conf_call_loop([{Caller, Time}|Callers]);   %% add a new caller<br>
      {leave, Caller} -><br>
         conf_call_loop(delete_caller(Caller, Callers));  %% delete a caller<br>
     {message, From, Msg} ->     %% send message to all participants<br>
         send_to_all(Callers, Msg),<br>
         conf_call_loop(Callers);<br>
     {status, Asker} ->   %% send status to asking process<br>
         Asker ! {status, Callers},<br>
         conf_call_loop(Callers);<br>
     stop -><br>
         ok<br>
   end.<br>
<br>
%% Client API<br>
status(ConfCall) -><br>
   ConfCall ! {status, self()},<br>
   receive<br>
      {status, Callers} -> {status, Callers}<br>
   end.<br>
<br>
... (code for some left-out functions) ...<br>
<br>
So, the conference call process keeps its state as a list passed arounf in conf_call_loop/1. Callers can join and leave and send messages to each other, all by sending messages to this process. You can also ask for status (which here just returns the list of callers and their join time) and stop the process. So, the conference call process itself is just a tail recursive function conf_call_loop/1 that processes messages forever (or until stopped). The state = list of callers lives as long as the conference call process.<br>

<br>
(Each caller would then itself be an erlang process, passing messages to/from the telephony driver and conference call process and any others involved.)<br>
<br>
Now, this is of course just a sketch, since the code is sloppy and you'd want to handle more cases in practice, _but_ it demonstrates the very simplest way to keep state.<br>
<div><div></div><div class="h5"><br>
Best,<br>
Thomas<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Blog : <a href="http://robertlally.com">http://robertlally.com</a><br>
</div>