[erlang-questions] erlang-questions Digest, Vol 12, Issue 98

John Haugeland <>
Fri May 30 16:42:13 CEST 2008


Forgive my being naive.

Now let's do it with abstract patterns.
>
> #quit() ->       quit;
> #quit() ->       {?MODULE,{signal,{window1,_}}};
> #quit() ->       {?MODULE,{signal,{quit1,_}}}.
>
> #connect() ->    {?MODULE,{signal,{connect,_}}}.
>
> #disconnect() -> {?MODULE,{signal,{disconnect,_}}}.
>
> #show_about() -> {?MODULE,{signal,{about1,_}}}.
>
> #hide_about() -> {?MODULE,{signal,{dialog1,_}}};
> #hide_about() -> {?MODULE,{signal,{dialogb,_}}}.
>
> #data(Data)   -> {data,Data}.
>
>    loop(State) ->
>        receive
>            #quit()       -> quit()
>          ; #connect()    -> loop(conn(State))
>          ; #disconnect() -> loop(disc(State))
>          ; #show_about() -> loop(show_about(State))
>           ; #hide_about() -> loop(hide_about(State))
>          ; #data(Data)   -> loop(update(State, Data))
>           ; X             -> io:fwrite("got ~p~n", [X]),
>                             loop(State)
>        end.
>

So what's the advantage of that over something like this?

isa_quit(State) ->
    case State of
        {?MODULE,{signal,{window1,_}}} -> true;
        {?MODULE,{signal,{quit1,_}  }} -> true;
        _                              -> false
    end.

isa_hide_about(State) ->
    case State of
        {?MODULE,{signal,{dialog1,_}}} -> true;
        {?MODULE,{signal,{dialogb,_}}} -> true;
        _                              -> false
    end.

isa_connect(State)    -> case State of {?MODULE,{signal,{connect,_}}}    ->
true; _ -> false end.
isa_disconnect(State) -> case State of {?MODULE,{signal,{disconnect,_}}} ->
true; _ -> false end.
isa_show_about(State) -> case State of {?MODULE,{signal,{about1,_}}}     ->
true; _ -> false end.

wrap_data(Data) -> {data,Data}.

loop(State) ->
    receive RcvState -> if
        isa_quit(RcvState)       -> quit();
        isa_connect(RcvState)    -> loop(conn(State));
        isa_disconnect(RcvState) -> loop(disc(State));
        isa_show_about(RcvState) -> loop(show_about(State));
        isa_hide_about(RcvState) -> loop(hide_about(State));
        isa_data(RcvState)       -> loop(update(State, RcvState));
        X             -> io:fwrite("got ~p~n", [X]), loop(State)
    end end.

Everything's still named and abstracted, easier to maintain, update and
repair, but this doesn't require new syntax or compiler alterations.  So,
what am I missing?

  - John, who REALLY REALLY WANTS SELECTIVE EXPORT BADLY
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080530/319551dc/attachment.html>


More information about the erlang-questions mailing list