On Monday, 20 February 2017 at 15:27:16 UTC, ag0aep6g wrote:
On 02/20/2017 03:44 PM, timmyjose wrote:
Things I don't like so much:

1). The std.range: iota function(?) is pretty nice, but the naming seems
a bit bizarre, but quite nice to use.

Yeah, the name is weird. A little googling suggests it comes from C++ [1] which took it from APL.

Damn! I'd just watched this interesting APL demo from 1975 a couple of days back (https://www.youtube.com/watch?v=_DTpQ4Kk2wA) which does use iota, and I never did make the connection!

2). The automatic conversion rules are nice for avoiding verbose code,
but it looks like it might bite one just like in C++.

D at least disallows narrowing conversions. But yeah, conversions between signed/unsigned, from integral to floating point, or from narrower to wider char variants can have surprising results.

3). Not so much a fan of "auto", but it does have its uses, of course.

`auto` can obscure your code, but it can also make it more DRY. And with ranges and their combinations, types quickly get too complex to type out.

Absolutely agreed.

4). I'm still a bit confused by order of dimensions in rectangular arrays:

Suppose I have a simple 2 x 3 array like so:

import std.stdio;
import std.range: iota;

void main() {
    // a 2 x 3 array
    int [3][2] arr;

    foreach (i; iota(0, 2)) {
        foreach(j; iota(0, 3)) {
            arr[i][j] = i+j;
        }
    }

    writefln("second element in first row = %s", arr[0][1]);
    writefln("third element in second row = %s", arr[1][2]);

    writeln(arr);
}

My confusion is this - the declaration of the array is arr
[last-dimension]...[first-dimension], but the usage is
arr[first-dimension]...[last-dimension]. Am I missing something here?

You've got it. Declarations have the form `Type name;`. Fixed-size array types have the form `E[n]`. E can itself be another fixed-size array type, say F[m]. Then the whole type becomes F[m][n]. Simple.

Brilliant! This explanation actually makes me get it now.

The syntax could have be designed to grow in the other direction: [n]E = [n][m]F, to match indexing order. But Walter didn't make it that way.


[1] http://en.cppreference.com/w/cpp/algorithm/iota


Reply via email to