On Tue, 30 Aug 2011 19:41:37 -0700, Jonathan M Davis wrote:

> On Tuesday, August 30, 2011 20:59:06 Paul D. Anderson wrote:
>> Can someone clarify for me the status and/or direction of string
>> formatting in D?
>> 
>> We've got:
>> 
>> 1. toString, the object method with no parameters. 2. toString(sink,
>> format)
>> 3. to!String()
>> 4. format
>> 5. writef/writefln
>> 6. write/writeln
>> 
>> I realize these exist for various reasons, some (1,3) are simple
>> (unformatted) conversions, others (2,4-6) are designed to provide
>> configurable formatting. The problem is that they are inconsistent with
>> each other.
>> 
>> Using std.bigint as an example: 1, 3, 4 and 6 don't work, or don't work
>> as expected (to me at least). 1. prints 'BigInt', 3 and 4 are compile
>> errors.
>> 
>> I know bigint is a controversial example because Don has strong
>> feelings against 1 and favors 2. (See bug #5231). I don't really have
>> an opinion one way or the other but I need to know what to implement in
>> my arbitrary-precision floating point module. This obviously relies
>> heavily on bigint.
>> 
>> So, is there a transition underway in the language (or just Phobos)
>> from toString, writeln and format, to toString(sink,format) and
>> writefln?
>> 
>> Or is this just a divergence of views, both of which are acceptable and
>> we'll have to get used to choosing one or the other?
>> 
>> Or am I just mistaken in believing there is any significant conflict?
>> 
>> I apologize if this has already been hashed out in the past and, if so,
>> I would appreciate someone pointing me to that discussion. (Or just the
>> results of the discussion.)
> 
> At this point, it's toString with no parameters. Don's completely out in
> left field with regards to how things currently work. I believe that
> BigInt is the _only_ example of toString(sink, format).

Actually, std.complex.Complex also has toString(sink, format), and Don 
even fixed the write* functions so that they work with both Complex and 
BigInt.  The following works as you'd expect:

    BigInt i = "1234567890";
    writeln(i);

    auto z = complex(123.4, 5678.9);
    writefln("%.10e", z);

There is only one important missing piece here:  std.conv.to!string 
should be implemented to call toString with an appropriate sink and "%s" 
as the format string.

-Lars

Reply via email to