On 03/13/2013 10:19 PM, John Colvin wrote:
On Wednesday, 13 March 2013 at 21:08:30 UTC, Timon Gehr wrote:
...

That's clearly a valid way of reasoning, however, it is not the only one.

int[3] a = 1;
int[3] b = 2;
int[3] c = 3;

int[3][3] x = [a,b,c];

this would also be valid, as you have fully specified the elements of
the array. I don't see the conflict?

This was supposed to be a justification for int[3][3] x = [1,2,3]; denoting int[3][3] x = [[1,1,1],[2,2,2],[3,3,3]];

I think any one way to define the initialization semantics is arbitrary.

It is not necessary anyway, the language is versatile enough:

import std.stdio : writeln;
import std.algorithm, std.range;

auto array(R)(R r){ // phobos' version still not ctfe-able...
    typeof({foreach(x;r)return x;assert(0);}())[] a;
    foreach(x;r) a~=x;
    return a;
}

auto erep(R)(R r, size_t n){ return r.repeat(n).array; }
auto emap(alias a, R)(R r){ return r.map!a.array; }

auto rows(T)(T[] x,size_t n){ return x.erep(3); }
auto cols(T)(T[] x,size_t n){ return x.emap!(a=>a.erep(3)); }


int[3][3] x = [1,2,3].rows(3);
int[3][3] y = [1,2,3].cols(3);
void main(){
    assert(x[]==[[1, 2, 3], [1, 2, 3], [1, 2, 3]]);
    assert(y[]==[[1, 1, 1], [2, 2, 2], [3, 3, 3]]);
}

(using one of bearophiles turned-down enhancement requests:
  int[$][$] x = [1,2,3].rows(3);
  int[$][$] y = [1,2,3].cols(3);
)

Reply via email to