digitalmars.D - Simple proposal: syntax for named function arguments
- Norbert Nemec (64/64) Jun 23 2004 Hi there,
- Matthew (3/67) Jun 24 2004 I think it's nice idea, but post 1.0
- Norbert Nemec (16/17) Jun 24 2004 The reason why it might be considered for 1.0 already:
- Dan Williams (7/24) Jun 29 2004 I think this would be a great feature to include for version 1.0, if
Hi there, I know, the topic has been brought up before. Anyhow: I just realized that there is a really simply, straightforward solution: The idea is taken from Python, where function arguments can be given either in order of declaration (as in C/C++/D) or, qualified with names, in any order. This is especially useful for functions with many optional arguments. Imagine a function: -------------- void myfunc(int onearg, int anotherarg, int oneopt = 0, int anotheropt = 0, int yetanotheropt = 0, int reallyneatopt = 0) { ... } -------------- Ways to call this: -------------- myfunc(1,2); // no options myfunc(1,2,3,4); // two options myfunc(1,2,3,4,5,6); // all options myfunc(1,2,0,0,0,1); // this is annoying! -------------- consider the last case: you only want to set reallyneatopt, but you have to remember that is is the fourth option, and you have to know and supply all the other default values manually. My proposal would be to allow: -------------- myfunc(1,2,reallyneatopt: 0); myfunc(1, anotherarg: 2, reallyneatopt: 0); myfunc(1, reallyneatopt: 0, anotherarg: 2); myfunc(reallyneatopt: 0, anotherarg: 2, onearg: 1); -------------- ... all having the same result. ========================= In short: * function argument names in a call are prepended to the supplied value with a colon as separator, this gives a syntax very similar to struct initializers, and I cannot see any conflicts with existing syntax. * any function argument (optional or mandatory) can be given either in order or named. * all unnamed argument values have to be given before any named ones. * when calling overloaded functions, enough arguments have to be given in order to resolve any ambiguities To clarify the last point, consider: --------------- void myfunc(int val,char *str,bit opt = 0) { /* A */ } void myfunc(char *str,int val,bit opt = 0) { /* B */ } // perfectly legal myfunc(opt: 1,val: 3,str: "abc"); // ambiguous -> error myfunc(3,opt: 1,str: "abc"); // A is selected myfunc(str: "abc",opt: 1,val: 3); // B is selected --------------- (Practically, this rule should not be too important, but the possible ambiguity has to be resolved somehow.) ========================= The change should be straightforward. The compiler will have to consider argument names as part of the interface of a function, which might need a bit of coding in the compiler - effort depending on the details of the current implementation. The algorithm for resolving a call should then be trivial. Greetings, Nobbi
Jun 23 2004
I think it's nice idea, but post 1.0 "Norbert Nemec" <Norbert.Nemec gmx.de> wrote in message news:cbds4l$31b6$1 digitaldaemon.com...Hi there, I know, the topic has been brought up before. Anyhow: I just realized that there is a really simply, straightforward solution: The idea is taken from Python, where function arguments can be given either in order of declaration (as in C/C++/D) or, qualified with names, in any order. This is especially useful for functions with many optional arguments. Imagine a function: -------------- void myfunc(int onearg, int anotherarg, int oneopt = 0, int anotheropt = 0, int yetanotheropt = 0, int reallyneatopt = 0) { ... } -------------- Ways to call this: -------------- myfunc(1,2); // no options myfunc(1,2,3,4); // two options myfunc(1,2,3,4,5,6); // all options myfunc(1,2,0,0,0,1); // this is annoying! -------------- consider the last case: you only want to set reallyneatopt, but you have to remember that is is the fourth option, and you have to know and supply all the other default values manually. My proposal would be to allow: -------------- myfunc(1,2,reallyneatopt: 0); myfunc(1, anotherarg: 2, reallyneatopt: 0); myfunc(1, reallyneatopt: 0, anotherarg: 2); myfunc(reallyneatopt: 0, anotherarg: 2, onearg: 1); -------------- ... all having the same result. ========================= In short: * function argument names in a call are prepended to the supplied value with a colon as separator, this gives a syntax very similar to struct initializers, and I cannot see any conflicts with existing syntax. * any function argument (optional or mandatory) can be given either in order or named. * all unnamed argument values have to be given before any named ones. * when calling overloaded functions, enough arguments have to be given in order to resolve any ambiguities To clarify the last point, consider: --------------- void myfunc(int val,char *str,bit opt = 0) { /* A */ } void myfunc(char *str,int val,bit opt = 0) { /* B */ } // perfectly legal myfunc(opt: 1,val: 3,str: "abc"); // ambiguous -> error myfunc(3,opt: 1,str: "abc"); // A is selected myfunc(str: "abc",opt: 1,val: 3); // B is selected --------------- (Practically, this rule should not be too important, but the possible ambiguity has to be resolved somehow.) ========================= The change should be straightforward. The compiler will have to consider argument names as part of the interface of a function, which might need a bit of coding in the compiler - effort depending on the details of the current implementation. The algorithm for resolving a call should then be trivial. Greetings, Nobbi
Jun 24 2004
Matthew wrote:I think it's nice idea, but post 1.0The reason why it might be considered for 1.0 already: It has some influence on the design of library functions. There is a number of functions that need plenty of options to be flexible. Without this proposed feature, you would have to find some way to pass them in in some reasonable way. If you have named function arguments, the design gets much simpler. If the standard library is to converge as soon as the language reaches 1.0, then there might be reason to consider features that might affect the design. Furthermore: the feature is simple enough to just throw it in without much effort. Anyway: I won't press the issue. I just got carried away when I realized how nice and clean the solution actually might be. Ciao, Nobbi
Jun 24 2004
I think this would be a great feature to include for version 1.0, if possible, for all the reasons Norbert has outlined :) "Norbert Nemec" <Norbert.Nemec gmx.de> wrote in message news:cbe37h$b34$1 digitaldaemon.com...Matthew wrote:numberI think it's nice idea, but post 1.0The reason why it might be considered for 1.0 already: It has some influence on the design of library functions. There is aof functions that need plenty of options to be flexible. Without this proposed feature, you would have to find some way to pass them in in some reasonable way. If you have named function arguments, the design gets much simpler. If the standard library is to converge as soon as the language reaches1.0,then there might be reason to consider features that might affect the design. Furthermore: the feature is simple enough to just throw it in without much effort. Anyway: I won't press the issue. I just got carried away when I realizedhownice and clean the solution actually might be. Ciao, Nobbi
Jun 29 2004