digitalmars.D.learn - Internal delegate and Stack Overflow
- tsalm (31/31) Nov 28 2008 Hello,
Hello,
I would do something like this, but this return me an execution error :
object.Exception: Stack Overflow
// --------CODE--------
class A
{
void delegate() dg;
void doIt()
{
dg();
}
}
class B
{
A a;
this()
{
a = new A;
a.dg = { doSomething(); };
}
void doSomething() { }
}
void main()
{
auto b = new B;
b.a.doIt();
}
// ------END CODE------
Is this a bug or have I do something wrong ?
Thanks in advance for your help,
TSalm
Nov 28 2008
Reply to TSalm,
Hello,
I would do something like this, but this return me an execution error
: object.Exception: Stack Overflow
// --------CODE--------
class A
{
void delegate() dg;
void doIt()
{
dg();
}
}
class B
{
A a;
this()
{
a = new A;
a.dg = { doSomething(); };
}
void doSomething() { }
}
void main()
{
auto b = new B;
b.a.doIt();
}
// ------END CODE------
Is this a bug or have I do something wrong ?
Thanks in advance for your help,
TSalm
If this is d1.0 the error is that you are allowing an anon delegate to escape
the enclosing function.
a.dg = &this.doSomething; // this would be ok if that helps.
if it is 2.0, I think this is correct.
Nov 28 2008
Le Sat, 29 Nov 2008 01:08:28 +0100, BCS <ao pathlink.com> a écrit:Reply to TSalm,Yes, it's on D1.036.Hello, I would do something like this, but this return me an execution error : object.Exception: Stack Overflow // --------CODE-------- class A { void delegate() dg; void doIt() { dg(); } } class B { A a; this() { a = new A; a.dg = { doSomething(); }; } void doSomething() { } } void main() { auto b = new B; b.a.doIt(); } // ------END CODE------ Is this a bug or have I do something wrong ? Thanks in advance for your help, TSalmIf this is d1.0 the error is that you are allowing an anon delegate to escape the enclosing function.a.dg = &this.doSomething; // this would be ok if that helps. if it is 2.0, I think this is correct.Yes, you are right. But this is an example code. The "true" code uses delegates with argument which differs from called functions, so I can't point delegate directly to them. And this anonymous function's way is really fastest to code... I must waiting for a D2 stable version ;-) Thanks
Nov 28 2008
Reply to TSalm,Yes, you are right. But this is an example code. The "true" code uses delegates with argument which differs from called functions, so I can't point delegate directly to them. And this anonymous function's way is really fastest to code... I must waiting for a D2 stable version ;-) Thanksyou can store off the values you need like this: struct C(R, A...) { A args; R function(A) dg; static R delegate() opCall(R function(A) dg, A a) { C!(R, A) ret; ret.dg=dg; foreach(int i,_;A) ret.args[i] = a[i]; return &ret.fn; } R fn() { return dg(args); } } // test it import std.stdio; int delegate() dg(int i) { return C!(int,int)(function int(int j){return j;}, i); // <--- used here } void main() { auto d = dg(5); writef("%s\n", d()); }
Nov 28 2008
Le Sat, 29 Nov 2008 01:49:20 +0100, BCS <ao pathlink.com> a écrit:
struct C(R, A...)
{
A args;
R function(A) dg;
static R delegate() opCall(R function(A) dg, A a)
{
C!(R, A) ret;
ret.dg=dg;
foreach(int i,_;A)
ret.args[i] = a[i];
return &ret.fn;
}
R fn() { return dg(args); }
}
// test it
import std.stdio;
int delegate() dg(int i)
{
return C!(int,int)(function int(int j){return j;}, i); // <--- used
here
}
void main()
{
auto d = dg(5);
writef("%s\n", d());
}
Interesting code. Thanks!
Nov 29 2008








tsalm <tsalm free.fr>