minibean
minibean

Reputation: 263

Using square brackets for the output of array elements

This code creates one record variable (r) and one tuple variable (t) that contain several arrays and prints them to stdout:

const N = 5;

record Myrec {
    var a: [1..N] int = (for i in 1..N do i);
    var b: [1..N] int = (for i in 1..N do i);
    var c: [1..N] int = (for i in 1..N do i);
}

proc test() {
    var r: Myrec;
    var t = (r.a, r.b, r.c);
    writeln( "r = ", r );
    writeln( "t = ", t );
}

test();

If I run this code, I get this output:

r = (a = 1 2 3 4 5, b = 1 2 3 4 5, c = 1 2 3 4 5)
t = (1 2 3 4 5, 1 2 3 4 5, 1 2 3 4 5)

but I feel the output is not very readable (particularly in the case of t). So, I am wondering if there is some way to print such variables with square brackets, e.g., like the following?

t = ([1 2 3 4 5], [1 2 3 4 5], [1 2 3 4 5])

I think it can be achieved by using writef() + a format string + passing each field of the tuple (or write a specific function for that purpose), but it would be nice if there is some convenient way to achieve a similar goal...

Upvotes: 1

Views: 604

Answers (1)

minibean
minibean

Reputation: 263

According to the docs of FormattedIO, it seems like the format string %ht (or %jt) does the job of adding [...] for array elements. A modified example code is attached below:

record Myrec {
    var n = 100;
    var a = [1,2,3];
    var x = 1.23;
}

proc test() {
    var r: Myrec;
    var t = (r.a, r.a);

    writeln();
    writeln( "r = ", r );
    writef( "r = %ht\n", r );  // "h" -> Chapel style
    writef( "r = %jt\n", r );  // "j" -> JSON style

    writeln();
    writeln( "t = ", t );
    writef( "t = %ht\n", t );

    var arr2d: [1..2, 1..3] int = (for i in 1..6 do i);

    writeln();
    writeln( "arr2d =\n", arr2d );
    writef( "arr2d =\n%ht\n", arr2d );
}

test();

Output

r = (n = 100, a = 1 2 3, x = 1.23)
r = new Myrec(n = 100, a = [1, 2, 3], x = 1.230000e+00)
r = {"n":100, "a":[1, 2, 3], "x":1.230000e+00}

t = (1 2 3, 1 2 3)
t = ([1, 2, 3], [1, 2, 3])

arr2d =
1 2 3
4 5 6
arr2d =
[
 [1, 2, 3],
 [4, 5, 6]
]

Upvotes: 1

Related Questions