Thin delegate adapter

Dmitry Olshansky dmitry.olsh at gmail.com
Wed Jan 12 05:49:52 PST 2011


On 12.01.2011 16:07, Guilherme Vieira wrote:
> Ah, I totally missed that. But what if `s' went out of the scope and 
> the scope ended? Wouldn't the scope reference (the one containing `b') 
> be lost and cause memory corruption?
>
> E.g.:
>
>     Switch make_switch()
>     {
>         auto s = new Switch();
>         auto b = new ToggleButton();
>
>         s.watch = (Switch.State state) { b.toggled = cast(bool)(state); };
>
>
>         return s;
>     }
>
>
That's the main point of built-in delegates - the compiler detects them 
and places the enclosing stack frame on heap, so it's all sort of cool 
magic that just works :)
> -- 
> Atenciosamente / Sincerely,
> Guilherme ("n2liquid") Vieira
>
> On Wed, Jan 12, 2011 at 10:57 AM, Dmitry Olshansky 
> <dmitry.olsh at gmail.com <mailto:dmitry.olsh at gmail.com>> wrote:
>
>     On 12.01.2011 15:41, Guilherme Vieira wrote:
>
>         Hi,
>
>         I'm wondering if a delegate adapter template like isn't handy
>         for Phobos (it may be especially useful for std.signal):
>
>            class Switch
>            {
>                enum State { ON, OFF }
>
>                void trigger()
>                {
>                    switch (mState)
>                    {
>                        case State.ON: mState = State..OFF; break;
>                        case State.OFF: mState = State.ON; break;
>                        default: break;
>                    }
>
>                    if (watch !is null) watch(mState);
>                }
>
>                void delegate(State s) watch;
>
>                private State mState;
>            }
>
>            class ToggleButton
>            {
>                @property toggled(bool toggled)
>                {
>                    writeln("ToggleButton.toggled(", toggled, ")");
>                }
>            }
>
>            void main()
>            {
>                scope s = new Switch();
>                scope b = new ToggleButton();
>
>                s.watch = &b.toggled; // error: invalid conversion
>                s.watch = adapt!("obj.toggled = cast(bool)(a)",
>         Switch.State)(b);
>
>                s.trigger(); // prints `ToggleButton.toggled(true)`
>                s.trigger(); // prints `ToggleButton.toggled(false)`
>                s.trigger(); // prints `ToggleButton.toggled(true)`
>                s.trigger(); // prints `ToggleButton.toggled(false)`
>            }
>
>
>         Yes, it urges to be polished. Particularly, it doesn't support
>         multiple arguments. I also wanted to place the argument type
>         tuple somwhere else (actually wanted to hide it completely,
>         but I think that's not possible).
>
>         Feedback?
>
>         -- 
>         Atenciosamente / Sincerely,
>         Guilherme ("n2liquid") Vieira
>
>     How is it better then built-in language feature? This works just fine:
>        void main()
>        {
>     //they can't be scope  and compiler enforces this (+ scope is
>     deprecated)
>     //actually, the orignal code is unsafe - what hapens if adapted
>     delegate escapes current scope?
>            auto s = new Switch();
>            auto b = new ToggleButton();
>
>
>            s.watch = (Switch.State a){ b.toggled = cast(bool)a; };
>
>            s.trigger(); // prints `ToggleButton.toggled(true)`
>            s.trigger(); // prints `ToggleButton.toggled(false)`
>            s.trigger(); // prints `ToggleButton.toggled(true)`
>            s.trigger(); // prints `ToggleButton.toggled(false)`
>        }
>
>     -- 
>     Dmitry Olshansky
>


-- 
Dmitry Olshansky



More information about the Digitalmars-d mailing list