dmd 2.029 release

Don nospam at nospam.com
Thu Apr 23 07:56:25 PDT 2009


Georg Wrede wrote:
> Don wrote:
>> Georg Wrede wrote:
>>> Don wrote:
>>>> bearophile wrote:
>>>>> This post is mostly for Andrei.
>>>>> I have played with D2 a bit; probably I'll need months to digest it 
>>>>> and its new Phobos2. While I explore Phobos I'll probably post some 
>>>>> comments/bugs around here.
>>>>>
>>>>> After reading this:
>>>>> http://blogs.msdn.com/vcblog/archive/2009/04/22/decltype-c-0x-features-in-vc10-part-3.aspx 
>>>>>
>>>>> I have tried to write a toy implementation of it in D2 (not using 
>>>>> Phobos2 yet):
>>>>>
>>>>> import std.stdio: writeln;
>>>>> import std.string: format;
>>>>>
>>>>> struct Watts {
>>> ...
>>>
>>>>> Two things to improve:
>>>>> 1) All structs must have a default built-in opString, a good 
>>>>> representation can be:
>>>>> StructName(field_value1, field_value2, field_value1, ...).
>>>>> It's not a perfect textual representation, but it's WAY better than 
>>>>> the current one (currently it shows just the struct name).
>>>>> (Printing the module name before the struct name is bad, most times 
>>>>> is just noise)
>>>>
>>>> No!
>>>> <rant>
>>>> toString() is one of the most dreadful features in D. Trying to 
>>>> slightly improve it is a waste of time -- the whole concept needs to 
>>>> be redone.
>>>> It's horribly inflexible, tedious, and hugely inefficient. What more 
>>>> could there be to hate?
>>>>
>>>> - the object being called has no context. It doesn't know what 
>>>> format is desired, for example.
>>>> - you can't emulate formatting of built-in types, NOT EVEN int! You 
>>>> can't do left-align, pad with zeros, include + sign, display in hex.
>>>>
>>>> - it's got no stream concept. Every object has to create and manage 
>>>> its own buffer, and nobody knows if anyone actually needs it.
>>>>
>>>> It ought to be at least as simple as:
>>>>
>>>> struct Foo(A, B, C){
>>>> A[10] a;
>>>> B b;
>>>> C c;
>>>> void toString(Sink sink){
>>>>    foreach(x; a) sink(x);
>>>>    sink(b);
>>>>    sink(c);
>>>> }
>>>> }
>>>> ... but it's not, you have to create a silly buffer to put all your 
>>>> strings in, even if there are 200 million of them and your giant 
>>>> string is just going to be written to a file anyway.
>>>>
>>>> I'd like to see version(debug) {} put around Object.toString(). It's 
>>>> a deathtrap feature that's got no business being used other than for 
>>>> debugging.
>>>> </rant>
>>>
>>> First of all, printing stuff "struct.toString()" style is for two 
>>> things:
>>>
>>>  o  Debugging
>>>  o  Small throwaway code snippets
>>>
>>> The latter mainly being for two purposes:
>>>
>>>  o  Testing quick concepts, trying out library functions, etc.
>>>  o  For the newbie, when he's learning D, but not output formatting.
>>>
>>> No "Real Program" uses this, because there you typically do proper 
>>> formatting of the output anyway, and almost never print entire 
>>> structs or objects as such. Instead, rather the information that they 
>>> represent.
>>
>> How about something like BigInt? Why can't you just print it out?
> 
> ?? Why couldn't you?
> 
> They're not stored as strings (not Janice's anyway), but I don't 
> understand the question.

You can write:

int a, b;
a=10; b=20;
writefln("%d %x", a, b);

I'd like to be able to write:

BigInt a, b;
a=10; b=20;
writefln("%d %x", a, b);

and have it behave exactly the same.


> 
>> BTW to everyone, 'Sink' was not a proposal. I was just saying that 
>> almost anything's better than the current toString().


More information about the Digitalmars-d-announce mailing list