Discussion Thread: DIP 1037--Add Unary Operator ...--Community Review Round 1
Q. Schroll
qs.il.paperinik at gmail.com
Thu Nov 5 04:44:01 UTC 2020
On Tuesday, 3 November 2020 at 07:05:19 UTC, Manu wrote:
> There's a grammar change that supports:
> alias staticMap(F, Args...) = F!Args...;
> And also:
> MyTemplate!(expr...) <-- appearance in template parameter
> lists
>
> It's also deliberate and necessary that the grammar is NOT
> modified such
> that `...` could be accepted in argument list definitions, [...]
> I actually really like this incidental restriction; it makes
> declarations clearer.
I really don't think that such a special case is necessary. Maybe
one way to litigate this is to (using terms just learned from
Andrei) require the pattern to be in parentheses. Since
`identifier...` (where identifier is a tuple) is the same as
`identifier` per se, one could solve the question how long the
`...` expands to the right by requiring parentheses. No one ever
asked how far template arguments are read, i.e. whether T!Arg[0]
means (T!Arg)[0] or T!(Arg[0]) because it is single token or you
need parentheses. Not even T![0,1,2] (an array literal) compiles!
So... maybe it is (pattern)... that is The Right Thing™? That
way, you can have it in function parameter lists:
void func((pattern)... args) { .. }
An example would be
void func(Ts...)((Ts[])... args) { .. }
for a function template taking any kinds of slices. It is
unambiguous because the parentheses aren't legal in current state
of D.
Notice that `const(Ts)...` is still the old syntax, i.e. the
`...` are for type-safe variadic parameters. Full example:
https://run.dlang.io/is/3QvFCA
Since there are types like int* that can be expressed with a
token sequence that aren't legal as expressions, there is a need
for type patterns and expression patterns; or patterns in general
must accommodate types and expressions together.
More information about the Digitalmars-d
mailing list