[erlang-questions] Erlang elseif

Richard O'Keefe ok@REDACTED
Fri Nov 21 03:29:29 CET 2008


> On 2008-11-20 09:41, kdronnqvist@REDACTED wrote:

>> %% The no-good nested case way

Why do you call it "no-good"?
Looks fine to me.
>>
>> elseif2(A) ->
>>    case lists:member(A,?CAPS) of
>>        true ->
>>            io:format("Member of capital\n");
>>        false ->
>>            case lists:member(A,?SMALL) of
>>                true ->
>>                    io:format("Member of small\n");
>>                false ->
>>                    case lists:member(A,?NUMS) of
>>                        true ->
>>                            io:format("Member of nums\n");
>>                        false ->
>>                            io:format("Not a member\n")
>>                    end
>>            end
>>    end.

Let's do that with a macro:

-define(If_Member(X, Xs, T, F),
	case lists:member(X, Xs) of true -> T ; false -> F end).

ei(A) ->
     M = ?If_Member(A, ?CAPS,  "Member of capital\n",
         ?If_Member(A, ?SMALL, "Member of small\n",
         ?If_Member(A, ?NUMS,  "Member of nums\n",
                               "Not a member\n"))),
     io:format(M).

It's the same code, but it doesn't look like it.

There's always the higher order approach:

-compile(inline, {if_member/4}).
if_member(X, Ys, T, F) ->
     case lists:member(X, Ys)
       of true  -> T()
        ; false -> F()
     end.

ei(A) ->
     io:format(if_member(A, ?CAPS,  fun() -> "Member of capital\n" end,
      fun() -> if_member(A, ?SMALL, fun() -> "Member of small\n"   end,
      fun() -> if_member(A, ?NUMS,  fun() -> "Member of nums\n"    end,
                                    fun() -> "Not a member\n"      end)
      end) end)).

It's a functional language, the compiler does do inlining, and while
I'm usually a fan of legalistic indenting, readability trumps everything
else.





More information about the erlang-questions mailing list