digitalmars.D.learn - tuples and freeze dried function args
- torhu (22/22) Feb 23 2007 I have a function like this:
- Bill Baxter (13/57) Feb 23 2007 I think you may be able to get something like what you want using type
- torhu (15/28) Feb 28 2007 That doesn't work. I tried something like it.
- Bill Baxter (17/50) Feb 28 2007 Hmm. Yeh, if making an anonymous color type is all you want to do with
- Kevin Bealer (10/10) Feb 23 2007 You can. I do this in the futurism library, see here:
- Bill Baxter (20/33) Feb 23 2007 Actually they call it "partial function application"
I have a function like this: void f(int, int, int); I know that I can do this: template Tuple(T...) { alias T Tuple; } alias Tuple!(1, 2, 3) args; And this now works: f(args); But I want to go one step further, and store the args somehow. alias Tuple!(1, 2, 3) OneSetOfArgs; alias Tuple!(4, 5, 6) AnotherSetOfArgs; If I have struct S { */ ... */}; can I somehow store OneSetOfArgs in a field, so I can do this? S s; s.args = OneSetOfArgs; f(s.args); // s.args expands into three ints I take it the answer is 'no'? Solutions involving wrapping f, or using assembly is not really what I'm looking for.
Feb 23 2007
torhu wrote:I have a function like this: void f(int, int, int); I know that I can do this: template Tuple(T...) { alias T Tuple; } alias Tuple!(1, 2, 3) args; And this now works: f(args); But I want to go one step further, and store the args somehow. alias Tuple!(1, 2, 3) OneSetOfArgs; alias Tuple!(4, 5, 6) AnotherSetOfArgs; If I have struct S { */ ... */}; can I somehow store OneSetOfArgs in a field, so I can do this? S s; s.args = OneSetOfArgs; f(s.args); // s.args expands into three ints I take it the answer is 'no'? Solutions involving wrapping f, or using assembly is not really what I'm looking for.I think you may be able to get something like what you want using type tuples and tupleof. alias Tuple!(int,int,int) FArgs; struct S { FArgs OneSetOfArgs; FArgs OtherSetOfArgs; } S s; Foo(s.OneSetOfArgs.tupleof); Or something along those lines maybe? --bb
Feb 23 2007
Bill Baxter wrote:I think you may be able to get something like what you want using type tuples and tupleof. alias Tuple!(int,int,int) FArgs; struct S { FArgs OneSetOfArgs; FArgs OtherSetOfArgs; } S s; Foo(s.OneSetOfArgs.tupleof); Or something along those lines maybe?That doesn't work. I tried something like it. template Tuple(T...) { alias T Tuple; } struct BlockType { Tuple!(int, int, int) color; // line 34 } blocktypes.d(34): variable blocktypes.BlockType.color is not a per-instance initializable field I guess I'll just go with an array for the color. It was just intended to show off some D features. But if it's going to get complicated, there's no point to it. It would just be a silly way of doing something that's really very simple.
Feb 28 2007
torhu wrote:Bill Baxter wrote:Hmm. Yeh, if making an anonymous color type is all you want to do with it I'd definitely recommend just using int[3]. No reason to bring in the big guns unless they're really needed. I like the way Helix does it using anonymous unions: struct BlockType { union { int[3] color; struct { int r; int g; int b; } } } Then you can use b.color[2] or b.b whichever suits your needs. --bbI think you may be able to get something like what you want using type tuples and tupleof. alias Tuple!(int,int,int) FArgs; struct S { FArgs OneSetOfArgs; FArgs OtherSetOfArgs; } S s; Foo(s.OneSetOfArgs.tupleof); Or something along those lines maybe?That doesn't work. I tried something like it. template Tuple(T...) { alias T Tuple; } struct BlockType { Tuple!(int, int, int) color; // line 34 } blocktypes.d(34): variable blocktypes.BlockType.color is not a per-instance initializable field I guess I'll just go with an array for the color. It was just intended to show off some D features. But if it's going to get complicated, there's no point to it. It would just be a silly way of doing something that's really very simple.
Feb 28 2007
You can. I do this in the futurism library, see here: http://www.dsource.org/projects/futurism/browser/trunk/futurism/future.d The function make_future and the class template Future do this; the make_future builds a future object which stores a delegate and its arguments. Later, the program runs the function from these arguments. There's a lot of other code in that file... I think you can find a simpler example at the bottom of this page: http://www.digitalmars.com/d/tuple.html 'Functional' programming languages call this 'currying'. Kevin
Feb 23 2007
Kevin Bealer wrote:You can. I do this in the futurism library, see here: http://www.dsource.org/projects/futurism/browser/trunk/futurism/future.d The function make_future and the class template Future do this; the make_future builds a future object which stores a delegate and its arguments. Later, the program runs the function from these arguments. There's a lot of other code in that file... I think you can find a simpler example at the bottom of this page: http://www.digitalmars.com/d/tuple.html'Functional' programming languages call this 'currying'.Actually they call it "partial function application" Currying is something else often mistaken for partial evaluation. Currying is treating a function of N args that returns Ret func: (Arg1,Arg2,Arg3) -> Ret as a function that does partial evaluation "to the max" func: Arg1 -> (Arg2 -> (Arg3 -> Ret)) That's a function that takes an Arg1 and returns (a function that takes an Arg2 and returns (a function that takes an Arg3 and returns a Ret)) So the call func a b c is treated as (((func a) b ) c) with currying. In ML for instance, all functions are curried by default (but you can sort of override the behavior by declaring your function to take a tuple as a single argument). Python has a partial application library that was originally called 'curry' until the functional folks shot it down as a misnomer. Now it's called 'partial'. http://www.python.org/dev/peps/pep-0309/ --bb
Feb 23 2007