another idea for compile time functions

Hasan Aljudy hasan.aljudy at gmail.com
Thu Feb 8 20:48:50 PST 2007


I think templates is the wrong way to go for compile-time meta-programming.

There's been some talk recently about executing functions at 
compile-time by some people, because these people (including me) feel 
that template recursion and tricks are not the appropriate way to 
manipulate/parse strings for specialized DSL (domain specific languages).

I will give you some ideas I have, and I would like to know your 
thoughts about them.

To me, compile time functions should employ the same concepts behind 
"constant folding": if an expression is composed of compile time 
constants, the compiler will compute the expression at compile time and 
replace it with the result.

# int x = 2 + 3;
will be optimized by the compiler to:
# int x = 5;
Here, the compiler computed the expression "2+3" at compile time, and 
replaced the expression with its result, "5".

The same concept should be applicable to compile time functions. A 
function is a complicated set of expressions.

Some functions are trivial; they take a set of parameters, do something 
with them, without calling or depending on other functions, and return 
the result.
A "trivial" example:
# int add( int x, int y ) { return x + y; }
If they take constant arguments, such functions can surely be computed 
at compile time without much hassle. Such that a call to
# int Q = add( 10, 12 );
can be replaced, at compile time, with this:
# int Q = 22;

The trick may lie in letting the compiler recognize these kind of 
functions. A simple solution might me to come up with a new attribute; 
let's call it "meta":
# meta int add( int x, int y ) { return x + y; }
This attribute will assist the compiler in recognizing that this 
function can be computed at compile time if it's given constant arguments.

Now, this may not be very useful because of the restriction that meta 
functions must not call other functions, which is very limiting; so we 
need to extend it.

If a function takes constant arguments and does call other functions, 
then it can only be executed at compile time if all of these other 
functions are meta functions.

example:
# void subtract( int x, int y ) { return add( x, -y ); }
This function calls "add", but add is a meta function that can be 
executed at compile time, and will be replaced at compile time with:
# void subtract( int x, int y ) { return x - y ); }
So this type of function can definitely be executed at compile time, and 
thus deserves to be a meta function.

# meta void subtract( int x, int y ) { return add( x, -y ); }

The same idea could be extended to string-manipulating functions.

Using these concepts as basis for compile-time meta-programming might 
give us another benefit: we don't have to write compile-time functions 
that repeat the same tasks already done by run-time functions (regex for 
example); we just have to be careful and design our functions so that 
they can be meta functions.

The idea is that if you call a meta function with non-constant 
arguments, the compiler shouldn't complain; it will just treat the 
function call in this case as a regular function call to a runtime function.

What do you think about this?! Please tell me your opinions.



More information about the Digitalmars-d mailing list