Unary - Binary message
Richard A. O'Keefe
ok at atlas.otago.ac.nz
Fri Oct 26 02:38:03 UTC 2001
"Gary McGovern" <garywork at lineone.net> wrote:
What I wanted was to overcome
count := count + 1
in iterations, (something I'm tired of already even as a beginner) and just
use
count ++
Are you writing
i := 1.
[i <= n] whileTrue: [
do something with i.
i := i + 1].
or are you writing
1 to: n do: [:i|
do something with i].
I use the iteration methods (such as #to:do:) as much as I can, and as
a result, very very seldom have occasion to add 1 to anything.
If you can get your hands on a copy of Kent Beck's
"Smalltalk Best Practice Patterns" you may get some useful ideas.
For example, suppose you had a pair of numeric arrays p, q and you
wanted to compute their dot product, and you either didn't know there
was a #dot: selector already in Squeak, or you DID know that for some
reason it is restricted to FloatArray. Then you could write
dot := (1 to: p) inject: 0 into: [:sum :i| sum + ((p at: i) * (q at: i))].
or
dot := 0.
1 to: p size do: [:i | dot := dot + ((p at: i) * (q at: i))].
or
dot := 0.
p with: q do: [:x :y| dot := dot + (x * y)].
Or you might say, "we have #with:do: and #inject:into:, why is there
no #with:inject:into:?", and go and add
with: otherCollection inject: thisValue into: ternaryBlock
"Combines Collection>>inject:into
and SequenceableCollection>>with:do"
|nextValue|
nextValue := thisValue.
1 to: self size do: [:index|
nextValue := ternaryBlock
value: nextValue
value: (self at: index)
value: (otherCollection at: index)].
^nextValue
and then you could write
dot := p with: q inject: 0 into: [:sum :x :y| sum + (x*y)]
with never a count := count + 1 in sight.
More information about the Squeak-dev
mailing list
|