Weird template error
Nick Sabalausky
a at a.a
Tue Nov 25 19:59:04 PST 2008
"Michel Fortin" <michel.fortin at michelf.com> wrote in message
news:gg6c9q$1p2r$1 at digitalmars.com...
> On 2008-11-19 12:49:14 -0500, "Denis Koroskin" <2korden at gmail.com> said:
>
>> It's simply broken! You say that empty pair of parens is equivalent to
>> none of them and thus it is allowed to omit them, but it's not true at
>> all. There are lots of examples where "auto foo = bar();" != "auto foo =
>> bar;" and "auto foo = obj.bar();" != "auto foo = obj.bar;" (delegates,
>> class/struct instances with overloaded opCall, etc).
>
> As much as I like the no-parens function call syntax, I have to agree with
> you: it bring inconsistencies.
>
>> - such a duality is confusing (when may you omit the parens and when you
>> may not?)
>
> Where it becomes confusing is where you try to call the return value of a
> function, or a no-argument function template. While the most common case
> (simple function call) may be working right, the no-parens function call
> syntax creates many not-so-rare corner case we have to deal with. Those
> cases make it confusing.
>
>> - it makes the language more complex (rules are so complex that hardly
>> anyone fully understands them)
>
> I don't think each rule for each callable type is in itself that complex,
> but mixing them leads to complexity.
>
>> - it leads to code inconsistency (half of the programmers remove an
>> "extra" pair of parens and other half preserve them)
>
> Indeed. I don't think it's bad in itself to have two ways to write
> something. After all, you can call directly someStruct.opAdd if you prefer
> that to writing "+".
>
> The problem is that in some cases (function pointers, delegates, opCall)
> it changes the meaning while in other (plain function) it means the same
> thing. That's inconsistent, it prevents interchangability between those
> types, and it becomes confusing when using them together.
>
That's why I like the consistency other languages have of:
- With parens: Invoke function
- Without parens: Refer to function itself
Example of preferred syntax:
class Beeper
{
void beep() {...}
}
void main()
{
auto beeper = new Beeper();
// Beep
beeper.beep();
// Make a beeping delegate
auto dgBeep = beeper.beep;
// Beep twice later
doLater(dgBeep);
doLater(beeper.beep);
//Error: doLater expects "void delegate(void)", not "void"
doLater(beeper.beep());
}
>> - it is a source of many compiler bugs (this and lots of related ones)
>
> I'm not sure having bugs in the compiler is a valid argument against the
> syntax. Creating a whole new property syntax is bound to have bugs too.
>
>> - it contributes to user code bugs that are hard to find at times ("oops,
>> I missed a pair of parens. God, I thougth that they were optional").
>
> Indeed.
>
> So as I said above, I agree that no-parens function calls make the
> language inconsistant. I still like it because I find it aesthetically
> pleasing and because it simplifies the concept of properties by making
> them simple function calls, but at the same time I'm quite annoyed by the
> inconsistencies.
>
> --
> Michel Fortin
> michel.fortin at michelf.com
> http://michelf.com/
>
More information about the Digitalmars-d
mailing list