www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why is (int[int] s = int[int].init) not allowed

reply Andre Pany <andre s-e-a-p.de> writes:
Hi,

I am really confused, why is this valid:
void sample(string[string] s = string[string].init){}

while this causes syntax errors?

void sample_invalid1(double[string] s = double[string].init){}
void sample_invalid2(int[int] s = int[int].init){}

Kind regards
André
Dec 22 2020
next sibling parent reply ag0aep6g <anonymous example.com> writes:
On Tuesday, 22 December 2020 at 21:11:12 UTC, Andre Pany wrote:
 I am really confused, why is this valid:
 void sample(string[string] s = string[string].init){}

 while this causes syntax errors?

 void sample_invalid1(double[string] s = double[string].init){}
 void sample_invalid2(int[int] s = int[int].init){}
Looks like an oddity in the grammar. `string` is an alias, meaning it's an identifier. And an identifier is a valid expression to the grammar. So `string[string]` is parsed as an IndexExpression. Only during semantic analysis does the compiler figure out that it's actually a type. `double` and `int` aren't identifiers. They're keywords. And they're always types, never expressions. So `int[int]` cannot be parsed as an IndexExpression. It's parsed as a Type instead. And for a (grammatical) Type, there is no rule that allows `Type.Identifier`. You can work around with parentheses: (double[string]).init; (int[int]).init
Dec 22 2020
parent Andre Pany <andre s-e-a-p.de> writes:
On Tuesday, 22 December 2020 at 22:02:54 UTC, ag0aep6g wrote:
 On Tuesday, 22 December 2020 at 21:11:12 UTC, Andre Pany wrote:
 [...]
Looks like an oddity in the grammar. `string` is an alias, meaning it's an identifier. And an identifier is a valid expression to the grammar. So `string[string]` is parsed as an IndexExpression. Only during semantic analysis does the compiler figure out that it's actually a type. `double` and `int` aren't identifiers. They're keywords. And they're always types, never expressions. So `int[int]` cannot be parsed as an IndexExpression. It's parsed as a Type instead. And for a (grammatical) Type, there is no rule that allows `Type.Identifier`. You can work around with parentheses: (double[string]).init; (int[int]).init
Thanks a lot! Kind regards Andre
Dec 22 2020
prev sibling parent reply Daniel Kozak <kozzi11 gmail.com> writes:
On Tue, Dec 22, 2020 at 10:15 PM Andre Pany via Digitalmars-d-learn <
digitalmars-d-learn puremagic.com> wrote:

 Hi,

 I am really confused, why is this valid:
 void sample(string[string] s =3D string[string].init){}

 while this causes syntax errors?

 void sample_invalid1(double[string] s =3D double[string].init){}
 void sample_invalid2(int[int] s =3D int[int].init){}

 Kind regards
 Andr=C3=A9
As has been said this is an oddity in the grammar. But why would anyone need to use this anyway? void sample_invalid2(int[int] s =3D int[int].init){} seems really awful to me anyway.
Dec 22 2020
parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 12/22/20 5:44 PM, Daniel Kozak wrote:
 On Tue, Dec 22, 2020 at 10:15 PM Andre Pany via Digitalmars-d-learn 
 <digitalmars-d-learn puremagic.com 
 <mailto:digitalmars-d-learn puremagic.com>> wrote:
 
     Hi,
 
     I am really confused, why is this valid:
     void sample(string[string] s = string[string].init){}
 
     while this causes syntax errors?
 
     void sample_invalid1(double[string] s = double[string].init){}
     void sample_invalid2(int[int] s = int[int].init){}
 
     Kind regards
     André
 
 
 As has been said this is an oddity in the grammar. But why would anyone 
 need to use this anyway?
 
    void sample_invalid2(int[int] s = int[int].init){}
 
 seems really awful to me anyway.
Yeah: void sample_valid(int[int] s = null) -Steve
Dec 22 2020
parent reply Daniel Kozak <kozzi11 gmail.com> writes:
Dne st 23. 12. 2020 1:00 u=C5=BEivatel Steven Schveighoffer via
Digitalmars-d-learn <digitalmars-d-learn puremagic.com> napsal:

 On 12/22/20 5:44 PM, Daniel Kozak wrote:
 On Tue, Dec 22, 2020 at 10:15 PM Andre Pany via Digitalmars-d-learn
 <digitalmars-d-learn puremagic.com
 <mailto:digitalmars-d-learn puremagic.com>> wrote:

     Hi,

     I am really confused, why is this valid:
     void sample(string[string] s =3D string[string].init){}

     while this causes syntax errors?

     void sample_invalid1(double[string] s =3D double[string].init){}
     void sample_invalid2(int[int] s =3D int[int].init){}

     Kind regards
     Andr=C3=A9


 As has been said this is an oddity in the grammar. But why would anyone
 need to use this anyway?

    void sample_invalid2(int[int] s =3D int[int].init){}

 seems really awful to me anyway.
Yeah: void sample_valid(int[int] s =3D null) -Steve
Yes AA.init is null per doc. https://dlang.org/spec/hash-map.html#construction_and_ref_semantic
Dec 22 2020
parent Andre Pany <andre s-e-a-p.de> writes:
On Wednesday, 23 December 2020 at 07:08:31 UTC, Daniel Kozak 
wrote:
 Dne st 23. 12. 2020 1:00 uživatel Steven Schveighoffer via 
 Digitalmars-d-learn <digitalmars-d-learn puremagic.com> napsal:

 On 12/22/20 5:44 PM, Daniel Kozak wrote:
 [...]
Yeah: void sample_valid(int[int] s = null) -Steve
Yes AA.init is null per doc. https://dlang.org/spec/hash-map.html#construction_and_ref_semantic
Thanks for clarification, I was not aware that AA.init is technically the same as null. Kind regards Andre
Dec 23 2020