[erlang-questions] bit operations/matching

Kostis Sagonas <>
Thu May 8 20:19:39 CEST 2008


Pieter Erlang wrote:
> Hi,
> 
> Can someone explain why line 2 fails (and line 3 not)?
> (also reproducible in other ways)
> 
> 
> Erlang (BEAM) emulator version 5.6.2 [async-threads:0]
> 
> Eshell V5.6.2 (abort with ^G)
> 1> B = <<0:1000>>.
> <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> 0,...>>
> 2> <<_:80,Val:2,_/binary>> = B.
> ** exception error: no match of right hand side value
> <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> 0,...>>

Till a point, Erlang supported only binaries == sequences of bytes.
Till then, the type qualifier that was to be used for matching against a 
  sequence of bytes was "binary".

Starting with R12, this type qualifier has been properly renamed "bytes" 
(but "binary" has been maintained for backwards compatibility reasons) 
so that programmers like Pieter Erlang are less likely to be confused by 
matching failures:

-------------------------------------------------------------------------
Eshell V5.6.3  (abort with ^G)
1> B = <<0:1000>>.
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,...>>
2> <<_:80,Val:2,_/binary>> = B.
** exception error: no match of right hand side value 
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                                         0,...>>
3> <<_:80,Val:2,_/bytes>> = B.
** exception error: no match of right hand side value 
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                                         0,...>>
-------------------------------------------------------------------------

I would strongly recommend that programs using "binary" get changed to 
"bytes".

If one really wants bit level pattern matching, the qualifier "bits" has 
been added for that purpose:

-------------------------------------------------------------------------
4> <<_:80,Val:2,_/bits>> = B.
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,...>>
5> <<_:13,Val:69,_/bits>> = B.
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,...>>
-------------------------------------------------------------------------


Kostis



More information about the erlang-questions mailing list