On Mon, 12 Jul 2010 17:23:16 -0400, Heywood Floyd wrote: > bearophile Wrote: > >> Heywood Floyd: >> > This had me crazy. I ended up putting the brackets on the variable, >> > like >> > int marr[3][5]; >> > then it worked like >> > marr[2][4] = 9; >> >> That's present only for compatibility with C syntax, this means that >> you can use it to perform a quicker port of C code to D, but you are >> supposed to later convert it to D-style array definitions. See also: >> http://www.digitalmars.com/webnews/newsgroups.php? art_group=digitalmars.D&article_id=113185 >> >> Bye, >> bearophile > > Aha, good to know! Thanks! > (So this might go away in the future? Or require a -cstyle compile > flag?) > > *** > > I have a feeling this "backwards"-array stuff is gonna be one of the > things my brain will repel for as long as it can. > > To me, it seems equal to saying "you declare a function like: > > > void foo(string name, int age){ > //... } > > > And then call it by doing > > foo(90,"Benny") > > and this makes sense because the arguments are actually pushed on the > stack in reverse at runtime, so they arrive in the correct order in the > function. And this is especially important with tuples." or something. > > Ok, I understand this has some deep purpose that I still don't > understand, I'm just, yeah. *tear* (Although this is way out of my > league: For instance, if a T is an int[3][4], then why can't T[string] > be a int[string][3][4], and be accessed with arr["a"][2][3]? Seems just > like a matter of taste?)
But then arrays would be different from all other types! If you have an array of 3 Ts, that is written T[3], regardless of what T is. Now consider these two cases: A. T is an int. Then T[3] becomes int[3]. B. T is an int[string]. Then T[3] becomes int[string][3]. In case A, the first element of the array is accessed like this: int[3] a; int firstA = a[0]; Since a is an array of int, firstA is of course an int. But then, since b is an array of int[string], we have int[string][3] b; int[string] firstB = b[0]; If we again want to access element "foo" of the associative array which is firstB, we write firstB["foo"]. And so we have the following three ways to get to that element, which *must* be equivalent because that's how the language is defined: // Using firstB as an intermediate step int[string] firstB = b[0]; int x = firstB["foo"]; // Drop the intermediate variable firstB int x = (b[0])["foo"]; // Drop the redundant parentheses int x = b[0]["foo"]; So you see, it can't be any other way than the way it is. :) -Lars