dynamic classes and duck typing

biozic dransic at free.fr
Sun Nov 29 05:57:43 PST 2009


Le 29/11/09 14:23, Lutger a écrit :
> Denis Koroskin wrote:
>
>> On Sun, 29 Nov 2009 16:02:24 +0300, Lutger<lutger.blijdestijn at gmail.com>
> *snip*
>>> If you want to resolve the symbol at runtime I think you can get a better
>>> error message for throwing an exception or assertion. I don't have the
>>> svn
>>> dmd, so this isn't tested:
>>>
>>> void opDispatch(string name)(string file = __FILE__, int line = __LINE__)
>>> {
>>>    if ( !dynamicDispatch(name) )
>>>    {
>>>      // line and file are default initialized from the call site:
>>>      throw new MethodMissingException(name, file, line);
>>>    }
>>> }
>>>
>>>
>>
>> IIRC, this trick only works when __FILE__ and __LINE__ are both template
>> arguments.
>
> hey that's right. That means when Walter fixes the current bug with template
> parameters, good compile time error messages are possible after all.
>
>

I tried:

==============================================
module main;
import std.stdio;
import std.string;

class Test
{
     string foo(string name)(string file = __FILE__, int line = __LINE__)
     {
         return format("Call of Test.foo at %s(%d).", file, line);
     }

     string bar(string name, string file = __FILE__, int line = __LINE__)()
     {
         return format("Call of Test.bar at %s(%d).", file, line);
     }
}

void main()
{
     auto test = new Test;
     writeln(test.foo!"something");
     writeln(test.bar!"something");
}
==============================================

and the output is:

Call of Test.foo at test.d(21).
Call of Test.bar at test.d(12).



More information about the Digitalmars-d mailing list