That actually makes sense.<br>Thanks for the clarification.<br><br>Aggelos<br><br><div class="gmail_quote">On Sun, Jan 13, 2013 at 10:46 PM, Richard Carlsson <span dir="ltr"><<a href="mailto:carlsson.richard@gmail.com" target="_blank">carlsson.richard@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think the short answer is that the Core Erlang spec was not updated when bitstrings were added.<br>
<br>
    /Richard<div><div class="h5"><br>
<br>
On 2013-01-13 18:00, Aggelos Giantsios wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
Hello everybody!!<br>
<br>
Let's assume we have the following code:<br>
<br>
-module(foo).<br>
bar() -> <<1:3>>.<br>
<br>
In R15B03, calling foo:bar() evaluates to <<1:3>> as we should expect.<br>
<br>
Should you compile the module to Core Erlang the resulting code is<br>
<br>
'foo'/0 =<br>
     fun () -><br>
#{#<1>(3,1,'integer',['<u></u>unsigned'|['big']])}#<br>
<br>
and by using the core_scan and core_parse modules the resulting AST in<br>
record format of foo is<br>
<br>
{c_fun,[],[],<br>
        {c_binary,[],<br>
                  [{c_bitstr,[],<br>
                             {c_literal,[],1},<br>
                             {c_literal,[],3},<br>
                             {c_literal,[],1},<br>
                             {c_literal,[],integer},<br>
                             {c_literal,[],[unsigned,big]}}<u></u>]}}<br>
<br>
Having said that, let's try to evaluate the above #c_fun{}.<br>
#c_fun{} has no parameters so we use an empty set of bindings and we<br>
evaluate #c_binary{}.<br>
#c_binary{} evaluates to the concatenation of the [#c_bitstr{}]. We have<br>
one #c_bitstr{} so the resulting valu is the value of #c_bitstr{}.<br>
#c_bitstr{} evaluates to <<1:3/unsigned-big-integer-<u></u>unit:1>> that equals<br>
to <<1:3>> making this the overall value of the #c_fun{}, which is<br>
consistent with what we got from the interpreter.<br>
<br>
However, in the Core Erlang 1.0.3 language specs, it explicitly says<br>
that the number of bits in the resulting value of a #c_binary{} must be<br>
divisible by 8 making it a valid Erlang binary. In this case, the<br>
#c_binary{} evaluates to the bitstring <<1:3>> which is not a valid<br>
binary. So, in theory, we should have raised an exception at this point.<br>
But this is not what happens when we evaluate foo:bar/0 in the interpreter.<br>
<br>
So is there an inconsistency with the Core Erlang specs or am I missing<br>
something?<br>
<br>
Thanks,<br>
Aggelos<br>
<br>
<br></div></div>
______________________________<u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
<br>
</blockquote>
<br>
</blockquote></div><br>