# Old style vs. new style boolean expressions
Sebastian Strollo
sstrollo@REDACTED
Tue Oct 8 22:38:19 CEST 2002
James Hague <jamesh@REDACTED> writes:
> > I don't think this make much of a difference most of the
> > time, and even if it
> > increases the size noticeably - does it matter ?
>
> It only matters to people who obsessively peek behind the scenes :)
For those that are curious there is always the 'S' option to the
compiler - it outputs the beam "assembly" into a "module.S" file. So
for example the following:
-module(f).
-compile(export_all).
f1(N) when N >= $A, N =< $Z -> true;
f1(N) when N >= $a, N =< $z -> true;
f1(N) when N >= $0, N =< $9 -> true;
f1($_) -> true;
f1(_) -> false.
f2(N) ->
((N >= $A) and (N =< $Z)) or
((N >= $a) and (N =< $z)) or
((N >= $0) and (N =< $9)) or
(N == $_).
(I only have R7 at hand, so no andalso, orelse). And run the compiler
on that, like this:
1> compile:file(f, ['S']).
{ok,f}
Now you will have a file called f.S, and looking at f1 and f2 you will
see that it generates very different code indeed...
{function, f1, 1, 2}.
{label,1}.
{func_info,{atom,f},{atom,f1},1}.
{label,2}.
{test,is_ge,{f,5},{x,0},{integer,65}}.
{test,is_ge,{f,5},{integer,90},{x,0}}.
{move,{atom,true},{x,0}}.
{'%live',1}.
return.
{label,5}.
{test,is_ge,{f,6},{x,0},{integer,97}}.
{test,is_ge,{f,6},{integer,122},{x,0}}.
{move,{atom,true},{x,0}}.
{'%live',1}.
return.
{label,6}.
{test,is_ge,{f,4},{x,0},{integer,48}}.
{test,is_ge,{f,4},{integer,57},{x,0}}.
{move,{atom,true},{x,0}}.
{'%live',1}.
return.
{label,4}.
{test,is_eq_exact,{f,7},{x,0},{integer,95}}.
{move,{atom,true},{x,0}}.
{'%live',1}.
return.
{label,7}.
{move,{atom,false},{x,0}}.
{'%live',1}.
return.
{function, f2, 1, 10}.
{label,9}.
{func_info,{atom,f},{atom,f2},1}.
{label,10}.
{bif,'>=',{f,0},[{x,0},{integer,65}],{x,1}}.
{bif,'=<',{f,0},[{x,0},{integer,90}],{x,2}}.
{bif,'and',{f,0},[{x,1},{x,2}],{x,1}}.
{bif,'>=',{f,0},[{x,0},{integer,97}],{x,2}}.
{bif,'=<',{f,0},[{x,0},{integer,122}],{x,3}}.
{bif,'and',{f,0},[{x,2},{x,3}],{x,2}}.
{bif,'or',{f,0},[{x,1},{x,2}],{x,1}}.
{bif,'>=',{f,0},[{x,0},{integer,48}],{x,2}}.
{bif,'=<',{f,0},[{x,0},{integer,57}],{x,3}}.
{bif,'and',{f,0},[{x,2},{x,3}],{x,2}}.
{bif,'or',{f,0},[{x,1},{x,2}],{x,1}}.
{bif,'==',{f,0},[{x,0},{integer,95}],{x,2}}.
{bif,'or',{f,0},[{x,1},{x,2}],{x,0}}.
{'%live',1}.
return.
Cheers,
/Sebastian
More information about the erlang-questions
mailing list