<div dir="ltr">I think you'll have a hard time showing the difference between comma and andalso, but you can demonstrate it with semicolon and orelse.<div><br></div><div>These two functions have different semantics:</div>
<div><br></div><div><div>right_age(X) when hd(X) >= 16; X =< 104 -></div><div>        true;</div><div>right_age(_) -></div><div>        false.</div><div><br></div><div>right_age_2(X) when hd(X) >= 16 orelse X =< 104 -></div>
<div>        true;</div><div>right_age_2(_) -></div><div>        false.</div></div><div><br></div><div>1) The assembly code can of course tell the difference, in this case you can see the jumps are different.</div><div>
2) The {f, N} refers to a {label, N}. I believe the {x, N} refers to something like a register. I've never spent much time trying to understand this assembly though.<br></div><div>3) See above :) The assembly code is different for these two versions, you can see how the first one does a second test if the bif fails but the latter immediately returns false when the bif fails.</div>
<div><br></div><div>-bob</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, May 17, 2014 at 9:20 PM, Adel Zhang <span dir="ltr"><<a href="mailto:adelzhang@qq.com" target="_blank">adelzhang@qq.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">hi, I am currently reading "learnyousomeerlang". In "Syntax in Functions" chapter "guards" section, Fred said<br>

<br>
<quote><br>
Note: I've compared , and ; in guards to the operators andalso and orelse. They're not exactly the same, though. The former pair will catch exceptions as they happen while the latter won't. What this means is that if there is an error thrown in the first part of the guard X >= N; N >= 0, the second part can still be evaluated and the guard might succeed; if an error was thrown in the first part of X >= N orelse N >= 0, the second part will also be skipped and the whole guard will fail.<br>

</quote><br>
<br>
So I write a codesnippet:<br>
<br>
-module(g).<br>
-export ([right_age/1, right_age_2/1, right_age_3/1]).<br>
<br>
right_age(X) when X >= 16, X =< 104 -><br>
        true;<br>
right_age(_) -><br>
        false.<br>
<br>
<br>
right_age_2(X) when (X >= 16) andalso (X =< 104) -><br>
        true;<br>
right_age_2(_) -><br>
        false.<br>
<br>
right_age_3(X) when (X >= 16) and (X =< 104) -><br>
        true;<br>
right_age_3(_) -><br>
        false.<br>
<br>
<br>
And compile with 'S' option to get the assembly code as follow:<br>
<br>
{function, right_age, 1, 2}.<br>
  {label,1}.<br>
    {line,[{location,"g.erl",4}]}.<br>
    {func_info,{atom,g},{atom,<u></u>right_age},1}.<br>
  {label,2}.<br>
    {test,is_ge,{f,3},[{x,0},{<u></u>integer,16}]}.<br>
    {test,is_ge,{f,3},[{integer,<u></u>104},{x,0}]}.<br>
    {move,{atom,true},{x,0}}.<br>
    return.<br>
  {label,3}.<br>
    {move,{atom,false},{x,0}}.<br>
    return.<br>
<br>
<br>
{function, right_age_2, 1, 5}.<br>
  {label,4}.<br>
    {line,[{location,"g.erl",10}]}<u></u>.<br>
    {func_info,{atom,g},{atom,<u></u>right_age_2},1}.<br>
  {label,5}.<br>
    {test,is_ge,{f,6},[{x,0},{<u></u>integer,16}]}.<br>
    {test,is_ge,{f,6},[{integer,<u></u>104},{x,0}]}.<br>
    {move,{atom,true},{x,0}}.<br>
    return.<br>
  {label,6}.<br>
    {move,{atom,false},{x,0}}.<br>
    return.<br>
<br>
<br>
{function, right_age_3, 1, 8}.<br>
  {label,7}.<br>
    {line,[{location,"g.erl",15}]}<u></u>.<br>
    {func_info,{atom,g},{atom,<u></u>right_age_3},1}.<br>
  {label,8}.<br>
    {test,is_ge,{f,9},[{x,0},{<u></u>integer,16}]}.<br>
    {test,is_ge,{f,9},[{integer,<u></u>104},{x,0}]}.<br>
    {move,{atom,true},{x,0}}.<br>
    return.<br>
  {label,9}.<br>
    {move,{atom,false},{x,0}}.<br>
    return.<br>
<br>
<br>
<br>
Apparently the three version right_age function assembly code are almost same. It confuse me totally.<br>
<br>
1) can assembly code tell the function behaviour difference?<br>
2) what does {f,6} {x,0} in assembly code mean?<br>
3) how can I verify Fred's statement?<br>
<br>
<br>
______________________________<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>
</blockquote></div><br></div></div>