dynamic classes and duck typing

Denis Koroskin 2korden at gmail.com
Tue Dec 1 04:07:58 PST 2009


On Tue, 01 Dec 2009 15:05:16 +0300, Ary Borenszweig <ary at esperanto.org.ar>  
wrote:

> Ary Borenszweig wrote:
>> retard wrote:
>>> Tue, 01 Dec 2009 03:16:47 -0800, Walter Bright wrote:
>>>
>>>> Ary Borenszweig wrote:
>>>>> Can you show examples of points 2, 3 and 4?
>>>> Have opDispatch look up the string in an associative array that  
>>>> returns
>>>> an associated delegate, then call the delegate.
>>>>
>>>> The dynamic part will be loading up the associative array at run time.
>>>
>>> This is not exactly what everyone of us expected. I'd like to have  
>>> something like
>>>
>>> void foo(Object o) {
>>>   o.duckMethod();
>>> }
>>>
>>> foo(new Object() { void duckMethod() {} });
>>>
>>> The feature isn't very dynamic since the dispatch rules are defined  
>>> statically. The only thing you can do is rewire the associative array  
>>> when forwarding statically precalculated dispatching.
>>  Exactly! That's the kind of example I was looking for, thanks.
>
> Actuall, just the first part of the example:
>
> void foo(Object o) {
>     o.duckMethod();
> }
>
> Can't do that because even if the real instance of Object has an  
> opDispatch method, it'll give a compile-time error because Object does  
> not defines duckMethod.
>
> That's why this is something useful in scripting languages (or ruby,  
> python, etc.): if the method is not defined at runtime it's an error  
> unless you define the magic function that catches all. Can't do that in  
> D because the lookup is done at runtime.
>
> Basically:
>
> Dynanic d = ...;
> d.something(1, 2, 3);
>
> is just a shortcut for doing
>
> d.opDispatch!("something")(1, 2, 3);
>
> (and it's actually what the compiler does) but it's a standarized way of  
> doing that. What's the fun in that?

The fun is that you can call d.foo and d.bar() even though there is no  
such method/property.

In ActionScript (and JavaScript, too, I assume), foo.bar is auto-magically  
rewritten as foo["bar"]. What's fun in that?



More information about the Digitalmars-d mailing list