Smalltalk Lecture 4
1
Fraction class
Number subclass: #MyFraction.
MyFraction instanceVariableNames: ‘num den’. MyFraction extend [
num [ ^ num ]
den [ ^ den ]
num: n den: d [ num := n. den := d ]
]
f1 := MyFraction new num: 10 den: 4.
f2 := MyFraction new num: 15 den: 6.
f3 := MyFraction new num: -10 den: 4.
f4 := MyFraction new num: 15 den: -6.
2
printOn:
MyFraction extend [ printOn: aStream [
num printOn: aStream. aStream nextPut: $/. den printOn: aStream. aStream cr ]
]
f1 printOn: Transcript.
f2 printOn: Transcript.
f3 printOn: Transcript.
f4 printOn: Transcript.
3
10/4
15/6
-10/4
15/-6
+ and –
MyFraction extend [
+ f [ ^ MyFraction new num: (num * f den) + (den * f num)
den: (den * f den) ]
– f [ ^ MyFraction new num: (num * f den) – (den * f num)
]
f5 := f1 + f2.
f6 := f1 – f2.
f5 printOn: Transcript.
f6 printOn: Transcript.
den: (den * f den) ]
120/24 0/24
4
* and /
MyFraction extend [
* f [ ^ MyFraction new num: (num * f num)
den: (den * f den) ] / f [ ^ MyFraction new num: (num * f den)
]
f7 := f1 * f2.
f8 := f1 / f2.
f7 printOn: Transcript.
f8 printOn: Transcript.
den: (den * f num) ]
150/24 60/60
5
= and ~=
MyFraction extend [
= f [ ^ (num * f den) = (den * f num) ]
]
f1 = f2 printOn: Transcript. Transcript cr.
f2 = f3 printOn: Transcript. Transcript cr.
f3 = f4 printOn: Transcript. Transcript cr.
f1 ~= f2 printOn: Transcript. Transcript cr.
f2 ~= f3 printOn: Transcript. Transcript cr.
f3 ~= f4 printOn: Transcript. Transcript cr.
true
false
true
false
true
false
6
asFloat
MyFraction extend [
asFloat [ ^ num asFloat / den asFloat ]
]
f1 asFloat printOn: Transcript. Transcript cr. f3 asFloat printOn: Transcript. Transcript cr. f5 asFloat printOn: Transcript. Transcript cr. f7 asFloat printOn: Transcript. Transcript cr.
2.5
-2.5
5.0
6.25
7
reduce
MyFraction extend [ reduce [ |g|
g := num gcd: den.
den < 0 ifTrue: [ g := 0 - g ]. num := num / g.
den := den / g ]
]
f1 reduce. f2 reduce. f5 reduce. f6 reduce.
f3 reduce. f7 reduce.
f4 reduce. f8 reduce.
8
reduce
f1 printOn: Transcript. f2 printOn: Transcript. f3 printOn: Transcript. f4 printOn: Transcript.
f5 printOn: Transcript. f6 printOn: Transcript. f7 printOn: Transcript. f8 printOn: Transcript.
5/2
5/2
-5/2
-5/2
5/1
0/1
25/4
1/1
9
Always reduce
MyFraction extend [
num: n den: d [ num := n. den := d. self reduce ] ]
f1 := MyFraction new num: 10 den: 4.
f2 := MyFraction new num: 15 den: 6.
f3 := MyFraction new num: -10 den: 4.
f4 := MyFraction new num: 15 den: -6.
f1 printOn: Transcript.
f2 printOn: Transcript.
f3 printOn: Transcript.
f4 printOn: Transcript.
10
5/2
5/2
-5/2
-5/2
Always reduce
f5 := f1 + f2. f6 := f1 - f2. f7 := f1 * f2. f8 := f1 / f2.
f5 printOn: Transcript. f6 printOn: Transcript. f7 printOn: Transcript. f8 printOn: Transcript.
5/1
0/1
25/4
1/1
11
Better = and ~=
MyFraction extend [
= f [ ^ (num = f num) & (den = f num) ]
]
f1 = f2 printOn: Transcript. Transcript cr.
f2 = f3 printOn: Transcript. Transcript cr.
f3 = f4 printOn: Transcript. Transcript cr.
f1 ~= f2 printOn: Transcript. Transcript cr.
f2 ~= f3 printOn: Transcript. Transcript cr.
f3 ~= f4 printOn: Transcript. Transcript cr.
true
false
true
false
true
false
12
OOP: inheritance and late method binding
Object extend: #A. A extend: #B.
B extend: #C.
C extend: #D.
D extend: #E.
x := Array new: 5. x at: 1 put: A new; at: 2 put: B new;
at: 3 put: C new; at: 4 put: D new; at: 5 put: E new.
13
Object and self
Object extend [ m [^ 1]
n [^ self m]
output [ Transcript display: self m; space;
]
Object new output. Transcript cr.
display: self n; tab ]
11
14
Subclass A and super
A extend [
p [^ self n]
q [^ super m]
output [ super output.
Transcript display: self p; space; display: self q; cr ]
]
(x at: 1) output.
11 1 1
15
Subclasses B and C
B extend [ m [^ 2]
]
(x at: 2) output.
C extend [
p [^ super q] q [^ super p]
]
(x at: 3) output.
2 2
2 1
22
1 2
16
Subclasses D and E
D extend [ m [^ 3]
]
(x at: 4) output.
E extend [ n [^ 4]
]
(x at: 5) output.
33 1 3
34 1 4
17
Iterators to:do: and do:
1 to: 5 do: [ :k | y := x at: k. y output ].
x do: [ :each | each output ]
11 11 22 21 22 12 33 13 34 14
11 11 22 21 22 12 33 13 34 14
18