Re: Internal delegate and Stack Overflow

2008-11-29 Thread tsalm

Le Sat, 29 Nov 2008 01:49:20 +0100, BCS <[EMAIL PROTECTED]> 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!


Re: Internal delegate and Stack Overflow

2008-11-28 Thread BCS

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 ;-)
Thanks



you 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());
}




Re: Internal delegate and Stack Overflow

2008-11-28 Thread tsalm

Le Sat, 29 Nov 2008 01:08:28 +0100, BCS <[EMAIL PROTECTED]> a écrit:


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.


Yes, it's on D1.036.




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


Re: Internal delegate and Stack Overflow

2008-11-28 Thread BCS

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.




Internal delegate and Stack Overflow

2008-11-28 Thread 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