Jump to page: 1 2
Thread overview
writef, positional arguments, and array formatting
Oct 09, 2008
Max Samukha
Oct 09, 2008
Max Samukha
Oct 09, 2008
Max Samukha
Oct 09, 2008
bearophile
Oct 09, 2008
KennyTM~
Oct 09, 2008
KennyTM~
Oct 09, 2008
Sean Kelly
October 09, 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
October 09, 2008
Andrei Alexandrescu wrote:
> writefln("%((s, )\n)", a); // prints "42, 1, 2"

Cut and paste strikes again. Please ignore the comment.

Andrei
October 09, 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?

It is this way in Tango AFAIK.  You could write a wrapper for it (in pseudocode):

writefln2(string format, ...)
{
   x = count % in format;
   return writefln(format, varargs[0..x]);
}

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

That is a very good idea!  Tango is the same way, in fact, tango got ability to print arrays fairly recently.  If I used Phobos, I'd certainly use it. How many times I wanted to print an array of ints as hexadecimal, but was forced to do some stupid loop thing...

I'll propose something similar on Tango as well.

-Steve


October 09, 2008
On Thu, 09 Oct 2008 09:55:53 -0500, Andrei Alexandrescu <SeeWebsiteForEmail@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
October 09, 2008
Max Samukha wrote:
> 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?

It's in already, just not very tested. I used the POSIX positional formatting syntax.

Andrei
October 09, 2008
On Thu, 09 Oct 2008 10:55:34 -0500, Andrei Alexandrescu <SeeWebsiteForEmail@erdani.org> wrote:

>Max Samukha wrote:
>> 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?
>
>It's in already, just not very tested. I used the POSIX positional formatting syntax.
>

Will you relieve the constraints that there must be no multiple % pointing to the same argument and positional and non-positional % must not be mixed?

>Andrei
October 09, 2008
Max Samukha wrote:
> On Thu, 09 Oct 2008 10:55:34 -0500, Andrei Alexandrescu
> <SeeWebsiteForEmail@erdani.org> wrote:
> 
>> Max Samukha wrote:
>>> 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?
>> It's in already, just not very tested. I used the POSIX positional formatting syntax.
>>
> 
> Will you relieve the constraints that there must be no multiple %
> pointing to the same argument and positional and non-positional % must
> not be mixed?

Those restrictions have been relaxed. Try it!

Andrei
October 09, 2008
Andrei Alexandrescu:
> 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

The need to format single items of an array isn't so much common, but it's common enough to be an interesting case. I may be better to reduce the complexity of your idea: you can specify just the type of the bottom level of the given _collection_, and you can't specify the separator. It's less flexible, but I think it covers most of the common situations. So the syntax becomes the following in both cases:

%(s)

A syntax like %(s:s) may be used to specify how to format the bottom levels of associative arrays :-)

Bye,
bearophile
October 09, 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
October 09, 2008
On Thu, 09 Oct 2008 11:22:50 -0500, Andrei Alexandrescu <SeeWebsiteForEmail@erdani.org> wrote:

>Max Samukha wrote:
>> On Thu, 09 Oct 2008 10:55:34 -0500, Andrei Alexandrescu <SeeWebsiteForEmail@erdani.org> wrote:
>> 
>>> Max Samukha wrote:
>>>> 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?
>>> It's in already, just not very tested. I used the POSIX positional formatting syntax.
>>>
>> 
>> Will you relieve the constraints that there must be no multiple % pointing to the same argument and positional and non-positional % must not be mixed?
>
>Those restrictions have been relaxed. Try it!
>
>Andrei

Relax is the right word, thanks. Didn't know it's in the current phobos. Very nice.
« First   ‹ Prev
1 2