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 :)
freeagle
the 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;
})
freeagle
there 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; })
freeagle
You 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









BCS <ao pathlink.com> 