On Sun, 19 Apr 2009 10:42:19 -0400, Denis Koroskin <2kor...@gmail.com> wrote:

On Sun, 19 Apr 2009 18:26:11 +0400, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Sun, 19 Apr 2009 06:26:57 -0400, Denis Koroskin <2kor...@gmail.com> wrote:

On Sun, 19 Apr 2009 05:40:32 +0400, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Sat, 18 Apr 2009 21:10:27 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

Adam Burton wrote:
Andrei Alexandrescu wrote:
What about using something like '->' for dynamic calls instead of '.'?
That's absolutely useless. If I have to write anything different from
"." I might as well write "bloodyMaryBloodyMaryBloodyMary".

Andrei
You could even write 'noodles' but that doesn't really give me a reason as to why it's absolutely useless. Please clarify, I thought it seemed like a reasonable idea, if it isn't I would like to know why.

I apologize for the snapping. There's no excuse really, but let me mention that this thread has been particularly meandering.

The point of using "." is not syntactic convenience as much as the ability of the Dynamic structure to work out of the box with algorithms that use the standard notation.

Hm... the thought just occurred to me.

At what time are you going to use opDotExp so an entity be used in an algorithm rather than actually defining the functions directly? For example, if you want to make a class/struct a range, why not just define the functions directly? It seems odd to define them using opDotExp.


Variant variantRange = someRange();
foreach (element; variantRange) {
    // ...
}

Variant forwards all the front/back/etc methods to an underlying range.

Doesn't the current opDot solution do this? Forwarding all calls to a certain member is not a really compelling argument for changing opDot to allow dynamic method names.

-Steve

opDot is reprecated (use alias this instead) and will be eventually removed.

But "alias this" is quite unsafe because it exposes the inner data (which is supposed to be hidden in some case, think of reference counting wrapper - you never want to give raw access to an underlying data).

Besides, there are is a use-cases that you can't implement in a way other than opDotExp. For example, add some logging or profiling:

struct Profile(T)
{
    private T inner;

    auto opDotExp(string name, T...)(T args)
    {
        profiler.enter(name);
        scope(exit) profiler.leave();

return <forward a call to 'inner' - how one would do this?>(args);
    }
}


Yes, there are many things that opDotExp can do that opDot or alias this (which is essentially opDot without any code). Hooking every function call on a type seems to be one of the two killer use cases of this feature (the other being defining a large range of functions from which only a small number need to exist). But call forwarding seems not to be one of them. There are better ways to simply forward a call (such as in your variant example).

I'm pretty convinced that this is a useful feature, I still have qualms about how it's really easy to define a runtime black hole where the compiler happily compiles empty functions that do nothing instead of complaining about calling a function that does not exist.

Also, I don't think the requirement for this feature needs to be for the arguments to be templated, it should be sufficient to have a single string template argument. This way, you can overload opDotExp functions via argument lists.

And BTW, the answer to your question above I think:

mixin("return inner."~name~"(args)");

Andrei demonstrated this usage in his Pascalize example.

-Steve

Reply via email to