[erlang-questions] Improving Erlang!

Hynek Vychodil <>
Wed Dec 1 23:30:54 CET 2010


2010/12/1 Gilberio Carmenates García <>:
> Hi all!
>
>
>
> Things like this could be nice in Erlang
>
>
>
> start(Type, Args)->
>
> ChkArg = fun(Arg)->
>
> case lists:keyfind(Arg, 1, StartArgs) of
>
> {Arg, true}->
>
> true;
>
> _->
>
> false
>
> end
>
> end,
>
>                if
>
>                               ChkArg(install)->
>
>                                               ?MODULE:install();
>
>                               ChkArg(debug)->
>
>                                               appmon:start();
>
>                               true->
>
>                                               %% Starts the application.
>
>
> evo_debug_module:print([{debug, true}], "~n~nApplication: \"~p\" is
> starting...~n", [?MODULE]),
>
>
> evo_debug_module:print([{debug, true}], "~nType: ~p   StartArgs: ~p~n",
> [Type, StartArgs]),
>
>                                               R =
> evo_main_supervisor:start_link(StartArgs),
>
>
> evo_debug_module:print([{debug, true}], "~nApplication: \"~p\" is ready.~n",
> [?MODULE]),
>
>                                               R
>
>                end.

If I understand what your code do (and I'm not sure that it is
supposed to do) I would write it in this way:

start(Type, Args)->
   ChkArg = fun(Arg)-> not lists:member({Arg, true}, Args) end,
   case lists:dropwhile(ChkArg, [install, debug]) of
        [install|_] -> ?MODULE:install();
        [debug|_] -> appmon:start();
        [] -> %% Starts the application.
            evo_debug_module:print([{debug, true}], "~n~nApplication:
\"~p\" is starting...~n", [?MODULE]),
            evo_debug_module:print([{debug, true}], "~nType: ~p
StartArgs: ~p~n", [Type, StartArgs]),
            R = evo_main_supervisor:start_link(StartArgs),
            evo_debug_module:print([{debug, true}], "~nApplication:
\"~p\" is ready.~n", [?MODULE]),
            R
   end.

I think that lists:dropwhile(fun(X) -> not lists:member(X, Args) end,
ToDo) is pretty idiomatic way for this purpose.

>
> But that is impossible since the ‘if’ clause only work with guards, so since
> we can not define our own guards that and many other limitations can come
> up.
>
>
>
> Other nice example of the Erlang limitations could be
>
>
>
> get(Name)->
>
> MatchHead = #t_char{name='$1', _='_'},
>
>                Guard = {'user_define_compare/2', '$1', Name},       %%
> instead of {'==', '$1', Name}
>
>                Result = '$_',
>
>                mnesia:dirty_select(t_char,[{MatchHead, [Guard],
> [Result]}]).
>
>
>
> Or
>
>
>
> … when are_approximately_equals(Name, Name2) ->…             %% if I want to
> Search a name in a list, that I don’t know exactly what name is… could be in
> the list Iván Carmenates García and I search by Ivan Garcia… if the names
> are in the database then using just mnesia:select/3 or match I can do that
> in just almost one step, since I used my own user defined compare that
> validates the approximately match between the real full name and the part of
> the name I introduced.
>
>
>
>
>
>
>
> Regards,
>
>
>
>
>
> Ivan.
>
>
>
> =======================================================================
> Este mensaje ha sido enviado mediante el servicio de correo electrónico que ofrece la Federación de Radioaficionados de Cuba a sus miembros para respaldar el cumplimiento de los objetivos de la organización y su política informativa. La persona que envía este correo asume el compromiso de  usar el servicio a tales fines y cumplir con las regulaciones establecidas.
>



-- 
--Hynek (Pichi) Vychodil

Analyze your data in minutes. Share your insights instantly. Thrill
your boss.  Be a data hero!
Try GoodData now for free: www.gooddata.com


More information about the erlang-questions mailing list