template functions, a special case of constant folding?

Hasan Aljudy hasan.aljudy at gmail.com
Thu Mar 23 15:34:07 PST 2006


Given the following expression:
#x = 10 * 5 + y;
the compiler will compute 10 * 5 at compile-time and convert the 
expression into
#x = 50 + y;

I think that's called constant-folding, am I right?

Why can't this be extended such that for the following function:
# int add( int x, int y ) { return x + y; }

if it's called with constant arguments:
# x = add( 10, 3 );

the compiler shall do the computation at compile time and convert it to:
# x = 13;
is there a particular reason for not doing that?

What I'm trying to say is, why do we need templates to do compile-time 
computation of square roots? (as shown on 
http://www.digitalmars.com/d/templates-revisited.html)

Why not, instead of calling the templated sqrt
#    x = sqrt!(2);
you just call the regular sqrt
#    x = sqrt(2);
and the compiler, if smart enough, should do the computation at compile 
time?

If it's too hard to make the compiler smart enough, then maybe we can 
add a keyword to hint to the compiler that if all arguments to this 
function are constants then it can be "folded"!
After all, that's essentially what the "template" keyword is doing! 
(kinda, not really though, I know).

# fold int add( int x, int y ) { return x + y; }
vs.
# template add( int x, int y ) { const add = x + y; }

The "fold" version of the function can be reused for non-constant 
arguments. Where as the templated version can't. (although I'm not 
entirely sure about that).








More information about the Digitalmars-d-announce mailing list