On 12/21/20 8:47 PM, Rekel wrote:

> On Monday, 30 January 2017 at 07:33:34 UTC, Ali Çehreli wrote:
>> As others have said, D's array definition is natural because unlike
>> C's inside-out (or is that outside-in?) syntax, it follows from the
>> alias syntax. Replacing History inside main with Matrix[], etc.:
>>
>>     History history;    // is the same as:
>>     Matrix[] history;   // is the same as:
>>     Row[4][] history;   // is the same as:
>>     int[4][4][] history;
>>
>> Ali
>
> Defending array-notation by giving an example of explicitly not using
> declared aliases makes no sense to me.

Reading 3-year younger Ali's message, I still agree with him. The aliases were not given to defend D's array syntax. They were just an additional information which I do use occasionally to simplify my code.

> When I define 2d arrays, or index them, I think in row -> column terms

Everybody have their own mental model. Because C, C++, D, three languages that I am quite familiar with, don't have 2d arrays, personally, I never felt comfortable with that mental model. I don't think C's array syntax is left-to-right or right-to-left, it's either inside-out or outside-in. As soon as I learned about D's array syntax I felt happy. Consistent...

> (often math notation for matrix size being; 'rows x columns'), or more
> generally in big -> small terms, which is clear when using the
> consistent left->right notation, big picture first followed by detail,
> honestly the whole concept of encapsulation;
>
>> History history;
>> Matrix[] history;

Ok.

>> Row[][4] history; // collection of rows, stored in a dynamic array

But that's not consistent. If array syntax is "type followed by square bracketed stuff", then your history must be

  Row[4][] history;

  Row[4] -> Four rows

Now, if we call that T, a history of those is

  T[]

Replacing T with Row[4]

  Row[4][] history;

That's what understand from consistency. What other consistent mental model is there to accept int[] as an array of ints but when it comes to an array of Row[4]s we should write Row[][4]? It's not logical nor consistent. It's a remnant of C, where the creator decided to make the definition and the use the same (or similar). Well, that did not work for me. And the creator agreed in a interview (which I am not motivated to search for now) that he might find a better syntax for C array but it was too late then.

> At heart however, this declaration design leads to inconsistency.

I disagree and I don't even understand.

>>    int[1][2] history; // 1 columm, 2 rows
> vs
>>    int last_element = history[1][0] // row 1, column 0
>
> This makes no sense to anyone used to reading left to right, or even
> right to left.

You seem to expect the language to parse history[1][0] as a whole. (?) However, history[1] is an expression by itself. There is one thing that history[1] returns and that is the second element of that array. [0] is and should be applied to whatever history[1] expression produces. Now, that's consistent.

> Honestly, reversing reading-order when indexing & declaring is the worst
> idea I could imagine if consistency and readability were your goal.

I argue the complete opposite for the same reason: consistency and readability.

> It
> doesn't make more sense because you're reading 'outward', that would
> mean I would have to read both left to right _and_ right to left.

I always read from left to right: T[]. That is the array syntax. And arr[i]; that is the array element access syntax. Everything else falls into place with those definitions.

> The argument Jonathan M Davis gives in this regard hold no water for me.

Neither to me. I am simple person. Definition: T[], use: arr[i]. Done. :)

>> Like in C/C++, types are mostly read outward from the variable name in
>> D. In both C/C++ and D,

Perhaps because I'm not a native speaker, I have never ever read any definition from right-to-left or inside out or outside in.

>> int* foo;
>>
>> is a pointer to an int.

To me, it has always been an "int pointer".

> It's read outward from the variable name, so
>> you get the pointer and then what it points to. Similarly,
>>
>> int** foo;
>>
>> is a pointer to a pointer to an int.

No: "int pointer pointer". :)

> Feel free to read them the way you want, but personally, I read int* foo
> as 'integer pointer', which is not 'outward'.

Thank you! Me too! :)

Let me try the history example:

  Row[4][] history;

Row array (of 4) array.

> just noticed this is how D handles multidimensional arrays

I think that's the source of the disagreements: D does not have multidimensional arrays. C and C++ don't have multidimensional arrays either.

> It saddens me quite a bit, as I see it as a big design flaw and quite a
> turn-off

Fully disagreed: D's array syntax makes me happy; designed right. :)

> , "unfortunately one that can't be fixed" as Profile Analysis
> put it.

Phew! :)

>> Have a nice & safe christmas!

Same to you! <3

Ali


Reply via email to