[Newbies] pretty printing
Bert Freudenberg
bert at freudenbergs.de
Tue Sep 30 19:33:28 UTC 2008
Am 29.09.2008 um 09:52 schrieb Claus Kick:
> Bert Freudenberg wrote:
>> Am 28.09.2008 um 09:52 schrieb Randal L. Schwartz:
>>> aString collect: [:char | char xmlEscaped].
>
> I had actually in mind to do it this way - but I thought the do:[]
> is easier to read. Runtime performance is always step 2 for me.
>
>>> Internally, that uses a Stream, which extends itself nicely as
>>> new data
>>> appears.
It does not use a Stream, #collect: knows the size of the collection
in advance, it's the same as the original one.
You were probably thinking of something like
^String streamContents: [:strm | aString do: [:c | sstrm nextPutAll:
char xmlEscaped]]
In some images there is #gather: which does this more concisely but
unfortunately uses Array instead of "self species" so it would not
work with Strings.
>>> In your version, the early string data is getting repeatedly
>>> copied
>>> to make each new string. Ouch.
>
> That may be, my Squeak is rusty (VW these days).
I'm pretty certain it would be the same in VW because #, has to copy
(unless you apply serious amounts of magic).
>> Err, #collect: constructs a string character by character, not
>> from other strings. Double-ouch ;)
>
> So, the gist is - whether you do do:[] or collect:[] doesnt matter
> much?
Well, #collect: is much more readable and concise, and might be
optimized for some sorts of collections.
In general it's good practice to use the most specific iteration
method available rather than emulating using #do: (and always think
twice, no, three times before using #to:do:).
- Bert -
More information about the Beginners
mailing list