A library approach to the ternary operator

David Abrahams dave at boost-consulting.com
Sun Mar 23 14:33:08 CET 2003

Alex Martelli <aleax at aleax.it> writes:

> David Abrahams wrote:
>    ...
>>> somewhat important to pick a better name for the function...!).
>>> Another likely name might be "pick".
>>         y = choose(x < 0 and [22.5] or [f(x)])
>>         y = ternary(x < 0 and [22.5] or [f(x)])
>>         y = pick(x < 0 and [22.5] or [f(x)])
>>         y = cond(x < 0 and [22.5] or [f(x)])
>>         y = if_(x < 0 and [22.5] or [f(x)])
>> I guess I like the last two, and the last one best of all, because
>> in my mind there's a nice association between the function name and
>> the adjacent condition.
> My preferences differ -- using an ordinary, well-pronounceable
> English word such as 'choose' or 'pick' seems to make for clearer
> and more readable code than arbitrary abbreviations such as
> 'cond' for 'conditional' (no doubt familiar to LISPers, but, since
> the function's workings are SO different from Lisp's COND, I do
> not think the familiarity is necessarily an advantage) or things
> such as 'if_', hard to pronounce distinctly from keyword 'if'.

At one time I might've agreed with you, but I guess my viewpoint has
been changed by lots of experience with metaprogramming and the Boost
MPL (see http://www.mywikinet.com/mpl/ for some examples of how if_
works out).  In that domain there are so many names that are direct
analogies for keywords that code is way more-readable if we don't
shrink from them. So we have if_, while_, bool_, int_, for_, ...

I also note that while this thing is in fact a function, it will have
"keywordish" mental status from the standpoint of anyone reading the
code because of the distinctive pattern of its usage.

I appreciate your argument about COND, though, which is one reason I
didn't love it either.

I'm really looking for a name which the adjacent condition will tend
to associate with more closely than with the 'and' keyword.  Maybe
choose_if works, but it's uncomfortably long IMO.


         y = when(x < 0 and [22.5] or [f(x)])

Except for the temporal overtones I like that one.  I guess there's

         y = where(x < 0 and [22.5] or [f(x)])

but I think I prefer "when".

Dave Abrahams
Boost Consulting

More information about the Python-list mailing list