dynamic classes and duck typing
Denis Koroskin
2korden at gmail.com
Sat Nov 28 04:59:17 PST 2009
On Sat, 28 Nov 2009 10:16:33 +0300, Chris Nicholson-Sauls
<ibisbasenji at gmail.com> wrote:
> Walter Bright wrote:
>> One thing Java and Python, Ruby, etc., still hold over D is dynamic
>> classes, i.e. classes that are only known at runtime, not compile time.
>> In D, this:
>> s.foo(3);
>> could be emulated with:
>> s.dynamicMethod("foo", 3);
>> Unfortunately, that makes it impossible to use s with generic code
>> (besides looking unappealing). But with a small feature, we can make
>> this work:
>> struct S
>> {
>> ...
>> T opDynamic(s : string)(args...);
>> }
>> and then s.foo(3), if foo is not a compile time member of s, is
>> rewritten as:
>> s.opDynamic!("foo")(3);
>> and opDynamic defers all the nuts-and-bolts of making this work out of
>> the language and into the library.
>> In particular, opDynamic's parameter and return types should all be
>> instances of std.variant.
>> (This has come up in various forms in this n.g. before, but I don't
>> have any references handy.)
>
> Seems fine, but how will this interact with "alias...this" and opDot?
> The former seems simple enough: if the "alias...this" field provides the
> member, use that, otherwise fall back on opDynamic. The latter seems
> iffy, though. Maybe something like this:
>
> // if the return type of opDot provides the member...
> (auto tmp = s.opDot, tmp ? tmp.foo(3) : s.opDynamic!"foo"(3))
>
> Hmm... ew... but I can't think of anything better off-hand. The
> "simple" design would probably be for opDynamic's implementation to make
> the call on whether to forward to opDot's result; aka, push the decision
> to the programmer. Stick a mixin somewhere for the most basic case
> (what I showed above) and its no big deal.
>
> -- Chris Nicholson-Sauls
I think opDot should be deprecated and eventually removed. Never used it
since alias this was introduced. Why would you use it?
More information about the Digitalmars-d
mailing list