Robert Fraser: > As well as the incompatibility with intuition. If anything, I'd think > the Elvis operator is more of an "or" since "x ?: y" means "x !is null ? > x : y". Doesn't && evaluate both arguments unless the first is false (or > in this case, null)?
Yes, it's a relative of "or". In Python the Elvis operator is the "or" itself: >>> a, b, c = 10, 0, 5 >>> a or b 10 >>> b or a 10 >>> a and b 0 >>> b and a 0 >>> a and c 5 >>> c and a 10 In my dlibs there's a lazyOr() that takes any number of arguments and returns the first one that's true (where true is defined by a standard function boolean() that returns false for 0, null, objects/structs that have a length and where such length is zero). A reduced (and untested) version that works with two arguments only, that is (I think) the Elvis operator: Tx lazyOr(Tx, Ty)(Tx x, lazy Ty y) { static assert(CastableTypes!(Tuple!(Tx, Ty)), "lazyOr: all items must be castable to the same type."); if (boolean(x)) return x; return y(); } A difference is that the Elvis operator is more efficient because it doesn't need to create a lazy delegate as in the D code (I don't know if LDC is able to optmize away such y delegate). Bye, bearophile