DIP 1023--Resolution of Template Alias Formal Parameters in Template Functions--Community Review Round 1

Stefanos Baziotis sdi1600105 at di.uoa.gr
Wed Sep 11 12:11:21 UTC 2019


On Wednesday, 11 September 2019 at 09:58:58 UTC, jmh530 wrote:
>
> I'm not a compiler expert or anything, so I didn't go through 
> every little piece of the DIP initially in order to try to grok 
> how it worked. I don't have a good sense of how the compiler 
> currently resolves templates, so trying to understand how it 
> worked in this specific case seemed like a big hill to climb.
>

For me, this DIP is the most complicated DIP I have seen - _just_ 
to handle
alias declarations / instatiations in function arguments.
And it already takes a lot of things for granted (i.e. the `Gen`
function in the DIP is not specified). I would not have been
able to complete it without some help from one of my professors.

What I mean is that this is not necessarily the easiest thing
to understand and even if it was, I'm not an expert in writing
formal specifications.

Regarding the implementation, well.. this a particularly draft
implementation. :P It is after 3 days of first opening DMD.

> The reason why I was talking about the explicit template syntax 
> is because it provides a lot of flexibility.
>
> When talking about Atila's concepts library above, the thing 
> that is in the back of my mind is something like isInputRange 
> (he provides an example in the Readme.md). One issue with 
> passing an input range to a lot of phobos functions is that if 
> you pass something that isn't an input range the error message 
> isn't specific about why it isn't an input range. For instance, 
> did you forget to define popFront? The concepts library helps 
> provide better error messages in this case. However, it 
> currently requires you to use @models at the top of the struct 
> in order to check this information. This requires the user to 
> put models UDA before their own struct, rather than this 
> happening at the point of the function. If we were able to do 
> something like below, then the user does not need to put it on 
> their own structs. I think that would make the concepts library 
> much more powerful.
>
> template InputRange(T) {
>     import concepts: models, isInputRange;
>     static assert(models!(Foo, isInputRange));
>     alias InputRange = T;
> }
>
> void useInputRange(T)(InputRange!T foo) {
>
> }

I understand the reasoning, yes. I also think it would be very 
beneficial.
The problem is that throwing templates in general into the mix I 
think
will make the DIP way complicated. Also, I don't think I will be 
able
to derive a formal specification.

Btw, IMHO, templates are in general under-specified. Both in D 
and C++.
I might have missed something but to the best of my knowledge, 
they're
constrained to intuitive descriptions and examples. Especially 
considering
the C++'s `using`. And then it is left to the compiler implementor
to get to a specific behavior.

I tried this DIP to provide a formal specification for the 
subject. And I'm
here to answer questions and receive corrections as I understand 
this is
not necessarily the best formal specification ever.

- Stefanos


More information about the Digitalmars-d mailing list