feature request: __ARGS__ for logging (cf __FILE__, __LINE__, __FUNC___)

timotheecour thelastmammoth at gmail.com
Fri Feb 1 02:34:06 PST 2013


One of the rare features I miss in C/C++ is stringification macro 
using "#x":

---
#include ...
#define DEBUG(x) disp_val(#x,x)
template<typename T>
void disp_val(const char*name, const T& x) {std::cout << name << 
"=" << x;}
int main(){
DEBUG(1+2); //will print 1+2=3 (and we can add line, file and 
func info)
ASSERT(1+2==4); //can also be defined such that it'll print 
1+2==4 failed...
}
---

In D, we have built-in assert message that'll print the failing 
expression "1+2==4 failed" in case of failure but that's about 
it: no further processing can be done on that message, and 
there's nothing we can do about the DEBUG(1+2) case. I did a 
function that requires one to write mixin(myDebug("1+2")); but 
that's not as good, especially because of the quoting that makes 
most IDE's unaware of the syntax inside (maybe monod would work 
but still...).

However there could be a clean D solution that alleviates need 
for macros:
I'd like to add __ARGS__ to the list of __FILE__, __LINE__, 
__FUNC___:

P1) 1st proposal:
__ARGS__ is a string representing the comma separated list of 
arguments passed:
void DEBUG(T,A)(T a, A args=__ARGS__){writeln(args,"=",a);}
void DEBUG2(T1,T2,A)(T1 a1,T2 a2, A args=__ARGS__){writeln(args);}
DEBUG(1+ 2); //will print "1+ 2=3", ie args="1+ 2"
DEBUG(1+ 2,
3*3);
//will print "1+ 2,3*3" (ie normalize the comma separation)

P2) same but __ARGS__ is string[] with one string per argument; 
the compiler already did the job of parsing, might as well use it:

void DEBUG(T)(T a1, T a2, string[] args=__ARGS__){
writeln(args[0],"=",a1);
writeln(args[1],"=",a2);
}

A question: whether or not to include the first argument in a 
UFCS/member function call ("hello".fun(1+2) ).

P3)
additionally, create a __CONTEXT__ that is a struct consisting of 
__ARGS__,__FILE__, __LINE__, __FUNC___. This has been proposed 
before and makes even more sense now. Additionally, it could give 
info on whether the call was UFCS'd or not, etc, information 
which is lost otherwise (I don't think traits could help 
distinguish which version was called, a.fun(b) or fun(a,b)).





More information about the Digitalmars-d mailing list