dmd 2.029 release
Joel C. Salomon
joelcsalomon at gmail.com
Thu Apr 23 09:42:10 PDT 2009
Georg Wrede wrote:
> Don wrote:
>> Georg Wrede wrote:
>>> One thing we sholuld be wary of is overdesign. BigInt is ok, but by
>>> the time we try to include a class called
>>> CompleteSimulationOfAnF1RaceCar, we're screwed. :-) I see no way to
>>> incorporate them into writefln or even plain writeln. Or at least, no
>>> *use*.
>>
>> I think it'd be reasonable to limit things to the options available
>> for built-in types. Outside of that, custom formatting functions make
>> a lot of sense. The problem is that toString() _looks_ like it
>> emulates built-in formatting, but it only does '%s'. So it's really
>> beguiling.
>
> Heh, one thought is, suppose we could have arbitrary format
> specifications in writef. Say, if we wrote %&lkjasdf; this string would
> be passed to toString. (It would of course be up to the class to
> error-check the string, writefln obviously cant (or shouldn't) do it.)
>
> So, things are doable. But I'm really not looking forward to that kind
> of sports. Any elaborate printing or formatting should be handled
> outside writefln &co.
Take a look at the formatting library for Plan 9. It’s very much like
printf & co., except it exposes enough of its internals to allow for new
formats to be added in. See the documentation (for the *nix-ported
version) at <http://swtch.com/plan9port/man/man3/print.html> and
<http://swtch.com/plan9port/man/man3/fmtinstall.html>. For example:
typedef
struct {
double r, i;
} Complex;
#pragma varargck type "X" Complex // compiler checks type-safety
int
Xfmt(Fmt *f)
{
Complex c;
c = va_arg(f−>args, Complex);
return fmtprint(f, "(%g,%g)", c.r, c.i); // can use flags here
}
main(...)
{
Complex x = (Complex){ 1.5, −2.3 };
fmtinstall('X', Xfmt);
print("x = %X\n", x);
}
With D’s type-safe variadic functions, this model can be made really
powerful.
—Joel Salomon
More information about the Digitalmars-d-announce
mailing list