On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2kor...@gmail.com> wrote: > PHP allows function definition like this: > > void foo(Args args, string fileName = __FILE__, int line = __LINE__) > { > // do stuff > }
Hidden feature: D2 allows it too, at least with templates. void Throw(T : Throwable, string file = __FILE__, int line = __LINE__)(T ex) { ex.file = file; ex.line = line; throw ex; } void foobar() { Throw(new Exception("o hai")); } void main() { try foobar(); catch(RangeError e) writefln("(%s: %d) %s", e.file, e.line, e.msg); } I did find a sort of bug when trying a slightly different implementation of this though - any kind of explicit instantiation of the Throw template causes the __FILE__ and __LINE__ to be evaluated in the scope of the template rather than at the call site.