[erlang-questions] Pattern matching in function calls
Wed Apr 13 20:44:44 CEST 2011
probably not quite the answer you were looking for, but aim for
readability first (that's usually already hard enough :-). Only
compromise that if something is measurably too slow.
In the example you give, it doesn't appear to make any big difference
for readability, but I assume your real code is a bit more
On 4/13/11, Dave Challis <dsc@REDACTED> wrote:
> On 13/04/11 13:46, Antoine Koener wrote:
>> On Apr 13, 2011, at 13:44 , Dave Challis wrote:
>>> Does the order of patterns in a function call matter? Are they all
>>> tested, or will erlang stop trying to match them once a mismatch has
>>> been found?
>>> As an example, if I've got:
>>> foo(<<SomeLargeBinary>>, a) -> a;
>>> foo(<<SomeLargeBinary>>, b) -> b.
>>> will the above be any slower than defining:
>>> foo(a, <<SomeLargeBinary>>) -> a;
>>> foo(b, <<SomeLargeBinary>>) -> b.
>>> Will the <<SomeLargeBinary>> attempt to be matched in every case? Is
>>> it something worth thinking about, or will the compiler optimise this?
>> If the content of <<SomeLargeBinary>> is irrelevant, you can use the '_'
>> foo(a, _Bin) -> a;
>> foo(b, _Bin) -> b;
>> Then this is explicit for the reader that you don't want to check _Bin.
> Sorry, my example wasn't great, I was more wondering about the cases
> when the binary data is relevant.
> So a better example might be:
> foo(<<$x,_Rest/binary>>, a) -> a1;
> foo(<<$y,_Rest/binary>>, a) -> a2;
> foo(<<$z,_Rest/binary>>, a) -> a3;
> foo(<<$x,_Rest/binary>>, b) -> b.
> If I then called:
> foo(<<"x">>, b).
> Would erlang perform 4 binary pattern matches until it got to the last
> Or would it optimise things and only perform a single binary match by
> matching on the atoms first?
> Or will it always test all arguments in all cases?
> Dave Challis
> erlang-questions mailing list
More information about the erlang-questions