digitalmars.D.learn - parameterized lazy expression
- freeagle (14/14) Oct 02 2007 Hello,
- BCS (8/29) Oct 02 2007 the best you can do would be use the short form of delegates
- freeagle (7/46) Oct 02 2007 hmm, well, if thats the shortest possible form...
- BCS (13/21) Oct 02 2007 there is one other option
- Daniel Keep (8/16) Oct 02 2007 You could always use something like this:
- freeagle (2/25) Oct 03 2007 thanks Daniel
Hello, is it possible somehow, to pass as a lazy argument expression with argument/s? something like foo((int x) x == 0); where x will be passed as parameter to the exp inside the foo function: void foo(lazy bool dg) { if(dg(10)) {...} } i'd like not to have to use foo(bool delegate(int x) {return x == 0}) if possible I hope i made myself clear, thanks for advices in advance :) freeagle
Oct 02 2007
Reply to freeagle,Hello, is it possible somehow, to pass as a lazy argument expression with argument/s? something like foo((int x) x == 0); where x will be passed as parameter to the exp inside the foo function: void foo(lazy bool dg) { if(dg(10)) {...} } i'd like not to have to use foo(bool delegate(int x) {return x == 0}) if possible I hope i made myself clear, thanks for advices in advance :) freeaglethe best you can do would be use the short form of delegates foo((int x) {return x == 0;}) it's 3 char's longer than what you asked for but. OTOH could the syntax be changed so that a delegate uses a statement rather than a block? foo(bool delegate(int) a, int b); foo((int x) return x == 0;, 5)
Oct 02 2007
BCS wrote:Reply to freeagle,hmm, well, if thats the shortest possible form... i wanted to make a template representing mathematical sets, that would be defined something like MSet!(int)(x > 0 && x < 10, x*2) but with the returns and all, it looks weird: MSet!(int)((int x) {return x > 0 && x < 10; }, (int x) { return x * 2; }) freeagleHello, is it possible somehow, to pass as a lazy argument expression with argument/s? something like foo((int x) x == 0); where x will be passed as parameter to the exp inside the foo function: void foo(lazy bool dg) { if(dg(10)) {...} } i'd like not to have to use foo(bool delegate(int x) {return x == 0}) if possible I hope i made myself clear, thanks for advices in advance :) freeaglethe best you can do would be use the short form of delegates foo((int x) {return x == 0;}) it's 3 char's longer than what you asked for but. OTOH could the syntax be changed so that a delegate uses a statement rather than a block? foo(bool delegate(int) a, int b); foo((int x) return x == 0;, 5)
Oct 02 2007
Reply to freeagle,i wanted to make a template representing mathematical sets, that would be defined something like MSet!(int)(x > 0 && x < 10, x*2) but with the returns and all, it looks weird: MSet!(int)((int x) {return x > 0 && x < 10; }, (int x) { return x * 2; }) freeaglethere is one other option void foo(inout int i, lazy bool b) { int j = 0; do i = j++; while(dg()); } use like this int k; foo(k, k <= 5); I would consider that an "ugly hack".
Oct 02 2007
freeagle wrote:hmm, well, if thats the shortest possible form... i wanted to make a template representing mathematical sets, that would be defined something like MSet!(int)(x > 0 && x < 10, x*2) but with the returns and all, it looks weird: MSet!(int)((int x) {return x > 0 && x < 10; }, (int x) { return x * 2; }) freeagleYou could always use something like this: MSet!(int, "$ > 0 && $ < 10", "$ * 2"); Then use CTFE to replace the '$' with whatever symbol it uses internally, and then string mixin the result. Not *quite* as clean as you wanted, but at least there aren't any nasty delegate literals! -- Daniel
Oct 02 2007
Daniel Keep Wrote:freeagle wrote:thanks Danielhmm, well, if thats the shortest possible form... i wanted to make a template representing mathematical sets, that would be defined something like MSet!(int)(x > 0 && x < 10, x*2) but with the returns and all, it looks weird: MSet!(int)((int x) {return x > 0 && x < 10; }, (int x) { return x * 2; }) freeagleYou could always use something like this: MSet!(int, "$ > 0 && $ < 10", "$ * 2"); Then use CTFE to replace the '$' with whatever symbol it uses internally, and then string mixin the result. Not *quite* as clean as you wanted, but at least there aren't any nasty delegate literals! -- Daniel
Oct 03 2007