Upload
the-world-of-smalltalk
View
549
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
Stéphane Ducasse 1
Stéphane [email protected]://stephane.ducasse.free.fr/
A Little Journey in the Smalltalk Syntax
S.Ducasse 2
Goal
Lower your stress :)Show you that this is simple
S.Ducasse 3
Appetizer!
S.Ducasse 4
S.Ducasse 5
Yeah!
Smalltalk is a dynamically typed language
S.Ducasse 6
ArrayList<String> strings = new ArrayList<String>();
strings := ArrayList new.
S.Ducasse 7
ShorterThread regThread = new Thread( new Runnable() { public void run() { this.doSomething();} }); regThread.start();
[self doSomething] fork.
S.Ducasse 8
Smalltalk = Objects + Messages + (...)
S.Ducasse 9
RoadmapFun with numbers
S.Ducasse 10
1 class
S.Ducasse 11
1 class >SmallInteger
S.Ducasse 12
1 class maxVal
S.Ducasse 13
1 class maxVal>1073741823
S.Ducasse 14
1 class maxVal + 1
S.Ducasse 15
1 class maxVal + 1>1073741824
S.Ducasse 16
(1 class maxVal + 1) class
S.Ducasse 17
(1 class maxVal + 1) class>LargePositiveInteger
S.Ducasse 18
(1/3) + (2/3)
S.Ducasse 19
(1/3) + (2/3)>1
S.Ducasse 20
2/3 + 1
S.Ducasse 21
2/3 + 1> 5/3
S.Ducasse 22
1000 factorial
S.Ducasse 23
1000 factorial 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
S.Ducasse 24
1000 factorial / 999 factorial
S.Ducasse 25
1000 factorial / 999 factorial> 1000
S.Ducasse 26
10 @ 100
S.Ducasse 27
10 @ 100
(10 @ 100) x
S.Ducasse 28
10 @ 100
(10 @ 100) x> 10
S.Ducasse 29
10 @ 100
(10 @ 100) x> 10
(10 @ 100) y
S.Ducasse 30
10 @ 100
(10 @ 100) x> 10
(10 @ 100) y>100
S.Ducasse 31
Points!
Points are created using @
S.Ducasse 32
Puzzle
(10@100) + (20@100)
S.Ducasse 33
Puzzle
(10@100) + (20@100) >30@200
S.Ducasse 34
Puzzle
(10@100) + (20@100) >30@200
S.Ducasse 35
RoadmapFun with characters, strings, arrays
S.Ducasse 36
$C $h $a $r $a $c $t $e $r
$F, $Q $U $E $N $T $i $N
S.Ducasse 37
space tab?!
Character spaceCharacter tabCharacter cr
S.Ducasse 38
‘Strings’
‘Tiramisu’
S.Ducasse 39
Characters
12 printString
> ’12’
S.Ducasse 40
Strings are collections of chars
‘Tiramisu’ at: 1
S.Ducasse 41
Strings are collections of chars
‘Tiramisu’ at: 1
> $T
S.Ducasse 42
A program! -- finding the last char
S.Ducasse 43
A program!
| str |
S.Ducasse 44
A program!
| str | local variable
S.Ducasse 45
A program!
| str | local variablestr := ‘Tiramisu’.
S.Ducasse 46
A program!
| str | local variablestr := ‘Tiramisu’. assignment
S.Ducasse 47
A program!
| str | local variablestr := ‘Tiramisu’. assignmentstr at: str length
S.Ducasse 48
A program!
| str | local variablestr := ‘Tiramisu’. assignmentstr at: str length message send
> $u
S.Ducasse 49
double ‘ to get one
‘L’’Idiot’
> one string
S.Ducasse 50
For concatenation use ,
‘Calvin’ , ‘ & ‘, ‘Hobbes’
S.Ducasse 51
For concatenation use ,
‘Calvin’ , ‘ & ‘, ‘Hobbes’> ‘Calvin & Hobbes’
S.Ducasse 52
For concatenation use ,
‘Calvin’ , ‘ & ‘, ‘Hobbes’> ‘Calvin & Hobbes’
S.Ducasse 53
Symbols: #Pharo
#Something is a symbol
Symbol is a unique string in the system
#Something == #Something > true
S.Ducasse 54
“Comment”
“what a fun language lecture.I really liked the desserts”
S.Ducasse 55
#(Array)
#(‘Calvin’ ‘hates’ ‘Suzie’)
S.Ducasse 56
#(Array)
#(‘Calvin’ ‘hates’ ‘Suzie’) size
S.Ducasse 57
#(Array)
#(‘Calvin’ ‘hates’ ‘Suzie’) size> 3
S.Ducasse 58
First element starts at 1
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2
S.Ducasse 59
First element starts at 1
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2> ‘hates’
S.Ducasse 60
at: to access, at:put: to set
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2 put: ‘loves’
S.Ducasse 61
#(Array)
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2 put: ‘loves’
> #(‘Calvin’ ‘loves’ ‘Suzie’)
S.Ducasse 62
Syntax Summarycomment: “a comment”character: $c $h $a $r $a $c $t $e $r $s $# $@ string: ‘a nice string’ ‘lulu’ ‘l’’idiot’symbol: #mac #+ array: #(1 2 3 (1 3) $a 4)byte array: #[1 2 3]integer: 1, 2r101real: 1.5, 6.03e-34,4, 2.4e7fraction: 1/33boolean: true, falsepoint: 10@120
S.Ducasse 63
RoadmapFun with keywords-based messages
S.Ducasse 64
Keyword-based messages
arr at: 2 put: ‘loves’
S.Ducasse 65
Keyword-based messages
arr at: 2 put: ‘loves’
somehow like arr.atput(2,‘loves’)
S.Ducasse 66
From Java to Smalltalk
postman.send(mail,recipient);
S.Ducasse 67
Removing
postman.send(mail,recipient);
S.Ducasse 68
Removing unnecessary
postman send mail recipient
S.Ducasse 69
But without losing information
postman send mail to recipient
S.Ducasse 70
postman send: mail to: recipient
postman.send(mail,recipient);
S.Ducasse 71
postman send: mail to: recipient
The message is send:to:
postman.send(mail,recipient);
S.Ducasse 72
RoadmapFun with variables
S.Ducasse 73
Shared or Global starts with Uppercase
Transcript cr .Transcript show: ‘hello world’.Transcript cr .
S.Ducasse 74
local or temps starts with lowercase
| str |str := ‘Tiramisu’
S.Ducasse 75
self, super, true, false, nil
self = thissuper
true, false are for Booleans
nil is UndefinedObject instance
S.Ducasse 76
self, super, true, false, nil
self = this in Javasuper
true, false are for Booleans
nil is UndefinedObject instance
S.Ducasse 77
RoadmapFun with classes
S.Ducasse 78
A class definition!
Superclass subclass: #ClassinstanceVariableNames: 'a b c'
...category: 'Package name'
S.Ducasse 79
A class definition!
Object subclass: #PointinstanceVariableNames: 'x y'classVariableNames: ''poolDictionaries: ''category: 'Graphics-Primitives'
S.Ducasse 80
A class definition!
Object subclass: #PointinstanceVariableNames: 'x y'classVariableNames: ''poolDictionaries: ''category: 'Graphics-Primitives'
S.Ducasse 81
RoadmapFun with methods
S.Ducasse 82
On Integer
asComplex"Answer a Complex number that represents value of the the receiver."
^ Complex real: self imaginary: 0
S.Ducasse 83
On Boolean
xor: aBoolean "Exclusive OR. Answer true if the receiver is not equivalent to aBoolean."
^(self == aBoolean) not
S.Ducasse 84
Summary
self, supercan access instance variablescan define local variable | ... |Do not need to define argument types^ to return
S.Ducasse 85
RoadmapFun with unary messages
S.Ducasse 86
1 class
S.Ducasse 87
1 class> SmallInteger
S.Ducasse 88
false not
S.Ducasse 89
false not> true
S.Ducasse 90
Date today
S.Ducasse 91
Date today> 24 May 2009
S.Ducasse 92
Time now
S.Ducasse 93
Time now> 6:50:13 pm
S.Ducasse 94
Float pi
S.Ducasse 95
Float pi> 3.141592653589793
S.Ducasse 96
We sent messages to objects or classes!
1 classDate today
S.Ducasse 97
We sent messages to objects or classes!
1 classDate today
S.Ducasse 98
Fun with binary messages
Roadmap
S.Ducasse 99
aReceiver aSelector anArgument
Used for arithmetic, comparison and logical operationsOne or two characters taken from: + - / \ * ~ < > = @ % | & ! ? ,
S.Ducasse 100
1 + 2
S.Ducasse 101
1 + 2>3
S.Ducasse 102
2 => 3
S.Ducasse 103
2 => 3> false
S.Ducasse 104
10 @ 200
S.Ducasse 105
‘Black chocolate’ , ‘ is good’
S.Ducasse 106
RoadmapFun with keyword-based messages
S.Ducasse 107
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2 put: ‘loves’
S.Ducasse 108
#(‘Calvin’ ‘hates’ ‘Suzie’) at: 2 put: ‘loves’> #(‘Calvin’ ‘loves’ ‘Suzie’)
S.Ducasse 109
10@20 setX: 2
S.Ducasse 110
10@20 setX: 2> 2@20
S.Ducasse 111
12 between: 10 and: 20
S.Ducasse 112
12 between: 10 and: 20> true
S.Ducasse 113
receiver keyword1: argument1
keyword2: argument2
equivalent to receiver.keyword1keyword2(argument1, argument2)
S.Ducasse 114
receiver keyword1: argument1
keyword2: argument2
equivalent to receiver.keyword1keyword2(argument1, argument2)
S.Ducasse 115
Browser newOnClass: Point
Roadmap
S.Ducasse 116
Browser newOnClass: Point
S.Ducasse 117
Browser newOnClass: Point
S.Ducasse 118
Yes there is a difference between doing (side effect)and returning an object
S.Ducasse 119
Browser newOnClass: Point> a Browser
S.Ducasse 120
Doing and do not care of the returned result
Browser newOnClass: Point
S.Ducasse 121
Doing and really want to see the result!
10@20 setX: 2> 2@20
S.Ducasse 122
Doing vs printing (doing + print result)
S.Ducasse 123
Doing vs printing (doing + print result)
S.Ducasse 124
RoadmapMessages messagesmessagesagain messages....
S.Ducasse 125
Yes there are only messages unary binary keywords
S.Ducasse 126
Composition: from left to right!
69 class inspect
69 class superclass superclass inspect
S.Ducasse 127
Unary> Binary> Keywords
Precedence
S.Ducasse 128
2 + 3 squared
S.Ducasse 129
2 + 3 squared> 2 + 9
S.Ducasse 130
2 + 3 squared> 2 + 9> 11
S.Ducasse 131
Color gray - Color white = Color black
S.Ducasse 132
Color gray - Color white = Color black> aColor = Color black
S.Ducasse 133
Color gray - Color white = Color black> aColor = Color black> true
S.Ducasse 134
2 raisedTo: 3 + 2
S.Ducasse 135
2 raisedTo: 3 + 2> 2 raisedTo: 5
S.Ducasse 136
2 raisedTo: 3 + 2> 2 raisedTo: 5> 32
S.Ducasse 137
1/3 + 2/3
No mathematical precedence
S.Ducasse 138
1/3 + 2/3>7/3 /3
No mathematical precedence
S.Ducasse 139
Parenthesized takes precedence!
(Msg) > Unary> Binary> Keywords
S.Ducasse 140
(0@0 extent: 100@100) bottomRight
S.Ducasse 141
(0@0 extent: 100@100) bottomRight> (aPoint extent: anotherPoint) bottomRight
S.Ducasse 142
(0@0 extent: 100@100) bottomRight> (aPoint extent: anotherPoint) bottomRight> aRectangle bottomRight
S.Ducasse 143
(0@0 extent: 100@100) bottomRight> (aPoint extent: anotherPoint) bottomRight> aRectangle bottomRight> 100@100
S.Ducasse 144
0@0 extent: 100@100 bottomRight
S.Ducasse 145
0@0 extent: 100@100 bottomRight> Message not understood> 100 does not understand bottomRight
S.Ducasse 146
3 + 2 * 10
No mathematical precedence
S.Ducasse 147
3 + 2 * 10> 5 * 10
No mathematical precedence
S.Ducasse 148
3 + 2 * 10> 5 * 10> 50 argh!
No mathematical precedence
S.Ducasse 149
3 + (2 * 10)
No mathematical precedence
S.Ducasse 150
3 + (2 * 10)> 3 + 20
No mathematical precedence
S.Ducasse 151
3 + (2 * 10)> 3 + 20> 23
No mathematical precedence
S.Ducasse 152
1/3 + 2/3> 7/3 /3
No mathematical precedence
S.Ducasse 153
1/3 + 2/3> (7/3) /3> 7/9
No mathematical precedence
S.Ducasse 154
(1/3) + (2/3)
No mathematical precedence
S.Ducasse 155
(1/3) + (2/3)> 1
No mathematical precedence
S.Ducasse 156
(Msg) > Unary > Binary > Keywordsfrom left to rightNo mathematical precedence
Only Messages
S.Ducasse 157
(Msg) > Unary > Binary > Keywordsfrom left to rightNo mathematical precedence
Only Messages
S.Ducasse 158
RoadmapFun with blocks
S.Ducasse 159
Function definition
fct(x) = x * x + x
S.Ducasse 160
Function Application
fct (2) = 6fct (20) = 420
S.Ducasse 161
Function definition
fct(x) = x * x + x
|fct|fct:= [:x | x * x + x].
S.Ducasse 162
Function Application
fct (2) = 6fct (20) = 420
fct value: 2 > 6fct value: 20 > 420
S.Ducasse 163
Other examples
[2 + 3 + 4 + 5] value[:x | x + 3 + 4 + 5 ] value: 2[:x :y | x + y + 4 + 5] value: 2 value: 3
S.Ducasse 164
Block
anonymous method
[ :variable1 :variable2 | | tmp |expression1....variable1 ... ]
value: ...
S.Ducasse 165
Block
anonymous methodReally really cool!Can be passed to methods, stored in instance variables
[ :variable1 :variable2 | | tmp |expression1....variable1 ... ]
value: ...
S.Ducasse 166
RoadmapFun with conditional
S.Ducasse 167
Example
3 > 0 ifTrue:['positive'] ifFalse:['negative']
S.Ducasse 168
Example
3 > 0 ifTrue:['positive'] ifFalse:['negative']
> ‘positive’
S.Ducasse 169
Yes ifTrue:ifFalse: is a message!
Weather isRaining ifTrue: [self takeMyUmbrella] ifFalse: [self takeMySunglasses]
ifTrue:ifFalse is sent to an object: a boolean!
S.Ducasse 170
Booleans
& | notor: and: (lazy)xor:ifTrue:ifFalse:ifFalse:ifTrue:...
S.Ducasse 171
Yes! ifTrue:ifFalse: is a message send to a Boolean.
But optimized by the compiler :)
S.Ducasse 172
10 timesRepeat: [ Transcript show: 'hello'; cr]
S.Ducasse 173
10 timesRepeat: [ Transcript show: 'hello'; cr]
S.Ducasse 174
[x<y] whileTrue: [x := x + 3]
S.Ducasse 175
aBlockTest whileTrueaBlockTest whileFalseaBlockTest whileTrue: aBlockBodyaBlockTest whileFalse: aBlockBodyanInteger timesRepeat: aBlockBody
S.Ducasse 176
Confused with () and [] ?
S.Ducasse 177
Only put [ ] when you do not the number of times something may be executed
(x isBlue) ifTrue: [ x schroumph ]
10 timesRepeat: [ self shout ]
S.Ducasse 178
Conditions are messages sent to boolean
(x isBlue) ifTrue: [ ]
S.Ducasse 179
Fun with loops
Roadmap
S.Ducasse 180
1 to: 100 do: [ :i | Transcript show: i ; space]
S.Ducasse 181
1 to: 100 do: [ :i | Transcript show: i ; space]
S.Ducasse 182
1 to: 100 by: 3 do: [ :i | Transcript show: i ; space]
S.Ducasse 183
1 to: 100 by: 3 do: [ :i | Transcript show: i ; space]
S.Ducasse 184
So yes there are real loops in Smalltalk!
to:do: to:by:do:are just messages send to integers
S.Ducasse 185
So yes there are real loops in Smalltalk!
to:do: to:by:do:are just messages send to integers
S.Ducasse 186
RoadmapFun with iterators
S.Ducasse 187
ArrayList<String> strings = new ArrayList<String>(); for(Person person: persons) strings.add(person.name());
strings := persons collect [:person | person name].
S.Ducasse 188
#(2 -3 4 -35 4) collect: [ :each| each abs]
S.Ducasse 189
#(2 -3 4 -35 4) collect: [ :each| each abs]> #(2 3 4 35 4)
S.Ducasse 190
#(15 10 19 68) collect: [:i | i odd ]
S.Ducasse 191
#(15 10 19 68) collect: [:i | i odd ]> #(true false true false)
S.Ducasse 192
#(15 10 19 68) collect: [:i | i odd ]
We can also do it that way!
|result|aCol := #( 2 -3 4 -35 4).result := aCol species new: aCol size.1 to: aCollection size do:
[ :each | result at: each put: (aCol at: each) odd].result
S.Ducasse 193
#(15 10 19 68) do: [:i | Transcript show: i ; cr ]
S.Ducasse 194
#(15 10 19 68) do: [:i | Transcript show: i ; cr ]
S.Ducasse 195
#(1 2 3) with: #(10 20 30) do: [:x :y| Transcript show: (y ** x) ; cr ]
S.Ducasse 196
#(1 2 3) with: #(10 20 30) do: [:x :y| Transcript show: (y ** x) ; cr ]
S.Ducasse 197
How do: is implemented?
S.Ducasse 198
How do: is implemented?
SequenceableCollection>>do: aBlock "Evaluate aBlock with each of the receiver's elements as the argument."
1 to: self size do: [:i | aBlock value: (self at: i)]
S.Ducasse 199
Some others... friends
#(15 10 19 68) select: [:i|i odd]
#(15 10 19 68) reject: [:i|i odd]
#(12 10 19 68 21) detect: [:i|i odd]
#(12 10 12 68) detect: [:i|i odd] ifNone:[1]
S.Ducasse 200
Some others... friends
#(15 10 19 68) select: [:i|i odd] > #(15 19)
#(15 10 19 68) reject: [:i|i odd]
#(12 10 19 68 21) detect: [:i|i odd]
#(12 10 12 68) detect: [:i|i odd] ifNone:[1]
S.Ducasse 201
Some others... friends
#(15 10 19 68) select: [:i|i odd] > #(15 19)
#(15 10 19 68) reject: [:i|i odd] > #(10 68)
#(12 10 19 68 21) detect: [:i|i odd]
#(12 10 12 68) detect: [:i|i odd] ifNone:[1]
S.Ducasse 202
Some others... friends
#(15 10 19 68) select: [:i|i odd] > #(15 19)
#(15 10 19 68) reject: [:i|i odd] > #(10 68)
#(12 10 19 68 21) detect: [:i|i odd] > 19
#(12 10 12 68) detect: [:i|i odd] ifNone:[1]
S.Ducasse 203
Some others... friends
#(15 10 19 68) select: [:i|i odd] > #(15 19)
#(15 10 19 68) reject: [:i|i odd] > #(10 68)
#(12 10 19 68 21) detect: [:i|i odd] > 19
#(12 10 12 68) detect: [:i|i odd] ifNone:[1]> 1
S.Ducasse 204
Iterators are your best friends compact nice abstraction Just messages sent to collections
S.Ducasse 205
Iterators are your best friends compact nice abstraction Just messages sent to collections
S.Ducasse 206
A simple exercise
How do you define the method that does that?
#() -> ‘’ #(a) ->’a’ #(a b c) -> ‘a, b, c’
S.Ducasse 207
#(a b c)do: [:each | Transcript show: each printString]separatedBy: [Transcript show: ‘,’]
S.Ducasse 208
#(a b c)do: [:each | Transcript show: each printString]separatedBy: [Transcript show: ‘,’]
S.Ducasse 209
S.Ducasse 210
Messages Sequencemessage1 .message2 .message3
. is a separator, not a terminator
| macNode pcNode node1 printerNode |macNode := Workstation withName: #mac.Transcript cr.Transcript show: 1 printString.Transcript cr.Transcript show: 2 printString
S.Ducasse 211
Multiple messages to an objects ;
To send multiple messages to the same object
Transcript show: 1 printString.
Transcript cr
is equivalent to:
Transcript show: 1 printString ; cr
S.Ducasse 212
Hints ...
x isNil ifTrue: [...]
x includes: 3 ifTrue: [...]
is read as the message includes:ifTrue:
(x includes: 3) ifTrue: [...]
S.Ducasse 213
S.Ducasse 214
Smalltalk is funPure simple powerful
www.seaside.st(www.dabbledb.com)www.pharo-project.org