dynamic classes and duck typing
retard
re at tard.com.invalid
Tue Dec 1 23:22:01 PST 2009
Tue, 01 Dec 2009 12:40:21 -0500, Steven Schveighoffer wrote:
> On Tue, 01 Dec 2009 11:58:43 -0500, Denis Koroskin <2korden at gmail.com>
> wrote:
>
>> On Tue, 01 Dec 2009 19:41:46 +0300, Steven Schveighoffer
>> <schveiguy at yahoo.com> wrote:
>>
>>> On Tue, 01 Dec 2009 11:20:06 -0500, Denis Koroskin <2korden at gmail.com>
>>> wrote:
>>>
>>>> On Tue, 01 Dec 2009 19:02:27 +0300, Steven Schveighoffer
>>>> <schveiguy at yahoo.com> wrote:
>>>>
>>>>
>>>>> You are missing the point of opDispatch. It is not runtime defined,
>>>>> because the compiler statically decides to call opDispatch. The
>>>>> dynamic part of opDispatch comes if you want to do something based
>>>>> on runtime values within the opDispatch function. e.g. the compiler
>>>>> doesn't decide at *runtime* whether to call opDispatch or some
>>>>> normal function named quack, it's decided at compile time.
>>>>> opDispatch could be completely compile-time defined since it is a
>>>>> template. But the 'dynamicness' of it is basically no more dynamic
>>>>> than a normal function which does something based on runtime values.
>>>>>
>>>>> Compare that to a dynamic language with which you can add methods to
>>>>> any object instance to make it different than another object, or
>>>>> make it conform to some interface.
>>>>>
>>>>>
>>>> Well, I believe it's possible to implement the same with opDispatch
>>>> (not just to any object, but to those that support it):
>>>>
>>>> void foo() {}
>>>>
>>>> Dynamic d = ..;
>>>> if (!d.foo) {
>>>> d.foo = &foo;
>>>> }
>>>>
>>>> d.foo();
>>>
>>> You could do something like this (I don't think your exact syntax
>>> would work), but you could also do something like this without
>>> opDispatch. But the name 'foo' is still statically decided. Note that
>>> opDispatch doesn't implement this ability for you, you still have to
>>> implement the dynamic calls behind it. The special nature of
>>> opDispatch is how you can define how to map any symbol to any
>>> implementation without having to explicitly use strings. In fact,
>>> opDispatch is slightly less powerful than such a method if the method
>>> uses a runtime string for dispatch.
>>>
>>> For example, in php, I can do this:
>>>
>>> foo($var)
>>> {
>>> $obj->$var();
>>> }
>>>
>>> The equivalent in D would be:
>>>
>>> foo(string var)
>>> {
>>> obj.opDispatch!(var)();
>>> }
>>>
>>> This I would consider to be true runtime-decided dispatch.
>>>
>>> -Steve
>>
>> As pointed out, ActionScript and JavaScript use foo.bar and foo["bar"]
>> interchangeably, so I believe we could do something similar.
>>
>> I believe there is no real difference between d.foo and d.bar for
>> opDispatch (except that it could calculate string hash at compile time
>> for faster hast-table lookup), and it would just call a generic
>> run-time method anyway. As such, this method could be made visible to
>> everyone:
>>
>> class Dynamic
>> {
>> // getter
>> @property Dynamic opDispatch(string prop) {
>> return this[prop];
>> }
>>
>> // setter
>> @property void opDispatch(string prop)(Dynamic value) {
>> this[prop] = value;
>> }
>>
>> ref Dynamic opIndex(string propName)
>> {
>> // do a hash-table lookup
>> }
>>
>> Dynamic opCall(Args...)(Args args)
>> {
>> // do magic
>> }
>> }
>
> This is a very nice example, I only see one minor problem with it: the
> "do a hash table lookup" has to tentatively add an element if one
> doesn't yet exist.
>
> However, opDispatch is even less runtime-decided in this example (it can
> always be inlined).
>
>> So essentially, opDispatch is just a syntax sugar. But it's very
>> important one, because not only it makes writing code easier, it would
>> allow using dynamic objects with generic algorithms.
>
> Essentially you could say opDispatch is dynamic at compile time.
> Runtime, not so much. But anything decided at compile time can be
> forwarded to a runtime function.
You don't seem to have any idea what the term 'dynamic' means. From
http://en.wikipedia.org/wiki/Dynamic_programming_language
“Dynamic programming language is a term used broadly in computer science
to describe a class of high-level programming languages that execute at
runtime many common behaviors that other languages might perform during
compilation, if at all.”
>From http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing
“A programming language is said to be dynamically typed, when the
majority of its type checking is performed at run-time as opposed to at
compile-time. In dynamic typing, types are associated with values not
variables.”
The dynamic quite clearly means something that happens at runtime. It's
not a compile time feature.
More information about the Digitalmars-d
mailing list