Delegates

Robin Allen r.a3 at ntlworld.com
Fri Jan 19 03:03:23 PST 2007


I'm trying to figure out delegates. From what I can see, they're intended to be what other languages call closures?

So, say I wanted to write some functions for signal processing. I'd define a Wave type as a function of time, like this:

alias float delegate(float) Wave;

and a function to return a sine wave of a specified frequency like this:

Wave sine(float freq)
{
  return delegate(float t) { return std.math.sin(2*std.math.PI*t); };
}

When I realised this didn't work at all, I cut back the code to something very basic and realised that even this doesn't work:

Wave constant(float value)
{
  return delegate(float t) { return value; }
}

Wave w0 = constant(6);
float x = w0(42); // x is now 42, not 6

But it does work if I change the function to:

Wave constant(float value)
{
  float _value = value;
  return delegate(float t) { return _value;}
}

I hesitate to cry "bug" because there's quite a large possibility that I don't understand delegates at all, but it seems a little weird.

Another oddity I found, and which I hope someone could explain, is:

Wave ramp(float start, float end, float length)
{
	float _start = start;
	float _end = end;
	float _length = length;
	
	return delegate(float t)
	{
		writefln("%f %f",t,_length);
		float fact = math.remainder(t, _length);
		return _start + (_end-_start)*fact;
	};
}

The above function's behaviour changes if I just commment out the writefln line. That can't be right!


More information about the Digitalmars-d-learn mailing list