yank unary '+'?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue Dec 8 07:13:15 PST 2009
Michel Fortin wrote:
> On 2009-12-07 23:52:04 -0500, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> said:
>
>> Michel Fortin wrote:
>>> On 2009-12-07 01:29:14 -0500, Andrei Alexandrescu
>>> <SeeWebsiteForEmail at erdani.org> said:
>>>
>>>> Using double negation !!x throughout, there are only advantages and
>>>> no disadvantage. I hit that design with Pacquiao punches over the
>>>> past week or so, and couldn't find any shortcoming. It's consistent
>>>> across positive and negated uses, easy to understand, easy to
>>>> define, consistent with built-in types, and Walter likes it.
>>>
>>> I'm not sure that's a great idea. What if you define your own
>>> FuzzyBool type (containing some sort of probability) and
>>> FuzzyBool.opUnary!("!") returns an inverted FuzzyBool (with 1 -
>>> original probability) instead of a regular bool, you'd have an
>>> infinite loop trying to evaluate !!myBoolValue.
>>
>> Yeah, I thought about that liability and decided to discount it as a
>> design mistake of the user. If a type decides to return non-bool from
>> "!", they are bound to unpleasantly surprise its user in more ways
>> than one. You can define a negate for FuzzyBool - just don't dress it
>> as the "!" operator.
>
> To me, its using "!" to transform something to a bool that looks like a
> hack. Surely there's a more explicit and intuitive way to define it that
> doesn't tie it to a specific operator.
Actually this is quite what happens with built-in types. A common
misconception (I'm sure not yours) is that "if" works with Booleans. In
fact it works with Booleans, numbers, pointers, arrays, and class
references. In a very palpable way "if" is special-cased for each of these.
Then, the common misconception goes, all of those have a sort of
conversion to Boolean that "if" taps into. Not quite, because if you try
to assign a bool from an array or even an integer, it won't work.
What does work is operator "!". Operator "!" accept _all_ of Booleans,
numbers, pointers, arrays, and class references - i.e., exactly the set
of "if"-testable entities. And it uniformly yields bool. So it is an
excellent device for hooking user-defined types into "if". I'd say it is
not a hack at all, although it may look so at first sight. It really
holds water.
> opTest perhaps?
opTest was on the bench for a short while, but Walter threw his hands.
"How many operators are you going to define?" And he's right - I'd do
with fewer rather than more redundant operators. We (will) have a method
for defining unary operators. I don't see why make an exception of "!",
or, worse, allow both operator "!" and opTest.
> And if you think "!" should always return a bool, then it should just
> not be overridable and should be defined as returning the negation of
> opTest (or whatever the name). I don't feel restricting unary "!" to
> return a bool is sound when all other unary ops can be defined to return
> anything.
It's possible to require opTest and then say that "!a" is always
rewritten into !a.opTest. But then consider this fragment:
"For all unary operators except "!", the expression
<op> a
is rewritten as
a.opUnary!"<op>"()
However,
!a
is rewritten as
!a.opTest()"
Would you like to see something like that in TDPL?
Andrei
More information about the Digitalmars-d
mailing list