Stéphane Ducasse 1 Syntax and Messages.

Slides:



Advertisements
Similar presentations
Data Types in Java Data is the information that a program has to work with. Data is of different types. The type of a piece of data tells Java what can.
Advertisements

11. A bit of Smalltalk. © O. Nierstrasz P2 — A bit of Smalltalk 11.2 A bit of Smalltalk Overview  Some history  Smalltalk syntax & object model  The.
Principles of Object-Oriented Software Development The language Smalltalk.
10-Jun-15 Just Enough Java. Variables A variable is a “box” that holds data Every variable has a name Examples: name, age, address, isMarried Variables.
Introduction to Programming with Java, for Beginners Primitive Types Expressions Statements Variables Strings.
2. Smalltalk Basics. © Oscar Nierstrasz ST — Smalltalk Basics 2.2 Roadmap  Everything is an Object  Syntax on a Postcard  Three Kinds of Messages 
Stéphane Ducasse9.1 Inheritance Semantics and Lookup.
Stéphane Ducasse8.1 Syntax and Messages The syntax of Smalltalk is simple and uniform, but it can look strange at first sight! Literals: numbers, strings,
Introduction to Computers and Programming Lecture 4: Mathematical Operators New York University.
Stéphane Ducasse 1 The Taste of Smalltalk.
13. A bit of Smalltalk. © Oscar Nierstrasz 2 Roadmap  The origins of Smalltalk  What is Smalltalk?  Syntax in a nutshell  Seaside — web development.
PZ06BX Programming Language design and Implementation -4th Edition Copyright©Prentice Hall, PZ06BX - Introduction to Smalltalk Programming Language.
2. Smalltalk Basics. © Oscar Nierstrasz ST — Smalltalk Basics 2.2 Roadmap  Everything is an Object  Syntax on a Postcard  Three Kinds of Messages 
Some Basic Points on Classes
S.Ducasse Stéphane Ducasse 1 A Taste of Smalltalk.
Stéphane Ducasse 1 Objects to the Roots: Learning from beauty.
Squeak Collections The Squeak collection hierarchy. Some collection operators. Working with collections. For-loops.
JavaScript, Third Edition
Object-oriented programming and design 1 Smalltalk in a Nutshell Objects & classes Messages & methods Inheritance & metaclasses.
3. Standard Classes. © Oscar Nierstrasz ST — Standard Classes 3.2 Roadmap  Object  Numbers, Characters, Strings and Arrays  Variables  Blocks and.
3. Standard Classes. Birds-eye view © Oscar Nierstrasz ST — Introduction 1.2 Reify everything — by reifying its entire implementation model, Smalltalk.
Stéphane Ducasse5.1 Smalltalk in a Nutshell OO Model in a Nutshell Syntax in a Nutshell.
12. A bit of Smalltalk. © O. Nierstrasz P2 — A bit of Smalltalk 11.2 Roadmap  Some history  Smalltalk syntax & object model  The Smalltalk environment.
Stéphane Ducasse 1 Smalltalk in a Nutshell.
Stéphane Ducasse4.1 A Taste of Smalltalk Two examples: –‘hello world’ –A Tomagoshi To give you an idea of: –the syntax –the elementary objects and classes.
Stéphane Ducasse«ChapterNr».1 Basic Objects, Conditionals and Loops Booleans Basic Loops Overview of the Collection hierarchy— more than 80 classes: (Bag,
S.Ducasse Stéphane Ducasse 1 The Taste of Smalltalk.
Programming Concepts MIT - AITI. Variables l A variable is a name associated with a piece of data l Variables allow you to store and manipulate data in.
CIS Computer Programming Logic
General Features of Java Programming Language Variables and Data Types Operators Expressions Control Flow Statements.
3E-1 Collections in Squeak What are they? Kinds of collections. Basic Operations. Usage of Inheritance in the Collections Library. Roman numbers example.
CS 598 Scripting Languages Design and Implementation 7. Smalltalk 80.
20-753: Fundamentals of Web Programming 1 Lecture 12: Javascript I Fundamentals of Web Programming Lecture 12: Introduction to Javascript.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
Property of Jack Wilson, Cerritos College1 CIS Computer Programming Logic Programming Concepts Overview prepared by Jack Wilson Cerritos College.
Smalltalk (and Squeak) Aida Dungan and Rick Shreve.
Chapter 2 Using Objects. Types A type defines a set of values and the operations that can be carried out on the values Examples: 13 has type int "Hello,
S.Ducasse Stéphane Ducasse savoie.fr e/ e/ 1 Inheritance Semantics and Method Lookup.
Basic Java Syntax COMP 401, Spring 2014 Lecture 2 1/14/2014.
VARIABLES, CONSTANTS, OPERATORS ANS EXPRESSION
Python Primer 1: Types and Operators © 2013 Goodrich, Tamassia, Goldwasser1Python Primer.
8-1 Compilers Compiler A program that translates a high-level language program into machine code High-level languages provide a richer set of instructions.
S.Ducasse Stéphane Ducasse 1 Common Mistakes and Debugging in VW.
Java Nuts and Bolts Variables and Data Types Operators Expressions Control Flow Statements Arrays and Strings.
CSI 3125, Preliminaries, page 1 Data Type, Variables.
Stéphane Ducasse 1 Some Advanced Points on Classes.
3C-1 Identifiers Variables Literal Objects  Numbers  Characters  Strings Control Structure  Blocks  Conditionals  Loops Messages Defining New Classes.
Stéphane Ducasse7.1 Let’s Play Objects Simulate a LAN physically Set up a context for –future chapters –Exercises Some forward references to intriguate.
CHAPTER 2 PROBLEM SOLVING USING C++ 1 C++ Programming PEG200/Saidatul Rahah.
3. Standard Classes. © Oscar Nierstrasz ST — Standard Classes 3.2 Roadmap  Object  Numbers, Characters, Strings and Arrays  Variables  Blocks and.
Stéphane Ducasse 1 Some Points on Classes.
S.Ducasse Stéphane Ducasse 1 Smalltalk in a Nutshell.
S.Ducasse Stéphane Ducasse savoie.fr e/ e/ 1 Smalltalk in a Nutshell.
Basic Scripting & Variables Yasar Hussain Malik - NISTE.
CSE 3302 Programming Languages Chengkai Li Fall 2007 Smalltalk Lecture 14 – Smalltalk, Fall CSE3302 Programming Languages, UT-Arlington ©Chengkai.
Stéphane Ducasse 1 A Little Journey in the Smalltalk Syntax.
Stéphane Ducasse 1 Abstract Classes.
S.Ducasse Stéphane Ducasse 1 Some Advanced Points on Classes.
Introduction C# program is collection of classes Classes are collection of methods and some statements That statements contains tokens C# includes five.
Today… Continue Building Expressions: –Literals –Constants –Casting –Array Declaration –Operators and Operator Precedence –Keywords Winter 2016CMPE212.
S.Ducasse 1 Instance Initialization How to ensure that an instance is well initialized? Automatic initialize Lazy initialization Proposing the right interface.
Let’s Play Objects.
7.1 What Is An Object Object-oriented program - Description or simulation of application Object-oriented programming is done by adopting or extending an.
Java Primer 1: Types, Classes and Operators
Documentation Need to have documentation in all programs
Smalltalk – a Pure (and first) OOPL
Introduction to Smalltalk
Just Enough Java 17-May-19.
CSE 3302 Programming Languages
Smalltalk on a Dime.
Presentation transcript:

Stéphane Ducasse 1 Syntax and Messages

S.Ducasse 2 Outline Literals: numbers, strings, arrays.... Variable, assignments, returns Pseudo-variables Message Expressions Block expressions Conditional and Loops

S.Ducasse 3 Originally Made for Kids Read it as a non-computer-literate person: | bunny | bunny := Actor fromFile: ‘bunny.vrml’. bunny head doEachFrame: [ bunny head pointAt: (camera transformScreenPointToScenePoint: (Sensor mousePoint) using: bunny) duration: camera rightNow ]

S.Ducasse 4 Numbers SmallInteger, Integer, – 4, 2r100 (4 in base 2),3r11 (4 in base 3), 1232 Automatic coercion – > 3.3 – 1 class -> SmallInteger – 1 class maxVal class -> SmallInteger – (1 class maxVal + 1) class -> LargeInteger Fraction, Float, Double – 3/4, 2.4e7, 0.75d – (1/3) + (2/3) -> 1 – 1000 factorial / 999 factorial -> 1000 – 2/ > (5/3)

S.Ducasse 5 Characters Characters: – $F, $Q $U $E $N $T $i $N Unprintable characters: – Character space, Character tab, Character cr

S.Ducasse 6 Strings Strings: – #mac asString -> 'mac' – 12 printString -> '12' – 'This packet travelled around to the printer' 'l''idiot' – String with: $A – Collection of characters – ‘lulu’ at: 1 -> $l To introduce a single quote inside a string, just double it.

S.Ducasse 7 Symbols Symbols: – #class #mac #at:put: #+ #accept: Kinds of String Unique in the system (see after)

S.Ducasse 8 Symbols vs. Strings Symbols are used as method selectors, unique keys for dictionaries A symbol is a read-only object, strings are mutable objects A symbol is unique, strings are not #calvin == #calvin PrIt-> true ‘calvin’ == ‘calvin’ PrIt-> false #calvin, #zeBest PrIt-> 'calvinzeBest' Symbols are good candidates for identity based dictionaries (IdentityDictionary) Hint: Comparing strings is slower then comparing symbols by a factor of 5 to 10. However, converting a string to a symbol is more than 100 times more expensive.

S.Ducasse 9 Comments and Tips "This is a comment" A comment can span several lines. Moreover, avoid putting a space between the “ and the first character. When there is no space, the system helps you to select a commented expression. You just go after the “ character and double click on it: the entire commented expression is selected. After that you can printIt or doIt, etc.

S.Ducasse 10 Arrays #(1 2 3) #('lulu' (1 2 3)) -> #('lulu' #(1 2 3)) #(mac node1 pc node2 node3 lpr) an array of symbols. When one prints it it shows #(#mac #node1 #pc #node2 #node3 #lpr) in VW Byte Array #[ ]

S.Ducasse 11 Arrays Heterogenous #('lulu' (1 2 3)) PrIt-> #('lulu' #(1 2 3)) #('lulu' ) PrIt-> #('lulu' ) An array of symbols: #(calvin hobbes suzie) PrIt-> #(#calvin #hobbes #suzie) An array of strings: #('calvin' 'hobbes' 'suzie') PrIt-> #('calvin' 'hobbes' 'suzie')

S.Ducasse 12 Syntax Summary comment:“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, 2r101 real: 1.5, 6.03e-34,4, 2.4e7 float: 1/33 boolean: true, false point: Note is not an element of the syntax, but just a message sent to a number. This is the same for /, bitShift, ifTrue:, do:...

S.Ducasse 13 Roadmap Literals: numbers, strings, arrays.... Variable, assignments, returns Pseudo-variables Message Expressions Block expressions Conditional and Loops

S.Ducasse 14 Variables Maintains a reference to an object Dynamically typed and can reference different types of objects Shared (starting with uppercase) or local/private (starting with lowercase)

S.Ducasse 15 Temporary Variables To hold temporary values during evaluation (method execution or sequence of instructions) Can be accessed by the expressions composing the method body. – | mac1 pc node1 printer mac2 packet |

S.Ducasse 16 Temporary Variable Good Style Avoid using the same name for a temporary variable and a method argument, an instance variable or another temporary variable or block temporary. Your code will be more portable. Do not write: aClass>>printOn: aStream |aStream|... Instead, write: aClass>>printOn: aStream |anotherStream|... Hint: Avoid using the same temporary variable for referencing two different objects

S.Ducasse 17 Assignments An assignment is not done by message passing. It is one of the few syntactic elements of Smalltalk. variable := aValue three := 3 raisedTo: 1 Avoid using var := var2 := var3 To not try to know in which order the expressions is evaluated. You will write good code

S.Ducasse 18 Pointing to the Same Object In Smalltalk, objects are manipulated via implicit pointers: everything is a pointer. Take care when different variables point to the same object: p1 := p2 := p1. p1 x: 100 p1 -> p2 ->

S.Ducasse 19 Method Arguments Can be accessed by the expressions composing the method. Exist during the execution of the defining method. Method Name Example: accept: aPacket In C++ or Java: void Printer::accept(aPacket Packet)

S.Ducasse 20 Arguments are read-only Method arguments cannot change their value within the method body. Invalid Example, assuming contents is an instance variable: MyClass>>contents: aString aString := aString, 'From Lpr'. Valid Example MyClass>>contents: aString | addressee | addressee := aString, 'From Lpr'

S.Ducasse 21 Method Return Use ^ expression to return the value of expression from a method Rectangle>>area ^ width * height By default self is returned

S.Ducasse 22 Instance Variables Private to a particular instance (not to all the instances of a class like in C++). Can be accessed by all the methods of the defining class and its subclasses. Has the same lifetime as the object. Declaration Object subclass: #Node instanceVariableNames: 'name nextNode '...

S.Ducasse 23 Instance Variables Scope: all the methods of the class Node>>setName: aSymbol nextNode: aNode name := aSymbol. nextNode := aNode But preferably accessed using accessor methods Node>>name ^name

S.Ducasse 24 Global Variables Always Capitalized (convention) – MyGlobalPi := If it is unknown, Smalltalk will ask you if you want to create a new global – Smalltalk at: #MyGlobalPi put: 3.14 – MyGlobalPi PrIt-> 3.14 – Smalltalk at: #MyGlobalPi PrIt-> 3.14 Stored in the default environment: Smalltalk in Squeak, VW has namespaces Design Hints: Accessible from everywhere, but it is not a good idea to use them

S.Ducasse 25 Roadmap Literals: numbers, strings, arrays.... Variable, assignments, returns Pseudo-variables Message Expressions Block expressions Conditional and Loops

S.Ducasse 26 Six Pseudo-Variables Smalltalk expressions can contain true, false, nil, self, super thisContext, but cannot change their values. They are hardwired into the compiler. nil nothing, the value for the uninitialized variables. Unique instance of the class UndefinedObject

S.Ducasse 27 Six Pseudo-Variables true unique instance of the class True false unique instance of the class False Hint: Don’t use False instead of false. false is the boolean value, False the class representing it. So, the first produces an error, the second not: False ifFalse: [Transcript show: ‘False’] -> error false ifFalse: [Transcript show: ‘False’]

S.Ducasse 28 self, super, and thisContext Only make sense in a method body self refers to the receiver of a message. super refers also to the receiver of the message but its semantics affects the lookup of the method. It starts the lookup in the superclass of the class of the method containing the super. thisContext refers to the instance of MethodContext that represents the context of a method (receiver, sender, method, pc, stack). Specific to VisualWorks and to Squeak

S.Ducasse 29 self and super examples PrinterServer>>accept: thePacket "If the packet is addressed to me, print it. Otherwise behave normally." (thePacket isAddressedTo: self) ifTrue: [self print: thePacket] ifFalse: [super accept: thePacket]

S.Ducasse 30 thisContext Example: #haltIf: How supporting halt in methods that are called often (e.g., OrderedCollection>>add:) Idea: only halt if called from a method with a certain name Object>>haltIf: aSelector | cntxt | cntxt := thisContext. [cntxt sender isNil] whileFalse: [ cntxt := cntxt sender. (cntxt selector = aSelector) ifTrue: [ Halt signal ].

S.Ducasse 31 Roadmap Literals: numbers, strings, arrays.... Variable names Pseudo-variables Assignments, returns Message Expressions Block expressions Conditional and Loops

S.Ducasse 32 Objects and Messages Objects communicate by sending message Objects react to messages by executing methods Bot new go: A message is composed of: a receiver, always evaluated (Bot new) a selector, never evaluated #go: and a list possibly empty of arguments that are all evaluated ( ) The receiver is linked with self in a method body.

S.Ducasse 33 Three Kinds of Messages Unary Messages 2.4 inspect macNode name Binary Messages > 3 (1 + 2) * (2 + 3) PrIt-> 15 3 * 5 PrIt-> 15 Keyword Messages 6 gcd: 24 PrIt-> 6 pcNode nextNode: node2 Turtle new go: 30 color: Color blue

S.Ducasse 34 Unary Messages aReceiver aSelector node3 nextNode -> printerNode node3 name -> #node3 1 class -> SmallInteger false not -> true Date today -> Date today September 19, 1997 Time now -> 1:22:20 pm Float pi -> d

S.Ducasse 35 Binary Messages aReceiver aSelector anArgument Used for arithmetic, comparison and logical operations One or two characters taken from: – + - / \ * ~ % | & ! ?, >= 3 'the', 'best’ Restriction: second character is never $-

S.Ducasse 36 Simplicity has a Price no mathematical precedence so take care * 10 -> (2 * 10) -> 23 (1/3) + (2/3) and not 1/3 + 2/3

S.Ducasse 37 Keyword Messages receiver keyword1: argument1 keyword2: argument2 1 between: 0 and: 5 dict at: #blop put: 8+3 In C-like languages it would be: receiver.keyword1keyword2(argument1, argument2)

S.Ducasse 38 Keyword Messages Workstation withName: #Mac2 mac nextNode: node1 Packet send: 'This packet travelled around to' to: #lw100 setX: 3 #(1 2 3) at: 2 put: 25 1 to: 10 -> (1 to: 10) anInterval Browser newOnClass: Point Interval from:1 to: 20 PrIt-> (1 to: 20) 12 between: 10 and: 20 PrIt-> true x > 0 ifTrue:['positive'] ifFalse:['negative' ]

S.Ducasse 39 Composition Rules Unary-Msg > Binary-Msg > Keywords-Msg at same level, from the left to the right squared -> 11 2 raisedTo: > 32 #(1 2 3) at: 1+1 put: * 3 -> #(1 36 3) 2 raisedTo: (2 raisedTo: (3+2)) -> 32

S.Ducasse 40 Composition Rules (Msg) > Unary-Msg > Binary-Msg > Keywords-Msg 69 class inspect extent: bottomRight

S.Ducasse 41 Hints... Use () when two keyword-based messages occur within a single expression, otherwise the precedence order is fine. x isNil ifTrue: [...] isNil is an unary message, so it is evaluated prior to ifTrue: x includes: 3 ifTrue: [...] is read as the message includes:ifTrue: (x includes: 3) ifTrue: [...] We use () to disambiguate them

S.Ducasse 42 Sequence message1. 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 43 For the Lazy: the Cascade receiver selector1; selector2;... To send multiple messages to the same object Transcript show: 1 printString. Transcript cr is equivalent to: Transcript show: 1 printString ; cr

S.Ducasse 44 Syntax Summary assigment: var := aValue unary message: receiver selector binary message: receiver selector argument keyword based: receiver keyword1: arg1 keyword2: arg2... cascade: message ; selector... separator: message. message result: ^ parenthesis: (...)

S.Ducasse 45 Roadmap Literals: numbers, strings, arrays.... Variable, assignments, returns Pseudo-variables Message Expressions Block expressions Conditional and Loops

S.Ducasse 46 Blocks anonymous methods deferred block of code fct(x) = x ^ 2 + x fct (2) = 6 fct (20) = 420 |fct| fct:= [:x | x * x + x]. fct value: 2 PrIt-> 6 fct value: 20 PrIt-> 420 fct PrIt-> aBlockClosure

S.Ducasse 47 Blocks Continued [ :variable1 :variable2 | | blockTemporary1 blockTemporary2 | expression1....variable1...] Two blocks without arguments and temporary variables PrinterServer>>accept: thePacket (thePacket isAddressedTo: self) ifTrue: [self print: thePacket] ifFalse: [super accept: thePacket]

S.Ducasse 48 Block Evaluation [....] value or value: (for one arg) or value:value: (for two args) or value:value:value:… or valueWithArguments: anArray [ ] value [:x | x ] value: 2 [:x :y | x + y ] value: 2 value: 3 [:x :y :z | x + y + z + 5] value: 2 value: 3 value: 4 [:x :y :z :w | x + y + z + w] value: 2 value: 3 value: 4 value: 5

S.Ducasse 49 Block The value of a block is the value of its last statement, except if there is an explicit return ^ Blocks are first class objects. They are created, passed as argument, stored into variables...

S.Ducasse 50 Blocks - Continued |index bloc | index := 0. bloc := [index := index +1]. index := 3. bloc value -> 4 Integer>>factorial "Answer the factorial of the receiver. Fail if the receiver is less than 0." | tmp |.... tmp := 1. 2 to: self do: [:i | tmp := tmp * i]. ^tmp

S.Ducasse 51 Literals: numbers, strings, arrays.... Variable, assignments, returns Pseudo-variables Message Expressions Block expressions Conditional and Loops

S.Ducasse 52 Yes ifTrue: is sent to a boolean Weather isRaining ifTrue: [self takeMyUmbrella] ifFalse: [self takeMySunglasses] ifTrue:ifFalse is sent to an object: a boolean!

S.Ducasse 53 Conditional: messages to booleans aBoolean ifTrue: aTrueBlock ifFalse: aFalseBlock aBoolean ifFalse: aFalseBlock ifTrue: aTrueBlock aBoolean ifTrue: aTrueBlock aBoolean ifFalse: aFalseBlock (thePacket isAddressedTo: self) ifTrue: [self print: thePacket] ifFalse: [super accept: thePacket] Hint: Take care — true is the boolean value and True is the class of true, its unique instance!

S.Ducasse 54 Boolean Messages Logical Comparisons: &, |, xor:, not aBooleanExpr comparison aBooleanExpr (1 isZero) & false Date today isRaining not Uniform, but optimized and inlined (macro expansion at compile time) aBooleanExpression and: orBlock orBlock will only be evaluated if aBooleanExpression is true false and: [1 error: 'crazy'] PrIt -> false and not an error

S.Ducasse 55 Yes a collection is iterating on itself #( ) do: [:each | Transcript show: each abs printString ;cr ] > 1 > 2 > 4 > 86 Yes we ask the collection object to perform the loop on itself

S.Ducasse 56 Some Basic Loops aBlockTest whileTrue aBlockTest whileFalse aBlockTest whileTrue: aBlockBody aBlockTest whileFalse: aBlockBody anInteger timesRepeat: aBlockBody [x<y] whileTrue: [x := x + 3] 10 timesRepeat: [ Transcript show: 'hello'; cr]

S.Ducasse 57 For the Curious... (VW) BlockClosure>>whileTrue: aBlock ^ self value ifTrue:[ aBlock value. self whileTrue: aBlock ] BlockClosure>>whileTrue ^ [ self value ] whileTrue:[]

S.Ducasse 58 For the Curious… Integer>>timesRepeat: aBlock "Evaluate the argument, aBlock, the number of times represented by the receiver." | count | count := 1. [count <= self] whileTrue: [aBlock value. count := count + 1]

S.Ducasse 59 Choose your Camp! To get all the absolute values of numbers you could write: |result| aCol := #( ). result := aCol species new: aCol size. 1 to: aCollection size do: [ :each | result at: each put: (aCol at: each) abs]. result

S.Ducasse 60 Choose your Camp!! You could also write: #( ) collect: [ :each | each abs ] Really important: Contrary to the first solution, the second solution works well for indexable collections and also for sets.

S.Ducasse 61 Iteration Abstraction: do:/collect: aCollection do: aOneParameterBlock aCollection collect: aOneParameterBlock aCollection with: anotherCollection do: aBinaryBlock #( ) do: [:i | Transcript show: i printString ; cr ] #( ) collect: [:i | i odd ] PrIt-> #(true false true false) #(1 2 3) with: #( ) do: [:x :y| Transcript show: (y ** x) printString ; cr ]

S.Ducasse 62 Opening the Box Iterators are messages sent to collection objects Collection is responsible of its traversal 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 63 select:/reject:/detect: aCollection select: aPredicateBlock aCollection reject: aPredicateBlock aCollection detect: aOneParameterPredicateBlock aCollection detect: aOneParameterPredicateBlock ifNone: aNoneBlock #( ) select: [:i|i odd] -> (15 19) #( ) reject: [:i|i odd] -> (10 68) #( ) detect: [:i|i odd] PrIt-> 19 #( ) detect: [:i|i odd] ifNone:[1] PrIt-> 1

S.Ducasse 64 inject:into: aCollection inject: aStartValue into: aBinaryBlock | acc | acc := 0. #( ) do: [:element | acc := acc + element]. acc -> 15 Is equivalent to #( ) inject: 0 into: [:acc :element| acc + element] -> 15 Do not use it if the resulting code is not crystal clear!

S.Ducasse 65 Other Collection Methods aCollection includes: anElement aCollection size aCollection isEmpty aCollection contains: aBooleanBlock #( ) includes: 4 -> true #( ) size -> 5 #( ) isEmpty -> false #( ) contains: [:each | each isOdd] -> true

S.Ducasse 66 [] when you don’t know times (x isZero) ifTrue: [...] [x<y] whileTrue: [x := x + 3]

S.Ducasse 67 What we saw Numbers (integer, real, float…), Character $a, String ‘abc’, Symbols (unique Strings) #jkk, Arrays (potentially not homogenous) #(a #(1 2 3), Array with: 2+3 Variables: – Lowercase => private – Instance variables (visible in by all methods), method arguments (read-only), local variable |a| – Uppercase => global Pseudo Var: true, false, nil, self, super – self = **always** represents the msg receiver – nil = undefined value

S.Ducasse 68 What we saw Three kinds of messages – Unary: Node new – Binary: 1 + 2, – Keywords: aTomagoshi eat: #cooky furiously: true (Msg) > unary > binary > keywords Same Level from left to right Block – Functions fct(x)= x*x+3, fct(2). fct :=[:x| x * x + 3]. fct value: 2 – Anonymous method – Passed as method argument: factorial tmp:= 1. 2 to: self do: [:i| tmp := tmp * i]