shouting versus dotting
Sean Kelly
sean at invisibleduck.org
Sat Oct 4 23:31:40 PDT 2008
Andrei Alexandrescu wrote:
> Alexander Pánek wrote:
>> Andrei Alexandrescu wrote:
>>> The problem I see with "!" as a template instantiation is not
>>> technical. I write a fair amount of templated code and over years the
>>> "!" did not grow on me at all. I was time and again consoled by
>>> Walter than one day that will happen, but it never did. I also
>>> realized that Walter didn't see a problem with it because he writes
>>> only little template code.
>>>
>>> I didn't have much beef with other oddities unique to D. For example,
>>> I found no problem accommodating binary "~" and I was wondering what
>>> makes "!" different. I was just looking at a page full of templates
>>> and it looked like crap.
>>>
>>> One morning I woke up with the sudden realization of what the problem
>>> was: the shouting.
>>>
>>> In C, "!" is used as a unary operator. That may seem odd at first,
>>> but it nevers follows a word so it's tenuous to associate it with the
>>> natural language "!". In D, binary "!" _always_ follows a word, a
>>> name, something coming from natural language. So the conotation with
>>> exclamation jumps at you.
>>>
>>> That's why I find the choice of "!" poor. I believe it can impede to
>>> some extent acquisition of templates by newcomers, and conversely I
>>> believe that using .() can make templates more palatable. I tried
>>> using ".()" in my code and in only a couple of days it looked and
>>> felt way better to me. Based on that experience, I suggest that "!()"
>>> is dropped in favor of ".()" for template instantiation for D2.
>>>
>>> Sean's argument that "The exclamation mark signifies an assertion of
>>> sorts" is exactly where I'd want templates not to be: they should be
>>> blended in, not a hiccup from normal code. Serious effort has been,
>>> and still is, made in D to avoid shell-shocking people about use of
>>> templates, and I think ".()" would be a good step in that direction.
>>
>> Sean has a point. Templates are not runtime constructs. So a clear
>> distinction between instantiating a function with a given type and
>> just calling a function that has fixed argument types and a fixed
>> return type is necessary.
>
> Why? This sounds objective, so you better back it up.
I like being able to distinguish between the function signature and the
parameter list and to tell at a glance what's actually happening. Since
the dot already has a function in this context, I don't think it should
be given another. Also, if we get the option to override opDot, things
could get really weird if it's also a template signifier.
>> The exclamation mark gives us this clear distinction and has served
>> well in terms of readability for me, especially because it jumps out —
>> not because it’s an exclamation mark, thus having a meaning in natural
>> language, but rather just because of its form. A straight vertical
>> line with a dot underneath it. That just works perfectly well as
>> seperator between identifier/type and type argument.
>
> I believe the clear distinction is not only unnecessary, but
> undesirable. We should actively fight against it.
Why is it undesirable? I like the idea of static parameters as
described at the conference last year, but I don't think that has any
bearing on this particular issue.
Sean
More information about the Digitalmars-d
mailing list