[erlang-questions] pattern match test operator

Andras Georgy Bekes bekesa@REDACTED
Fri Nov 16 23:44:08 CET 2007


Hi,

> Unless there is some use case I can't see right now, the constructs
> you are suggesting are not really needed.
Not needed: everything can be programmed without them, but sometimes in 
an ugly way.

> More precisely, I can't see when I would want to do a match against a
> pattern containing only '_'s and if that is true I wouldn't need to
> match again to retrieve some of the internal terms later on. In this
> case, it's better to match even the internal structure from the
> start.
For example, today I've seen a piece of code (in AXD301 sources) that 
looked like:

case Expr1 of
   PATTERN1 ->
      case Expr_with_side_effects of
         [[{_,0,_,_,}]] ->
            do_something1();
         _ ->
            do_something2()
      end;
   _ ->
      do_something2()
end

The strange pattern above is real, other parts are changed of course.
Actually this was the reason I wrote this mail: we coudn't find any 
elegant solution.

My suggested (elegant) solution is:
case ?MATCH(PATTERN1,Expr1) andalso 
     ?MATCH([[{_,0,_,_,}]],Expr_with_side_effects) of
   true ->
      do_something1();
   _ ->
      do_something2()
end	


Other example: The whole ets:match is about matching against a pattern 
containing only '_'s. But yes, you got the point: The patterns should 
be allowed to contain any variables, because having a variable more 
than once in a pattern is useful (this is why patterns for ets:match 
can contain '$1','$2'... stuff, but that's ugly).

> * One could rewrite
>
>   case Value1 of
>      PATTERN1 ->
>          case Value2 of
>              PATTERN2 ->
>                  this;
>              _ ->
>                  that
>          end;
>      _->
>          that
>   end
>
> as
>
>   case {Value1, Value2} of
>      {PATTERN1, PATTERN2} ->
>            this;
>      _->
>           that
>   end
Not acceptable. This evaluates Value2 unconditionally. The original 
evaluates it only if Value1 matches PATTERN1 (think about side effects 
and runtime). The names Value1 and Value2 were misleading. Think about 
Expr1, Expr2.

> * Regarding
>       fun(Arg) when ?MATCH(PATTERN1,Arg) or ?MATCH(PATTERN2,Arg) ->
> I'm not sure why you want to match Arg against two patterns.
I've seen a code fragment (in AXD301) several weeks ago, so I can't 
remember correctly, but: The function was supposed to select the first 
case if one argument looked like "R7A..." or "R12C...".
This could be done with my construct:

function(X) when ?MATCH("R7A"++_,X) or ?MATCH("R12C"++_,X) ->
  complicated_function_body().

As far as I remember the function supposed to crash if there's no match.

All the solutions we've found were ugly in some way.

> If you 
> meant fun(Arg1, Arg2) when ?MATCH(PATTERN1,Arg1) or
> ?MATCH(PATTERN2,Arg2) -> then the usual way to do that is
>       fun(PATTERN1, PATTERN2) ->
I didn't mean this. I meant a function head that matches if an argument 
matches (at least) one of several patterns.

	Georgy



More information about the erlang-questions mailing list