Embedded Containers

A Guy With a Question aguywithanquestion at gmail.com
Tue Dec 5 22:09:12 UTC 2017


On Tuesday, 5 December 2017 at 20:38:01 UTC, Timon Gehr wrote:
> On 05.12.2017 20:11, H. S. Teoh wrote:
>> On Tue, Dec 05, 2017 at 07:09:50PM +0000, Adam D. Ruppe via 
>> Digitalmars-d wrote:
>>> On Tuesday, 5 December 2017 at 19:01:48 UTC, A Guy With a 
>>> Question wrote:
>>>> alias Items(T) = Array!Item(T);
>>>
>>> try:
>>>
>>> Array!(Item!(T))
>>>
>>>> I'm not quite sure I understand how to create a generic 
>>>> container
>>>> interface or class in D.
>>>
>>> Just using the parenthesis should help. The thing with A!B!C 
>>> is that
>>> the reader can easily be confused: did you mean A!(B!C) or 
>>> (A!B)!C or
>>> what? Now the compiler is a bit stupider about this than it 
>>> should be
>>> IMO - it should be able to figure it out and the meaning be 
>>> fairly
>>> clear with association - but it isn't, so you can and must 
>>> write
>>> parens to clarify most the time.
>> 
>> Here's an idea for a DIP: make '!' right-to-left associative 
>> (i.e.,
>> similar to the ^^ exponentiation operator), so that A!B!C is 
>> understood
>> as A!(B!C).
>> 
>> Rationale: the most common use cases are of the A!(B!C) 
>> variety; it's
>> pretty rare IME to need the (A!B)!C form, since usually a 
>> template
>> expands to a type, which can then be passed to another 
>> template, i.e.,
>> A!(B!C).  The (A!B)!C form is when the template instantiated 
>> with B
>> produces another template that takes another type argument.  
>> There
>> aren't many use cases for this that I can think of.
>> ...
>
> Curried templates are actually common enough in Phobos. (map, 
> filter, etc.)
>
>> Though the point is probably moot, because in the current 
>> grammar you'd
>> need parentheses as soon as the template argument is anything 
>> more than
>> a single token, i.e., you can write A!int but you have to write
>> A!(const(int)).  And in the cases where you actually want 
>> something of
>> the form A!(B!C), usually the arguments are themselves pretty
>> complicated, so wouldn't benefit from top-level associativity 
>> anyway.
>> 
>> 
>> T
>> 
>
> IMHO the inconsistency with function call syntax ought to kill 
> this proposal. Also, it is a bit more confusing than it is 
> useful.
>
> Related: It's quite annoying that (A!B)!C does not work because 
> the parser thinks it's a C-style cast and errors out even 
> though C-style casts are not even valid D syntax.

Is there actually a difference between the c style cast and 
cast(type)? Other than verbosity...


More information about the Digitalmars-d mailing list