D - Another type-safe variable argument list idea
- Vathix (66/66) Sep 01 2003 Another one of my crazy ideas for type-safe variable argument functions....
Another one of my crazy ideas for type-safe variable argument functions. I
think this one is more practical. I only implemented char in this example
for simplicity:
char[] format(char[] f, this ...)
{
uint ibefore, index = 0;
char[] result;
/*
called first, must have no arguments; not necessary if no startup code
*/
this()
{
}
/*
just a nested function
*/
void findNext()
{
ibefore = index;
while(index != f.length)
{
if(f[index] == '%')
{
index++;
break;
}
index++;
}
}
/*
called when a char is passed as a parameter to the ...
*/
this(char ch)
{
findNext();
if(index == f.length || f[index] != 'c')
throw new FormatException("Expected %c in format string");
/*
index - 1 to exclude the %c
*/
result ~= f[ibefore .. index - 1] ~ (&ch)[0 .. 1];
/*
skip %c
*/
index++;
}
/*
called after matching all parameters; must return the type of the function
if not void
*/
~this()
{
findNext();
if(index != f.length)
throw new FormatException("Not enough parameters");
return result ? result ~ f[ibefore .. f.length] : f;
}
}
It would be used very similarly to printf/sprintf:
char[] s = format("hello %c world", 'D');
If a parameter is passed to it and the function doesn't have a constructor
for that type, it's a compile-time error! It would be up to the person
implementing the var arg function to allow, for example, a char to match
with a %d; or it could require the caller to cast it.
As for implementing this into the language, I think it could be setup like
an auto class with an overloaded operator.
Sep 01 2003








"Vathix" <vathix dprogramming.com>