> On 20/12/2011 14:18, clk wrote: >> Here's another one. Is there a way to pass arguments to functions by >> keyword as in the >> calls to f and g below?
I remember a discussion about year ago or so. It seems doable to have some kind of function transformer (adaptor?) for this. from: int foo(int a = 0, int b = 1, double c = 0.0, bool d = false) { return 1;} alias namedParams!foo nfoo; // transform it into a called-by-name function. nfoo(["d": true]); // a = 0, b = 1, c = 0.0, d = true nfoo(["d" : true], ["b" : 100]); // a=0, b=100, c=0.0, d=true nfoo(1, 2, ["d" : true]); // a=1, b=2, c=0.0, d=true That is, it expects some values, then string/values couples as associative arrays. Would that be palatable? Because I think it's doable. To obtain the arguments names: int foo(int a, int b, double c = 0.0, bool d = true) { return 1;} template Name(alias foo) if (isCallable!foo) { enum string Name = S!(foo.stringof); } template S(string s) // this template is just a trick because foo.stringof directly displeases DMD { enum string S = s; } writeln(Name!foo); // "int(int a, int b, double c = 0, bool d = true)" So this gives us: - the arguments names - which ones have default values - what is that default value The difficulty here is correctly parsing the ( ,,,) part, without getting desoriented by argument types that themselves use (,), like templated types. I think that would make for an small & interesting community challenge. Philippe