writef, positional arguments, and array formatting

KennyTM~ kennytm at gmail.com
Thu Oct 9 09:34:07 PDT 2008


Andrei Alexandrescu wrote:
> 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?
> 

Just use/add the C# (Tango) formatting scheme?

> 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