2008/11/24 Vance Shipley <span dir="ltr"><<a href="mailto:vances@motivity.ca">vances@motivity.ca</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I would like to have a function like this:<br>
<br>
        foo(<<_:Offset/binary, Foo:8, _/binary>>, Offset) -><br>
                bar(Bin, Foo).<br>
<br>
Unfortunately that doesn't work:<br>
<br>
        Eshell V5.6.5  (abort with ^G)<br>
        1> compile:file(codec).<br>
        ./codec.erl:15: variable 'Offset' is unbound<br>
        error</blockquote><div><br>The order in which arguments are matched is not defined so there is no guarantee that Offset has a value when the binary is matched.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I don't understand why the first version can't work but<br>
neither do I understand much about writing compilers.<br>
<br>
So instead I do this:<br>
<br>
        foo(Bin, Offset) -><br>
                <<_:Offset/binary, Foo:8, _/binary>> = Bin,<br>
                bar(Bin, Foo).<br>
<br>
This works fine of course but now I am trying to understand<br>
the meaning of this (optional) compiler warning:<br>
<br>
        Warning: INFO: using a matched out sub binary will prevent<br>
        delayed sub binary optimization<br>
<br>
How should I interpret this warning?</blockquote><div><br>The compiler and VM is smart and optimises the matching of a binary where the last segment is a binary. This makes it more efficient to use a binary like a list and pick things off the front.<br>
<br>*BUT* for this to work the reference to the whole binary, Bin your case, must not be used after the match, then the compiler can reuse that binary reference and save work. You reuse Bin and the compiler is warning you that when you do this it can't do a good a job as possible.<br>
<br>Robert<br><br></div></div>