[erlang-questions] Thinking in Erlang

Fri Apr 30 07:35:59 CEST 2010

```On Fri, Apr 30, 2010 at 12:10 AM, David N Murray < >wrote:

> On Apr 29, é»^Cè^@^@è³¢ (Yau-Hsien Huang) scribed:
>
> > On Wed, Apr 28, 2010 at 10:29 AM, David N Murray < > >wrote:
> >
> > {#Fun<test.0.44084711>,[c]}
> > 15>
> >
> > Right?
> >
>
> No, the lisp returns the queue (list).
>
> * (defparameter q (make-fqueue 3))
> Q
> * (funcall q 1)
> (1)
> * (funcall q 2)
> (2 1)
> * (funcall q 3)
> (3 2 1)
> * (funcall q 4)
> (4 3 2)
> *
>
> Dave
>

Interesting, mutable variables.

Two important features of Erlang are process-communication modelling and
immutable objects. Thus, one of same implementations can be:

----------------------------------------------------------------
%% In module "test"

% A client queue functions.
enq(Fq, E) ->
Fq ! {self(), E},
{Q,O} ->
{Q,O};
Q -> Q
end.

fqueue(N) ->
spawn(test, q, [N, []]).

% Function for maintaining a queue while manipulating a queue function.
q(N, Q) ->
{Pid, break} ->
Pid ! Q;
{Pid, E} ->
Q1 = [E|Q],
if length(Q1) > N ->
Pid ! {lists:sublist(Q1, 1, N),
lists:sublist(Q1, N+1, N+1)},
q(N, lists:sublist(Q1, 1, N));
true ->
Pid ! {Q1, []},
q(N, Q1)
end
end.
--------------------------------------------------

Output:

8> Q_ = test:fqueue(2).
<0.77.0>
9> test:enq(Q_,a).
{[a],[]}
10> test:enq(Q_,b).
{[b,a],[]}
11> test:enq(Q_,c).
{[c,b],[a]}
12>
```