new DIP5: Properties 2
Steven Schveighoffer
schveiguy at yahoo.com
Fri Jul 31 13:40:49 PDT 2009
On Fri, 31 Jul 2009 16:16:43 -0400, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> Steven Schveighoffer wrote:
>> So to sum up, with this feature lack of parentheses would imply no
>> action, but would not be enforced. However, it would be considered
>> incorrect logic if the rule was not followed, similar to naming your
>> functions something other than what they do.
>
> I am leery of such a feature. It essentially introduces a way to define
> conventions that are in no way useful to, or checked by, language rules.
> In my experience this has been a bad idea more often than not. Of
> course, simple conventions such as capitalized types, camel case values,
> and so on, are useful and easy to follow. But as soon as complexity of
> conventions becomes only a bit higher, their usefulness becomes a
> downward step function.
>
> In C++ there were two ways to define a template:
>
> template <class T> ...
>
> and
>
> template <typename T> ...
>
> The existence of "typename" as a keyword has an interesting history of
> its own, but in here it was allowed for the reason that T may be any
> type, not a class type. So, people thought, it would be less confusing
> if people wrote "typename" for type template parameters.
>
> So far so good. When I wrote Modern C++ Design, I decided to make a bold
> move and use "typename" in code samples wherever it could have been any
> type, and "class" wherever the type was indeed restricted to a class
> type. I documented that convention in the introduction and off I went.
>
> The experiment was an unqualified failure. First of all, people got
> confused. Then some found actual "bugs" because I used one keyword when
> I had promised to use the other. Of course I had bugs - there's plenty
> of template code and no automated means to check it! If I could turn
> back in time, I'd just use "class" everywhere.
>
> There are similar cases in other communities, probably Perl being a
> prime example because it allows most everything to mean something, so
> conventions are very important. My reading of the experience on
> espousing complex, unchecked, and unused reified conventions? Don't.
Hm... in C++, I don't think that convention is checked at all. For
example, I can do template<class T> and specify int as the T, and
everything compiles.
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.
Like the word "so":
so!
so?
Two different meanings, same word. Analogously to our property
discussion, the compiler can know that one is an exclamation, and one is a
question, but doesn't really know the meaning of "so!" or "so?". It can
enforce that you use a question where a question is needed, and an
exclamation where an exclamation is needed.
But a person sees it immediately and understands the difference in the
implied meaning. The parens-means-function and lack-of-parens-means-field
convention is well well established (except for D) as something that
works, I don't think you would have the same confusion as your
typename/class example.
-Steve
More information about the Digitalmars-d
mailing list