[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