Semantics of toString

Denis Koroskin 2korden at gmail.com
Wed Nov 11 08:09:28 PST 2009


On Wed, 11 Nov 2009 18:50:47 +0300, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> Denis Koroskin wrote:
>> On Wed, 11 Nov 2009 04:27:45 +0300, Andrei Alexandrescu  
>> <SeeWebsiteForEmail at erdani.org> wrote:
>>
>>> Bill Baxter wrote:
>>>> 2009/11/10 Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org>:
>>>>> Denis Koroskin wrote:
>>>>>> On Wed, 11 Nov 2009 02:49:54 +0300, Andrei Alexandrescu
>>>>>> <SeeWebsiteForEmail at erdani.org> wrote:
>>>>>>
>>>>>>> Don wrote:
>>>>>>>> Lutger wrote:
>>>>>>>>> Don wrote:
>>>>>>>>> ...
>>>>>>>>>> There is a definite use for such as thing. But the existing  
>>>>>>>>>> toString()
>>>>>>>>>> is much, much worse than useless. People think you can do  
>>>>>>>>>> something
>>>>>>>>>> with
>>>>>>>>>> it, but you can't.
>>>>>>>>>> eg, people have asked for BigInt to support toString(). That is  
>>>>>>>>>> an
>>>>>>>>>> over-my-dead-body.
>>>>>>>>> Since you are in the know and probably the biggest toString()  
>>>>>>>>> hater
>>>>>>>>> around: are there plans (or rejections thereof) to change  
>>>>>>>>> toString() before
>>>>>>>>> D2 turns gold? Seems to me it could break quite some code.
>>>>>>>>  I'm hoping someone will come up with a design.
>>>>>>>>  Straw man:
>>>>>>>>  void toString(void delegate(const(char)[]) sink, string fmt) {
>>>>>>>>  // fmt holds the format string from writefln/formatln.
>>>>>>>> // call sink() to print partial results.
>>>>>>>>  }
>>>>>>> I think the best option for toString is to take an output range  
>>>>>>> and write
>>>>>>> to it. (The sink is a simplified range.)
>>>>>>>
>>>>>>> Andrei
>>>>>> It means toString() must be either a template, or accept an abstract
>>>>>> InputRange interface?
>>>>> It should take an interface.
>>>>  So yet another type in object.d?
>>>> Or require users in import something specific in every module that's
>>>> going to use toString?
>>>>  --bb
>>>
>>> I am not sure. Opinions as always are welcome.
>>>
>>> Andrei
>>  Some ranges may be polymorphic, so having base interface hierarchy in  
>> Phobos would be useful anyway.
>>  BTW, save() is already implemented and used throughout the Phobos  
>> under a different name - opSlice (i.e. auto copy = range[]). It's a  
>> bikeshed discussion, but why save() and not opSlice(), or even clone()?
>
> It can't be clone() because it doesn't clone. For example say you have a  
> T[] - one would expect clone() actually copies the content. But using  
> opSlice is a good idea.
>
> Andrei

Well, range doesn't own any of the contents it covers, so deep copy is  
impossible.
Yet, there is also .dup array property which is pretends to be a standard  
way of creating instance copies.



More information about the Digitalmars-d mailing list