writef, positional arguments, and array formatting

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Oct 9 07:55:53 PDT 2008


I don't want to divert anyone's attention from more important issues, 
but I'm running into a few little problems here with writef and friends.

1. Printing only some arguments

Currently writef insist on formatting all arguments, even those that 
don't have a format spec allocated. This creates problem in an app of 
mine that takes a format string as a command-line argument and 
selectively prints stuff. For example:

./kernelize --format='%1$s %2$s'

The call is:

uint id1, id2;
float value;
...
writefln(format, id1, id2, value);

I need:

12 23

But instead I get:

12 230.34

I wonder how this could be addressed. Should presence of positional 
parameters suppress the "print'em all" approach?

2. Formatting arrays

This has been an ongoing problem with formatting functions: there's no 
proper formatting for arrays beyound writing %s and formatting the 
entire array with [e0 e1 ... en]. I was thinking of improving that like 
this:

int[] a = [ 42, 1, 2 ];
writefln("%(s, )", a); // prints "42, 1, 2"

"%(" opens a spec that will be applied to each element of the array. For 
the last element, only the format part of the spec applies, not the 
trailing string (in the example above ", "). One nice thing is that the 
specs can be nested, so:

int[][] a = [ [ 42, 1, 2 ], [ 3, 4 ] ];
writefln("%((s, )\n)", a); // prints "42, 1, 2"

will print:

42, 1, 2
3, 4

that is, one subarray per line with elements separated with commas and 
spaces.

Is this something you'd use?


Andrei



More information about the Digitalmars-d mailing list