writef, positional arguments, and array formatting

Max Samukha samukha at voliacable.com.removethis
Thu Oct 9 08:53:09 PDT 2008


On Thu, 09 Oct 2008 09:55:53 -0500, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> 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?
>

Positional formatting would be great. Maybe make it zero-based? Would
it conflict with the '0' flag then? Or $ is enough to disambiguate?
What about making %1 a shortcut for %1$s?

>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?

It is!
>
>
>Andrei



More information about the Digitalmars-d mailing list