[erlang-questions] How to abstract out common receive clauses?

Ivan Uemlianin ivan@REDACTED
Fri May 6 13:12:06 CEST 2011


Thanks!  I knew there would be something.  Time for me to start using 
guards.

Best wishes

Ivan


On 06/05/2011 11:54, Torben Hoffmann wrote:
> -module(ivan).
>
> -compile(export_all).
>
>
> process(This,That,State) ->
>
>     receive
>     {From, do1} ->
>         From ! do1,
>         process(This,That,State);
>     {From, do2 } ->
>         From ! do2,
>         process(This,That,State);
>     {From, do3} when State=:=a ->
>         From ! do3,
>         process(This,That,b);
>     {From, do4} when State=:=b ->
>         From ! do4,
>         process(This,That,a)
>     end.
>
> listen(P) ->
>     receive
>     {send,M} ->
>         P ! {self(),M},
>         listen(P);
>     M ->
>         io:format("listen got: ~p~n",[M]),
>         listen(P)
>     end.
>
> Cheers,
> Torben
>
>
> On Fri, May 6, 2011 at 11:31, Ivan Uemlianin <ivan@REDACTED 
> <mailto:ivan@REDACTED>> wrote:
>
>     Dear All
>
>     % I have a process running continuously in a receive loop.  It
>     should act slightly differently depending on one of its state
>     parameters.  At the moment I have it like this:
>
>     process(This, That, a) ->
>        receive
>            {From, do1} ->
>                do1,
>                process(This, That, a);
>            {From, do2} ->
>                do2,
>                process(This, That, a);
>            {From, do3} ->
>                do3,
>                process(This, That, a)
>        end;
>
>     process(This, That, b) ->
>        receive
>            {From, do1} ->
>                do1,
>                process(This, That, b);
>            {From, do2} ->
>                do2,
>                process(This, That, b);
>            {From, do4} ->
>                do4,
>                process(This, That, b)
>        end.
>
>
>     % Most of the receive clauses are common to both versions of
>     process/3 (the real code is more complicated).  Is there a way to
>     abstract out the common parts?  An "object oriented" language
>     might use inheritance.  Prolog might use backtracking, perhaps a
>     bit like this:
>
>     iProcess(This, That, a) ->
>        receive
>            {From, do3} ->
>                do3,
>                iProcess(This, That, a)
>        end;
>
>     iProcess(This, That, b) ->
>        receive
>            {From, do4} ->
>                do4,
>                iProcess(This, That, b)
>        end;
>
>     iProcess(This, That, Other) ->
>        receive
>            {From, do1} ->
>                do1,
>                iProcess(This, That, Other);
>            {From, do2} ->
>                do2,
>                iProcess(This, That, Other)
>        end.
>
>
>     % A case would perhaps work, with the proviso that 'generic'
>     receives would be evaluated first:
>
>     cProcess(This, That, Other) ->
>        receive
>            {From, do1} ->
>                do1,
>                cProcess(This, That, Other);
>            {From, do2} ->
>                do2,
>                cProcess(This, That, Other)
>        end,
>        case Other of
>            a ->
>                receive
>                    {From, do3} ->
>                        do3,
>                        cProcess(This, That, Other)
>                end;
>            b ->
>                receive
>                    {From, do4} ->
>                        do4,
>                        cProcess(This, That, Other)
>                end
>        end.
>
>
>     % Is there a canonical way of dealing with this problem (other
>     than copy-and-paste)?
>
>     With thanks and best wishes
>
>     Ivan
>
>     -- 
>     ============================================================
>     Ivan A. Uemlianin
>     Speech Technology Research and Development
>
>     ivan@REDACTED <mailto:ivan@REDACTED>
>     www.llaisdy.com <http://www.llaisdy.com>
>     llaisdy.wordpress.com <http://llaisdy.wordpress.com>
>     www.linkedin.com/in/ivanuemlianin
>     <http://www.linkedin.com/in/ivanuemlianin>
>
>        "Froh, froh! Wie seine Sonnen, seine Sonnen fliegen"
>                         (Schiller, Beethoven)
>     ============================================================
>
>     _______________________________________________
>     erlang-questions mailing list
>     erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>     http://erlang.org/mailman/listinfo/erlang-questions
>
>
>
>
> -- 
> http://www.linkedin.com/in/torbenhoffmann


-- 
============================================================
Ivan A. Uemlianin
Speech Technology Research and Development

                     ivan@REDACTED
                      www.llaisdy.com
                          llaisdy.wordpress.com
                      www.linkedin.com/in/ivanuemlianin

     "Froh, froh! Wie seine Sonnen, seine Sonnen fliegen"
                      (Schiller, Beethoven)
============================================================




More information about the erlang-questions mailing list