''This is obvious.. just talk about the weather, or sports, or other general small issues...  Pretend you're at a bar, make conversation. Make small talk. No, really.. ''

For tonight's reading, we have selected the following small piece:

'''select: aBlock'''
	| newCollection |
	newCollection := self species new.
	self do: [ :each | (aBlock value: each) ifTrue: [newCollection add: each]].
	^ newCollection

I like the idea of talking to myself when reading any language, for example, reading i = i + 1 as "i gets i plus one".  But, even though I made a brief sojourn into Smalltalk a few weeks ago, this page gives me no hints.  (I did learn that I don't like the terminology "Answers a ..." found in the definition of each method (at least in Dolphin Smalltalk).) -- RandyKramer

----

   Method select takes one argument, aBlock. 
   One local object, newCollection. 
   newCollection gets self species (answers a class) new. 
   self do a one-argument block. 
	The argument is each. 
	aBlock value each (answers a boolean)if true block 
	        newCollection add each. end block. 
	end block. 
   answer newCollection.

----

I'm not sure I'm entirely convinced by the above. I ''think'' I would read this as :

''This is how I '''select''' things, given a Block. To '''select''' things, I'll work on a newCollection, and return it at the end. The newCollection should be an instance of my '''species''', i.e. idiomatically "my class or a close approximation thereof". For '''each''' thing I myself have, I will '''do''' the following - ask the Block I was given what its '''value''' is for that thing, and ask the value to do the following for me '''if''' it happens to be a '''true''' value : '''add''' the thing to the newCollection.''

----

Here's another reading. --RonJeffries

I'd read much of it as written, actually:

'''select: aBlock'''

select colon aBlock (thinking, "It's a method named select taking a block.")

	| newCollection |
temp newCollection

	newCollection := self species new.
newCollection gets self species new. (thinking, "Species means 'class' except that collections convert to their species. this is a rather tricky bit that many smalltalkers never find out about.")

	self do: [ :each | (aBlock value: each) ifTrue: [newCollection add: each]].
This one I don't read word for word. I see: "loop over the receiver (collection) and if the block value is true, add the element to newCollection".

	^ newCollection
"Answer the new collection" (you get used to saying answer. it's just a word.)

Strictly I don't think those thoughts. I see that code and for most lines I just know what it means. I don't translate it to English to understand it, just as I used to not translate German to understand it, and as most of us don't translate our "native" programming language.

----

Ron notes at the end, "Strictly I don't think those thoughts."  This made me ask: ShouldWeTalkToOurselvesWhenReadingCode?

----
Another way is this:

'''select: a1blockDiscriminator'''
	| selectedElements |                                   " a temp "
	selectedElements := self species new.                  " selectedElements is initially an empty copy of this collection. "
	self do:                                               " do
            [ :eachElement |                                   "   eachElement suchThat
             (a1blockDiscriminator value: eachElement)         "   where the value of discriminator is true for said element "
                 ifTrue: [selectedElements add: eachElement]   "   we add said element to selectedElements "
            ].
	^ selectedElements                                     " answer the selectedElements "

JimSawyer

CategorySmalltalk