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