8 - oop - smalltalk syntax

Post on 23-Dec-2014

547 Views

Category:

Education

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Stéphane Ducasse 1

Stéphane Ducassestephane.ducasse@inria.frhttp://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

top related