digitalmars.D.learn - How to declare an alias to a function literal type
- ParticlePeter (11/11) Jan 12 2016 I have a function type and variable and assign a function to it:
- Marc =?UTF-8?B?U2Now7x0eg==?= (12/23) Jan 12 2016 This works for me:
- ParticlePeter (11/41) Jan 12 2016 Not what I wanted, I wanted the parameter to be part of the alias:
- =?UTF-8?Q?Ali_=c3=87ehreli?= (15/22) Jan 12 2016 I've added otherFunc(MF) to Marc Schütz's program:
- ParticlePeter (23/26) Jan 12 2016 This was confusing, lets start fresh:
- =?UTF-8?Q?Ali_=c3=87ehreli?= (22/33) Jan 12 2016 mf );
- ParticlePeter (10/43) Jan 12 2016 O.K. so I conclude that writing:
- Marc =?UTF-8?B?U2Now7x0eg==?= (10/15) Jan 12 2016 If I understand you correctly (not sure), you would like to write
- ParticlePeter (2/14) Jan 12 2016 This is already quite useful, thanks.
- anonymous (4/7) Jan 12 2016 You don't. That's not valid code. You can be using this:
- Daniel Kozak via Digitalmars-d-learn (4/20) Jan 12 2016 V Tue, 12 Jan 2016 15:41:02 +0000
- ParticlePeter (5/26) Jan 12 2016 That does not work:
- anonymous (8/12) Jan 12 2016 This line doesn't work. Function literals don't take a type before the
- =?UTF-8?Q?Ali_=c3=87ehreli?= (17/19) Jan 12 2016 It is not used with a function literal but searching for 'alias' below
I have a function type and variable and assign a function to it: void function( int i ) myFunc; myFunc = void function( int i ) { myCode; } How would I declare an alias for void function( int i ) such that the case above would work like this: // alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not working MF myFunc; myFunc = MF { myCode }; Please, if possible, also show me where I should have found the answer (D Reference, Alis book, etc. )
Jan 12 2016
On Tuesday, 12 January 2016 at 15:41:02 UTC, ParticlePeter wrote:I have a function type and variable and assign a function to it: void function( int i ) myFunc; myFunc = void function( int i ) { myCode; } How would I declare an alias for void function( int i ) such that the case above would work like this: // alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not working MF myFunc; myFunc = MF { myCode }; Please, if possible, also show me where I should have found the answer (D Reference, Alis book, etc. )This works for me: alias MF = void function(int i); // works fine - what was your error? void main() { import std.stdio; MF myFunc; // you can also use the full `function(int i) { ... }` in the next line myFunc = (i) { writeln("i = ", i); }; myFunc(42); }
Jan 12 2016
On Tuesday, 12 January 2016 at 15:57:03 UTC, Marc Schütz wrote:On Tuesday, 12 January 2016 at 15:41:02 UTC, ParticlePeter wrote:Not what I wanted, I wanted the parameter to be part of the alias: myFunc = MF { ... } I want to pass such a function to another function: alias MF = void function(int i); void otherFunc( void function( int ) mf ); otherFunc( MF { ... } ); // Getting Error: found '{' when expecting ',' Actually, I do use only one param, and not int as well, hence I would like the parameter list to be part of the alias. Your example works though.I have a function type and variable and assign a function to it: void function( int i ) myFunc; myFunc = void function( int i ) { myCode; } How would I declare an alias for void function( int i ) such that the case above would work like this: // alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not working MF myFunc; myFunc = MF { myCode }; Please, if possible, also show me where I should have found the answer (D Reference, Alis book, etc. )This works for me: alias MF = void function(int i); // works fine - what was your error? void main() { import std.stdio; MF myFunc; // you can also use the full `function(int i) { ... }` in the next line myFunc = (i) { writeln("i = ", i); }; myFunc(42); }
Jan 12 2016
On 01/12/2016 08:22 AM, ParticlePeter wrote:On Tuesday, 12 January 2016 at 15:57:03 UTC, Marc Schütz wrote:Not what I wanted, I wanted the parameter to be part of the alias: myFunc = MF { ... } I want to pass such a function to another function: alias MF = void function(int i); void otherFunc( void function( int ) mf ); otherFunc( MF { ... } ); // Getting Error: found '{' when expectingI've added otherFunc(MF) to Marc Schütz's program: alias MF = void function(int i); void otherFunc(MF func) { func(42); } void main() { import std.stdio; MF myFunc; // you can also use the full `function(int i) { ... }` in the next line myFunc = (i) { writeln("i = ", i); }; myFunc(42); otherFunc((i) { writefln("otherFunc called me with %s", i); }); } Ali
Jan 12 2016
On Tuesday, 12 January 2016 at 16:22:48 UTC, ParticlePeter wrote:Actually, I do use only one param, and not int as well, hence I would like the parameter list to be part of the alias. Your example works though.This was confusing, lets start fresh: I have a function "otherFunc" which takes a function with lots of parameters as argument: void otherFunc( void function( ref int p1, float p2, ubyte p3, ... ) mf ); Side-note, I use the keyword function to signal that it is a function and not a delegate, thought it is a delegate when not specified. When I pass a parameter to otherFunc I use this syntax for an anonymous function parameter: otherFunc( void function( ref int p1, float p2, ubyte p3 ) { myCode; } ); I would like to alias the function signature above: alias MF = void function( ref int p1, float p2, ubyte p3 ); I can rewrite the definition of otherFunc like this: void otherFunc( MF mf ); But I cannot pass an anonymous function to otherFunc like this: otherFunc( MF { myCode; } ); Thats what I want. Any working example? Ali, I do not pass an existing named function as a pointer. I am also not sure about the lambdas, as I do not return anything, I just want to process data, would that work?
Jan 12 2016
On 01/12/2016 08:55 AM, ParticlePeter wrote:I have a function "otherFunc" which takes a function with lots of parameters as argument: void otherFunc( void function( ref int p1, float p2, ubyte p3, ... )mf ); Ok.otherFunc( void function( ref int p1, float p2, ubyte p3 ) { myCode; } );Ok.alias MF = void function( ref int p1, float p2, ubyte p3 );Ok.I can rewrite the definition of otherFunc like this: void otherFunc( MF mf );That has the same problem of trying to do this for int: void foo(int i) { } void main() { foo(int 42); // <-- ERROR } But you can do this: foo(int(42)); // (Relatively new syntax in D.)But I cannot pass an anonymous function to otherFunc like this: otherFunc( MF { myCode; } );It works with the parentheses as it does for int: alias MF = void function( ref int p1, float p2, ubyte p3 ); void otherFunc( MF mf ) { } void main() { otherFunc(MF((ref int, float, ubyte){ })); // <-- Parens }not sure about the lambdas, as I do not return anything, I just want to process data, would that work?Yes, some lambdas do not return anything. Ali
Jan 12 2016
On Tuesday, 12 January 2016 at 17:03:49 UTC, Ali Çehreli wrote:On 01/12/2016 08:55 AM, ParticlePeter wrote:O.K. so I conclude that writing: void main() { otherFunc(MF { }); } is not possible. At least not with alias, maybe with templates or mixins? In essence something like C #define as in: #define MF function( ref int p1, float p2, ubyte p3 ) Is there some such way?I have a function "otherFunc" which takes a function withlots ofparameters as argument: void otherFunc( void function( ref int p1, float p2, ubytep3, ... ) mf ); Ok.otherFunc( void function( ref int p1, float p2, ubyte p3 ) {myCode; } ); Ok.alias MF = void function( ref int p1, float p2, ubyte p3 );Ok.I can rewrite the definition of otherFunc like this: void otherFunc( MF mf );That has the same problem of trying to do this for int: void foo(int i) { } void main() { foo(int 42); // <-- ERROR } But you can do this: foo(int(42)); // (Relatively new syntax in D.)But I cannot pass an anonymous function to otherFunc likethis:otherFunc( MF { myCode; } );It works with the parentheses as it does for int: alias MF = void function( ref int p1, float p2, ubyte p3 ); void otherFunc( MF mf ) { } void main() { otherFunc(MF((ref int, float, ubyte){ })); // <-- Parens }
Jan 12 2016
On Tuesday, 12 January 2016 at 16:55:48 UTC, ParticlePeter wrote:I can rewrite the definition of otherFunc like this: void otherFunc( MF mf ); But I cannot pass an anonymous function to otherFunc like this: otherFunc( MF { myCode; } ); Thats what I want. Any working example?If I understand you correctly (not sure), you would like to write `MF` so that you don't need to specify the parameters in the lambda? That's not possible, because the code inside the lambda needs names for them if it wants to access them, but parameter names are _not_ part of the function type, and therefore the alias doesn't know about them. However, you don't need to specify the full parameter list in the lambda, the names and `ref` are enough: otherFunc( (ref a, ref b, ref c) { /* use a, b, c */ } );
Jan 12 2016
On Tuesday, 12 January 2016 at 17:28:35 UTC, Marc Schütz wrote:On Tuesday, 12 January 2016 at 16:55:48 UTC, ParticlePeter wrote:This is already quite useful, thanks.[...]If I understand you correctly (not sure), you would like to write `MF` so that you don't need to specify the parameters in the lambda? That's not possible, because the code inside the lambda needs names for them if it wants to access them, but parameter names are _not_ part of the function type, and therefore the alias doesn't know about them. However, you don't need to specify the full parameter list in the lambda, the names and `ref` are enough: otherFunc( (ref a, ref b, ref c) { /* use a, b, c */ } );
Jan 12 2016
On 12.01.2016 17:55, ParticlePeter wrote:When I pass a parameter to otherFunc I use this syntax for an anonymous function parameter: otherFunc( void function( ref int p1, float p2, ubyte p3 ) { myCode; } );You don't. That's not valid code. You can be using this: otherFunc( function void ( ref int p1, float p2, ubyte p3 ) { myCode; } ); Note the different position of the `function` keyword.
Jan 12 2016
V Tue, 12 Jan 2016 15:41:02 +0000 ParticlePeter via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> napsáno:I have a function type and variable and assign a function to it: void function( int i ) myFunc; myFunc = void function( int i ) { myCode; } How would I declare an alias for void function( int i ) such that the case above would work like this: // alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not working MF myFunc; myFunc = MF { myCode }; Please, if possible, also show me where I should have found the answer (D Reference, Alis book, etc. )alias void MF(int i);
Jan 12 2016
On Tuesday, 12 January 2016 at 16:00:37 UTC, Daniel Kozak wrote:V Tue, 12 Jan 2016 15:41:02 +0000 ParticlePeter via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> napsáno:That does not work: alias void MF(int i); MF mf; // Error: variable mf cannot be declared to be a functionI have a function type and variable and assign a function to it: void function( int i ) myFunc; myFunc = void function( int i ) { myCode; } How would I declare an alias for void function( int i ) such that the case above would work like this: // alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not working MF myFunc; myFunc = MF { myCode }; Please, if possible, also show me where I should have found the answer (D Reference, Alis book, etc. )alias void MF(int i);
Jan 12 2016
On 12.01.2016 16:41, ParticlePeter wrote:// alias MF = void function( int i ); // not working // alias void function( int i ) MF; // not workingThese are both fine. The first one is the preferred style.MF myFunc; myFunc = MF { myCode };This line doesn't work. Function literals don't take a type before the curly braces. They have their own syntax. See http://dlang.org/spec/expression.html (search for "Function Literals"). Since most of the stuff in function literals can be inferred from the context, something as simple as this works: myFunc = (i) { myCode };
Jan 12 2016
On 01/12/2016 07:41 AM, ParticlePeter wrote:Please, if possible, also show me where I should have found the answer (D Reference, Alis bookIt is not used with a function literal but searching for 'alias' below yields something close: :) http://ddili.org/ders/d.en/lambda.html <quote> Function pointer syntax is relatively harder to read; it is common to make code more readable by an alias: alias CalculationFunc = int function(char, double); That alias makes the code easier to read: CalculationFunc ptr = &myFunction; As with any type, auto can be used as well: auto ptr = &myFunction; </quote> As others have already said, &myFunction can be replaced with a lambda. Shamefully without compiling: auto ptr = (char, double) => 42; Ali
Jan 12 2016