digitalmars.D - Feature Request: Support delegate literal context skipping
- downs <default_357-line yahoo.de> Oct 12 2007
- Frits van Bommel <fvbommel REMwOVExCAPSs.nl> Oct 12 2007
- Tom S <h3r3tic remove.mat.uni.torun.pl> Oct 12 2007
- BCS <BCS pathlink.com> Oct 12 2007
In the following situation
class Foo {
int e;
void delegate() bar() {
return { e++; };
}
}
the delegate literal will not work. This is because its context is bar,
and bar has ended. But the literal doesn't *need* anything from bar.
Because of this, I propose in situations where a delegate literal
doesn't access the immediate surrounding stack frame, its context be the
first frame (or class) that it does access.
So in this example, { e++; } 's .ptr would point at the respective
instance of Foo, allowing this to work.
Disadvantages: None
Advantages: potentially highly helpful with user interface code, where
such callbacks are commonplace.
Looking forward to comments
--downs
Oct 12 2007
downs wrote:In the following situation class Foo { int e; void delegate() bar() { return { e++; }; } } the delegate literal will not work. This is because its context is bar, and bar has ended. But the literal doesn't *need* anything from bar. Because of this, I propose in situations where a delegate literal doesn't access the immediate surrounding stack frame, its context be the first frame (or class) that it does access. So in this example, { e++; } 's .ptr would point at the respective instance of Foo, allowing this to work.
IIRC this has been proposed before. vote++: Or should I say "return { vote++; }"? ;)
Oct 12 2007
{ downs wrote:
> In the following situation
>
> class Foo {
> int e;
> void delegate() bar() {
> return { e++; };
> }
> }
>
> the delegate literal will not work. This is because its context is bar,
> and bar has ended. But the literal doesn't *need* anything from bar.
>
> Because of this, I propose in situations where a delegate literal
> doesn't access the immediate surrounding stack frame, its context be the
> first frame (or class) that it does access.
> So in this example, { e++; } 's .ptr would point at the respective
> instance of Foo, allowing this to work.
>
> Disadvantages: None
> Advantages: potentially highly helpful with user interface code, where
> such callbacks are commonplace.
}.votes++;
--
Tomasz Stachowiak
http://h3.team0xf.com/
h3/h3r3tic on #D freenode
Oct 12 2007
downs wrote:In the following situation class Foo { int e; void delegate() bar() { return { e++; }; } } the delegate literal will not work. This is because its context is bar, and bar has ended. But the literal doesn't *need* anything from bar. Because of this, I propose in situations where a delegate literal doesn't access the immediate surrounding stack frame, its context be the first frame (or class) that it does access. So in this example, { e++; } 's .ptr would point at the respective instance of Foo, allowing this to work. Disadvantages: None Advantages: potentially highly helpful with user interface code, where such callbacks are commonplace. Looking forward to comments --downs
The way I want it is that a delegate literal can specify the context like this. class Foo { int e; void delegate() bar() { return this.{ e++; }; //note "this." } }
Oct 12 2007









Frits van Bommel <fvbommel REMwOVExCAPSs.nl> 