Lazy nonzero
Fawzi Mohamed
fmohamed at mac.com
Thu Mar 13 10:23:10 PDT 2008
Hi bearophile,
I gave a look at the problem and documentation, and I came up with the
following solution, just before you left http://codepad.org/COfTfX6A
---------
import std.stdio: writefln;
int f0a() { writefln("f0a"); return 0; }
int f0b() { writefln("f0b"); return 0; }
int f1() { writefln("f1"); return 1; }
T firstNonZero(T)(T x) {
return x;
}
T firstNonZero(T,U...)(T x, lazy U y) {
if (x)
return x;
return firstNonZero(y);
}
void main() {
writefln(firstNonZero(f0a(), f1(), f0b()));
}
---------
actually the () are optional also in your first example
ciao
Fawzi
On 2008-03-13 17:28:10 +0100, bearophile <bearophileHUGS at lycos.com> said:
> I am trying to write a small function that returns the first nonzero
> argument. For 2 arguments the following firstNonZero2() template
> function works enough.
>
> I have tried to extend it to more than one argument, creating
> firstNonZeroNa(), but it doesn't work. Do you know why?
>
> firstNonZeroNb() works, despite being quite different (this is the
> basic version, without type consistency controls). But can you tell me
> why it doesn't need () to de-lazy its arguments?
>
> In the D docs in the page about functions there are "Lazy Variadic
> Functions", can you tell me what they can be useful for?
>
> Thank you,
> bearophile
>
>
> import std.stdio: writefln;
>
> int f0a() { writefln("f0a"); return 0; }
> int f0b() { writefln("f0b"); return 0; }
> int f1() { writefln("f1"); return 1; }
>
> T firstNonZero2(T)(T x, lazy T y) {
> if (x)
> return x;
> return y();
> }
>
> T firstNonZeroNa(T)(lazy T[] items...) {
> foreach (x; items[0 .. $-1])
> if (x)
> return x;
> return items[$-1];
> }
>
> Types[0] firstNonZeroNb(Types...)(lazy Types items) {
> foreach (x; items[0 .. $-1])
> if (x)
> return x;
> return items[$-1];
> }
>
> void main() {
> writefln(firstNonZero2(f0a(), f1()), \n);
> // temp.d(30): template temp.firstNonZeroNa(T) does not match any
> template declaration
> // writefln(firstNonZeroNa(f0a(), f0b(), f1()), \n);
> writefln(firstNonZeroNb(f0a(), f0b(), f1()));
> }
More information about the Digitalmars-d-learn
mailing list