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.

Reply via email to