Collecting Smalltalk idioms

agree at agree at
Tue Aug 10 21:47:39 UTC 1999

> 	(ReadStream on: aCollection) do: [ :each |
> 		each printOn: aStream.
> 		aStream atEnd ifFalse: [ aStream nextPut: $,]]

I'm not sure quoted code works.  The atEnd test is made on aStream, which is the OUTPUT stream, not the input stream.  In my original message, I suggested the following example (which had a typo exactly like the quoted code, by the way), recast here for clarity:

	inStream _ ReadStream on: aCollection.
	[inStream atEnd] whileFalse:
		[<Your "per-element" code here, referencing "inStream next">.
		 inStream atEnd ifFalse: [<Your delimiter code here>]]

The following also works, looking a bit more like the quoted passage:

 	inStream _ ReadStream on: aCollection.
	inStream do: 		[:each |
		 <Your "per-element" code here, referencing "each">.
		 inStream atEnd ifFalse: [<Your delimiter code here>]]

I still find myself strangely drawn to Marcel's template:

	aCollection inject: [] into:
		[:middleBlock :each |
		 middleBlock value.
		 <Your "per-element" code here, referencing "each">.
		 [<Your delimiter code here>]]

in preference to:

	aCollection inject: true into:
		[:isFirst :each |
		 isFirst ifFalse: [<Your delimiter code here>].
		 <Your "per-element" code here, referencing "each">.

And so it goes.  I ask the question then, which is the preferable course when building an application (hopefully) of general utility for the Squeak community:

	(1) Use one of the above idioms when the issue arises;
	(2) Use another idiom;
	(3) Extend Collection with #do:separatedBy:, however implemented; or
	(4) Lobby Squeak Central to add #do:separatedBy:?

I, for one, am quite glad that I asked the stupid question, for I found the discussion entertaining and illuminating.  Thanks to all for your insights.

More information about the Squeak-dev mailing list