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]]. ^ newCollectionI 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?