delegate vs function
Hello, alias void function (int) F; alias void delegate (int) D; void fnFunc (F f, int i) {f(i);} void dgFunc (D d, int i) {d(i);} void writeOut (int i) {writeln(i);} void test () { void writeIn (int i) {writeln(i);} fnFunc(writeOut, 1); dgFunc(writeIn, 1); //~ fnFunc(writeIn, 1);// error (expected a func, got a delegate...) //~ dgFunc(writeOut, 1); // error (... and conversely) } If a function is defined at the module's toplevel and then passed (via a pointer) to a higher-order func that expects a function, al works fine. But if it is defined inside a function, then the pointer is automatically typed as delegate, even if the function does not use any variable in scope, and I get an error. Conversely, if the higher order func is defined to expect a delegate, then it fails if I pass a func defined at the top-level. How to solve this? Denis -- -- -- -- -- -- -- vit esse estrany ☣ spir.wikidot.com
Re: delegate vs function
On Tue, 23 Nov 2010 13:15:46 +0100, spir wrote: Hello, alias void function (int) F; alias void delegate (int) D; void fnFunc (F f, int i) {f(i);} void dgFunc (D d, int i) {d(i);} void writeOut (int i) {writeln(i);} void test () { void writeIn (int i) {writeln(i);} fnFunc(writeOut, 1); dgFunc(writeIn, 1); //~ fnFunc(writeIn, 1);// error (expected a func, got a delegate...) //~ dgFunc(writeOut, 1); // error (... and conversely) } If a function is defined at the module's toplevel and then passed (via a pointer) to a higher-order func that expects a function, al works fine. But if it is defined inside a function, then the pointer is automatically typed as delegate, even if the function does not use any variable in scope, and I get an error. Mark the function as 'static', like this: static void writeIn(int i) { ... } Then the compiler even ensures that it doesn't use any symbols from the enclosing scope. Conversely, if the higher order func is defined to expect a delegate, then it fails if I pass a func defined at the top-level. How to solve this? Use std.functional.toDelegate(), like this: dgFunc(toDelegate(writeOut), 1); (For some reason the documentation for toDelegate() seems to be missing from the D web site, but I don't know why. I'll look into it.) -Lars
Re: delegate vs function
On Tue, 23 Nov 2010 12:25:18 +, Lars T. Kyllingstad wrote: (For some reason the documentation for toDelegate() seems to be missing from the D web site, but I don't know why. I'll look into it.) Ah, found it: http://d.puremagic.com/issues/show_bug.cgi?id=2581 -Lars
Re: delegate vs function
On Tue, 23 Nov 2010 12:25:18 + (UTC) Lars T. Kyllingstad pub...@kyllingen.nospamnet wrote: On Tue, 23 Nov 2010 13:15:46 +0100, spir wrote: Hello, alias void function (int) F; alias void delegate (int) D; void fnFunc (F f, int i) {f(i);} void dgFunc (D d, int i) {d(i);} void writeOut (int i) {writeln(i);} void test () { void writeIn (int i) {writeln(i);} fnFunc(writeOut, 1); dgFunc(writeIn, 1); //~ fnFunc(writeIn, 1);// error (expected a func, got a delegate...) //~ dgFunc(writeOut, 1); // error (... and conversely) } If a function is defined at the module's toplevel and then passed (via a pointer) to a higher-order func that expects a function, al works fine. But if it is defined inside a function, then the pointer is automatically typed as delegate, even if the function does not use any variable in scope, and I get an error. Mark the function as 'static', like this: static void writeIn(int i) { ... } Then the compiler even ensures that it doesn't use any symbols from the enclosing scope. Great! that is what I have missed. Conversely, if the higher order func is defined to expect a delegate, then it fails if I pass a func defined at the top-level. How to solve this? Use std.functional.toDelegate(), like this: dgFunc(toDelegate(writeOut), 1); All right; if I understand, toDelegate cast a pointer to func to a delegate (the pair of pointers)? (Avoiding the error.) I would enjoy this cast to be automatic. So that, if we know original funcs may be of either kind, we can quietly declare the parameter type as delegate. (For some reason the documentation for toDelegate() seems to be missing from the D web site, but I don't know why. I'll look into it.) -Lars -- -- -- -- -- -- -- vit esse estrany ☣ spir.wikidot.com