[erlang-questions] How to do counters?

Alin Popa <>
Fri Jun 26 07:28:26 CEST 2009


Hi Jarrod,

Here is an example which might help:

*-module(test_counter).
-export([loop/0, increment_counter/2]).

loop() ->
    loop(0).

loop(CurrentCounter) ->
    receive
        {Pid, inc, Counter} ->
            NewCounter = inc(Counter, CurrentCounter),
            io:format("New counter ~p~n",[NewCounter]),
            Pid ! {NewCounter},
            loop(NewCounter);
        _ ->
            loop(CurrentCounter)
    end.

inc(Counter, NewValue) ->
    Counter + NewValue.

increment_counter(Pid, Count) ->
    Pid ! {self(), inc, Count},
    receive
        {NewValue} ->
            io:format("Got ~p~n", [NewValue]);
        _ ->
            ok
    end.

*
On Fri, Jun 26, 2009 at 4:45 AM, Jarrod Roberson <>wrote:

> On Thu, Jun 25, 2009 at 7:10 PM, Vance Shipley <> wrote:
>
> > On Thu, Jun 25, 2009 at 06:29:26PM -0400, Jarrod Roberson wrote:
> > }  what do you mean by "internal state" I don't understand how a process
> > would
> > }  store any mutable state
> >
> > http://erlang.org/doc/man/gen_server.html#Module:handle_call-3
> >
> > The last argument in gen_server/gen_fsm callback functions
> > is State.  It's "mutable" by the fact that the return value
> > includes NewState.
> >
> > In functional programming everything a function needs to know
> > is passed in as arguments.  Tail recursion keeps the balls in
> > the air.
> >
> >        loop(State) ->
> >                ...
> >                loop(NewState).
> >
> >
> > --
> >         -Vance
> >
>
> I still don't see how this is supposed to work.
> If I do tail recursion, how do I return anything, if the loop(NewState)
> needs to be the last thing I do?
>
> If I have functions inc() dec() and current() which should return the
> current value of the counter, how do all these functions share state? I
> can't have the client pass in the state because I will have many client
> processes calling the counter functions.
>
> There seems to be something I am missing that you guys know and I don't.
>



-- 
Regards,

Alin


More information about the erlang-questions mailing list