Steven Schveighoffer wrote:
On Fri, 31 Jul 2009 22:37:06 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

Steven Schveighoffer wrote:
On Fri, 31 Jul 2009 16:53:12 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

Steven Schveighoffer wrote:
But in the case of properties only allowed without parens, functions require parens, you are defining a rule for the compiler. Think of the parentheses as an extension of the function name, like punctuation.

But you say no parens means query, parens means action. This is sheer unchecked convention.
But we already have sheer unchecked convention! I could make a function called sort that reverses an array.

Of course we do. My point is that there's no need to add gratuitous mechanisms fostering conventions that go unchecked.

We already had those conventions. D took them away by allowing any function to be treated as a property.

In C and C++ there was no convention: a.b was a field name and a.b() was
a function call. It was a language reality. C# added properties that
allow establishing a convention.

You could argue the same points for the current D property system -- specifying x = y translating to x = y() doesn't add any extra checking or benefit at all except for you like the way it looks better.

That's why we need to restrict it.

I still am amazed that you see no benefit to punctuation differences in names.

I do see benefit, but I also see cost.

I don't get why it makes any difference to you that the meaning of parentheses and no parentheses is used by the author of the function. How is this bad or somehow worse than what we have now? If you don't trust the author's functions do what they are named for, don't use his functions and properties.

Well you can trivialize all you want but the matters are different. It's one thing to have good names, good designs, trusted code etc. and a whole different thing to define a feature of which entire existence only serves only an unchecked convention.

It serves a purpose -- one that is not functionally checkable or definable, but is interface to a human being.

The problem is that it's all loss, no gain: the callee must make the
decision whether the call must be with or without parens, and the caller
must obey that decision. There is no guarantee gained, only effort.

Look, if D decided to make function calls case insensitive because "some people like to call with their own case", nobody would go for it. But let's say it did happen, and people requested that we make things case sensitive again. The argument that it doesn't serve any checked convention is ludicrous! I don't want a checked convention, I just want to name my classes with capital letters for my conventions dammit! The ability to name things how we want and expect them to be called by the name we give them is fundamental in human interface definition! Not being able to specify the calling convention makes you A) come up with ugly verbose names like isEmpty, getProperty, C_classname, or B) deal with the ensuing bug reports "how come you named it empty instead of isEmpty because if you call it like empty(), it looks like you are emptying something".

I was careful to specify that things like naming conventions are useful
when/because they are simple. There are naming conventions that don't
scale and are mentioned mostly derisively, such as the Hungarian
notation. Apparently I wasn't careful enough, I should have stressed
that point. Again: beyond the simplest ones, unchecked conventions in
programming languages are a dicey proposition. I believe a good language
should not define features that serve solely for cute but useless
conventions.

How about I just start calling you Andray because it's the same to me as Andrei.


Since C was invented, we have had the convention that () means function, lack of () means property. You are acting like the last 37 years of programming languages never existed, and this is some "new radical" convention. D is of C lineage, so using long standing C conventions should not confuse people.

Well C never had properties that executed code, so following the lineage is a moot point. C also didn't have a variety of other things, such as member functions. But we do have now. All I want is to not add undue burden. To me, it would be a mistake if D defined a special syntax for defining properties as if they were some big deal, to then not check in any way that they behave any different than regular functions.

The check is in the implication the human sees. x.empty() => empty x; x.empty => is x empty.

I bet money someone somewhere will want to define an API where x.sort()
sorts something in-place and x.sort returns a sorted copy; or where
x.empty() clears something and x.empty tells whether it's empty. Kind of
interesting I guess :o).

No functional check is necessary just like no check is necessary to ensure that empty doesn't print "asshole" to the screen. The implication is in the meaning of the word coupled with punctuation long perceived *by the user* as defining an action. C had properties, but they were limited to only returning a value and setting a value.

So that distinction got lost once C# introduced properties as a distinct
language feature. What was gained?

Why do you think Java defines properties as getX and setX instead of just x? Because they don't have a way to get rid of the parentheses. So they want to make it clear because parantheses imply action that the action is getting or setting x, not x'ing.

"Convention are good if they're simple."

Maybe less confusion, definitely more burden.
The burden is on the author to come up with meaningful function names already. With real properties, at least that task is easier because you don't need to add extra context to ensure a word is treated as a verb or a noun (e.g. 'isEmpty' in order to make sure someone doesn't mistake 'empty' for an action). The compiler enforces the requirement of property syntax vs. function syntax, so no burden there.

No, you add burden by posing the question, do I want people to call with parens or without? There's always going to be a gray area and there's always going to be surprising APIs (see e.g. Daniel Keep's point about range APIs that must actually do stuff in r.empty). With a uniform convention, all of these issues vanish.

I grant you that people will certainly stray from the norm, gray areas are unavoidable. Sometimes you have to bend the rules a little bit to achieve what you want, this is no exception. But for 99.99% of the time, the convention can be used. That one or two times you have to implement something weird that doesn't follow the convention doesn't make the whole convention invalid! You note the exception and move on. For example, look at Rebindable!(T) where you clearly violate the rules of const, does that make all of const invalid? Oops, I can't implement Rebindable without breaking the rules, this const shit can't be guaranteed, so I reject the idea of const altogether.

Daniel's point about range APIs doing stuff in r.empty has nothing to do with it, since the meaning is "is this range empty." Some would like that to mean "you're just giving me a simple value so you shouldn't have to mutate the object," but to me it *reads* "is this thing empty, do whatever it takes to answer that question, including mutating the object if you have to." Guess what, you still have to deal with that problem, even without property syntax.

To clarify: if there was any extra checking by the compiler, any guarantee that the feature would provide at all, I'd be glad to pay the price of thinking more when putting together a design. But you want to define a language feature that allows people to require "()" or not as they please, and that's all. It's a frivolous detail to be spending time on when designing an API. I simply don't believe that's good language design.

Yeah, those moronic language designers who make C#, Java, Python, etc. don't know what they're talking about.

I give up. I don't see any way to break through to you. Hopefully someday someone whose opinion you *do* value criticizes D for having ambiguous calling conventions, and then you are forced to change it.

I don't think you can reasonably conclude there's anything personal in
this. What you need in order to be convincing are better arguments, not more clout.


Andrei

Reply via email to