|
@@ -1,958 +0,0 @@
|
|
-Widget subclass: #TrySmalltalkWidget
|
|
|
|
- instanceVariableNames: 'workspace contents header'
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-
|
|
|
|
-!TrySmalltalkWidget methodsFor: 'accessing'!
|
|
|
|
-
|
|
|
|
-workspace
|
|
|
|
- ^ workspace ifNil: [
|
|
|
|
- workspace := SourceArea new]
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-contents: aString
|
|
|
|
- self workspace val: aString
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-contents
|
|
|
|
- ^self workspace val
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-setTitle: aString
|
|
|
|
- header contents: [:html | html with: aString]
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!TrySmalltalkWidget methodsFor: 'rendering'!
|
|
|
|
-
|
|
|
|
-renderOn: html
|
|
|
|
- html div
|
|
|
|
- class: 'profStef';
|
|
|
|
- with: [header := html h2];
|
|
|
|
- with: [self workspace renderOn: html];
|
|
|
|
- with: [self renderButtonsOn: html].
|
|
|
|
- ProfStef default
|
|
|
|
- widget: self;
|
|
|
|
- showCurrentLesson
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-renderButtonsOn: html
|
|
|
|
- html button
|
|
|
|
- with: 'DoIt';
|
|
|
|
- title: 'ctrl+d';
|
|
|
|
- onClick: [self workspace doIt].
|
|
|
|
- html button
|
|
|
|
- with: 'PrintIt';
|
|
|
|
- title: 'ctrl+p';
|
|
|
|
- onClick: [self workspace printIt].
|
|
|
|
- html button
|
|
|
|
- with: 'InspectIt';
|
|
|
|
- title: 'ctrl+i';
|
|
|
|
- onClick: [self workspace inspectIt]
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-Object subclass: #AbstractTutorial
|
|
|
|
- instanceVariableNames: ''
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-!AbstractTutorial commentStamp!
|
|
|
|
-Parent class of all ProfStef tutorials.
|
|
|
|
-
|
|
|
|
-To create your own tutorial:
|
|
|
|
-- subclass AbstractTutorial
|
|
|
|
-- implement a few methods which returns a Lesson instance
|
|
|
|
-- implement tutorial which returns a Collection of selectors to the methods you've created.!
|
|
|
|
-
|
|
|
|
-!AbstractTutorial methodsFor: 'accessing'!
|
|
|
|
-
|
|
|
|
-indexOfLesson: aSelector
|
|
|
|
- ^self tableOfContents indexOf: aSelector.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tableOfContents
|
|
|
|
-^ #(
|
|
|
|
- 'welcome'
|
|
|
|
- 'testLesson'
|
|
|
|
- 'theEnd'
|
|
|
|
-)
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-lessonAt: anInteger
|
|
|
|
- | lessonSelector |
|
|
|
|
- lessonSelector := self tableOfContents at: anInteger.
|
|
|
|
- ^ self perform: lessonSelector.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-size
|
|
|
|
- ^ self tableOfContents size
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!AbstractTutorial methodsFor: 'pages'!
|
|
|
|
-
|
|
|
|
-welcome
|
|
|
|
- ^ Lesson
|
|
|
|
- title: 'Welcome'
|
|
|
|
- contents: '"Hi, this is a test tutorial."'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-testLesson
|
|
|
|
- ^ Lesson
|
|
|
|
- title: 'Test Lesson'
|
|
|
|
- contents: '"This lesson is a test"'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-theEnd
|
|
|
|
- ^ Lesson
|
|
|
|
- title: 'The End'
|
|
|
|
- contents: '"And that''d be pretty much it :)"'
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-Object subclass: #Lesson
|
|
|
|
- instanceVariableNames: 'title contents'
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-
|
|
|
|
-!Lesson methodsFor: 'accessing'!
|
|
|
|
-
|
|
|
|
-contents
|
|
|
|
- ^ contents ifNil: [contents := '']
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-contents: aString
|
|
|
|
- contents := aString
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-title: aString
|
|
|
|
- title := aString
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-title
|
|
|
|
- ^ title ifNil: [title := '']
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!Lesson class methodsFor: 'instance creation'!
|
|
|
|
-
|
|
|
|
-title: aTitle contents: someContents
|
|
|
|
- ^ (self new)
|
|
|
|
- title: aTitle;
|
|
|
|
- contents: someContents
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-Object subclass: #TutorialPlayer
|
|
|
|
- instanceVariableNames: 'tutorialPosition tutorial'
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-!TutorialPlayer commentStamp!
|
|
|
|
-I can navigate through an AbstractTutorial subclass. With #next and #previous you can go forward and backward through the tutorial.!
|
|
|
|
-
|
|
|
|
-!TutorialPlayer methodsFor: 'accessing'!
|
|
|
|
-
|
|
|
|
-currentLesson
|
|
|
|
- ^ self tutorial lessonAt: self tutorialPosition.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-size
|
|
|
|
- ^ self tutorial size
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorial
|
|
|
|
- ^ tutorial ifNil: [tutorial := SmalltalkSyntaxTutorial new]
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorial: aTutorial
|
|
|
|
- tutorial := aTutorial
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorialPosition
|
|
|
|
- ^ tutorialPosition ifNil: [
|
|
|
|
- self rewind.
|
|
|
|
- tutorialPosition.
|
|
|
|
- ].
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorialPosition: aTutorialPosition
|
|
|
|
- tutorialPosition := aTutorialPosition
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!TutorialPlayer methodsFor: 'navigation'!
|
|
|
|
-
|
|
|
|
-first
|
|
|
|
- self rewind.
|
|
|
|
- ^ self currentLesson
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-last
|
|
|
|
- tutorialPosition := self size.
|
|
|
|
- ^ self currentLesson
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-next
|
|
|
|
- self tutorialPosition < self size
|
|
|
|
- ifTrue: [tutorialPosition := tutorialPosition + 1].
|
|
|
|
- ^ self currentLesson
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-previous
|
|
|
|
- tutorialPosition > 1 ifTrue: [tutorialPosition := tutorialPosition - 1].
|
|
|
|
- ^ self currentLesson
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-rewind
|
|
|
|
- tutorialPosition := 1.
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-Object subclass: #ProfStef
|
|
|
|
- instanceVariableNames: 'tutorialPlayer widget'
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-!ProfStef commentStamp!
|
|
|
|
-A ProfStef is the Smalltalk teacher. To start the tutorial, evaluate:
|
|
|
|
-ProfStef go.
|
|
|
|
-
|
|
|
|
-To go to the next lesson evaluate:
|
|
|
|
-ProfStef next.
|
|
|
|
-
|
|
|
|
-To execute your own tutorial:
|
|
|
|
-ProfStef goOn: MyOwnTutorial
|
|
|
|
-
|
|
|
|
-To see a table of contents with all defined tutorials:
|
|
|
|
-ProfStef contents!
|
|
|
|
-
|
|
|
|
-!ProfStef methodsFor: 'accessing'!
|
|
|
|
-
|
|
|
|
-tutorialPlayer
|
|
|
|
- ^ tutorialPlayer ifNil: [tutorialPlayer := TutorialPlayer new]
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-progress
|
|
|
|
- ^ '(', self tutorialPositionString, '/', self tutorialSizeString, ')'.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorialPositionString
|
|
|
|
- ^ self tutorialPlayer tutorialPosition asString.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-tutorialSizeString
|
|
|
|
- ^ self tutorialPlayer size asString
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-widget: aWidget
|
|
|
|
- widget := aWidget
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-showCurrentLesson
|
|
|
|
- | lesson |
|
|
|
|
- lesson := self tutorialPlayer currentLesson.
|
|
|
|
- widget contents: lesson contents.
|
|
|
|
- widget setTitle: lesson title , ' ' , self progress.
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!ProfStef methodsFor: 'navigation'!
|
|
|
|
-
|
|
|
|
-first
|
|
|
|
- self tutorialPlayer first.
|
|
|
|
- ^ self showCurrentLesson.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-next
|
|
|
|
- self tutorialPlayer next.
|
|
|
|
- ^ self showCurrentLesson.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-previous
|
|
|
|
- self tutorialPlayer previous.
|
|
|
|
- ^ self showCurrentLesson.
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-ProfStef class instanceVariableNames: 'instance'!
|
|
|
|
-
|
|
|
|
-!ProfStef class methodsFor: 'initialize'!
|
|
|
|
-
|
|
|
|
-default
|
|
|
|
- ^ instance ifNil: [instance := self new]
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!ProfStef class methodsFor: 'navigation'!
|
|
|
|
-
|
|
|
|
-first
|
|
|
|
- ^ self default first.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-previous
|
|
|
|
- ^ self default previous.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-next
|
|
|
|
- ^ self default next.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-go
|
|
|
|
- self first.
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-AbstractTutorial subclass: #SmalltalkSyntaxTutorial
|
|
|
|
- instanceVariableNames: ''
|
|
|
|
- category: 'TrySmalltalk'!
|
|
|
|
-!SmalltalkSyntaxTutorial commentStamp!
|
|
|
|
-The default ProfStef tutorial to learn Smalltalk syntax!
|
|
|
|
-
|
|
|
|
-!SmalltalkSyntaxTutorial methodsFor: 'contents'!
|
|
|
|
-
|
|
|
|
-tableOfContents
|
|
|
|
-^ #( 'welcome'
|
|
|
|
- 'doingVSPrinting'
|
|
|
|
- 'printing'
|
|
|
|
-
|
|
|
|
- 'basicTypesNumbers'
|
|
|
|
- "'basicTypesCharacters'"
|
|
|
|
- 'basicTypesString'
|
|
|
|
- "'basicTypesSymbol'"
|
|
|
|
- 'basicTypesArray'
|
|
|
|
- 'basicTypesDynamicArray'
|
|
|
|
-
|
|
|
|
- 'messageSyntaxUnary'
|
|
|
|
- 'messageSyntaxBinary'
|
|
|
|
- 'messageSyntaxKeyword'
|
|
|
|
- 'messageSyntaxExecutionOrder'
|
|
|
|
- 'messageSyntaxExecutionOrderParentheses'
|
|
|
|
- 'mathematicalPrecedence'
|
|
|
|
- 'messageSyntaxCascade'
|
|
|
|
- 'messageSyntaxCascadeShouldNotBeHere'
|
|
|
|
-
|
|
|
|
- 'blocks'
|
|
|
|
- 'blocksAssignation'
|
|
|
|
- 'conditionals'
|
|
|
|
- 'loops'
|
|
|
|
- 'iterators'
|
|
|
|
-
|
|
|
|
- 'instanciation'
|
|
|
|
-
|
|
|
|
- 'reflection'
|
|
|
|
- 'reflectionContinued'
|
|
|
|
- "'pharoEnvironment'"
|
|
|
|
-
|
|
|
|
- "'debugger'"
|
|
|
|
- 'theEnd' )
|
|
|
|
-! !
|
|
|
|
-
|
|
|
|
-!SmalltalkSyntaxTutorial methodsFor: 'pages'!
|
|
|
|
-
|
|
|
|
-basicTypesArray
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Array'
|
|
|
|
-contents:
|
|
|
|
-'"Literal arrays are created at parse time:"
|
|
|
|
-
|
|
|
|
-#(1 2 3).
|
|
|
|
-
|
|
|
|
-#( 1 2 3 #(4 5 6)) size.
|
|
|
|
-
|
|
|
|
-#(1 2 4) isEmpty.
|
|
|
|
-
|
|
|
|
-#(1 2 3) first.
|
|
|
|
-
|
|
|
|
-#(''hello'' ''Javascript'') at: 2 put: ''Smalltalk''; yourself.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-basicTypesCharacters
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Characters'
|
|
|
|
-contents:
|
|
|
|
-'"A Character can be instantiated using $ operator:"
|
|
|
|
-
|
|
|
|
-$A.
|
|
|
|
-
|
|
|
|
-$A class.
|
|
|
|
-
|
|
|
|
-$B charCode.
|
|
|
|
-
|
|
|
|
-Character cr.
|
|
|
|
-
|
|
|
|
-Character space.
|
|
|
|
-
|
|
|
|
-"You can print all 256 characters of the ASCII extended set:"
|
|
|
|
-
|
|
|
|
-Character allByteCharacters.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-basicTypesDynamicArray
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Dynamic Array'
|
|
|
|
-contents:
|
|
|
|
-'"Dynamic Arrays are created at execution time:"
|
|
|
|
-
|
|
|
|
-{ (2+3) . (6*6) }.
|
|
|
|
-
|
|
|
|
-{ (2+3) . (6*6) . ''hello'', '' Stef''} size.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-{ ProfStef } first next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-basicTypesNumbers
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Numbers'
|
|
|
|
-contents:
|
|
|
|
-'"You now know how to execute Smalltalk code.
|
|
|
|
-
|
|
|
|
-Now let''s talk about basic objects.
|
|
|
|
-
|
|
|
|
-1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions.
|
|
|
|
-Evaluate these ones:"
|
|
|
|
-
|
|
|
|
-2.
|
|
|
|
-
|
|
|
|
-(1/3).
|
|
|
|
-
|
|
|
|
-(1/3) + (4/5).
|
|
|
|
-
|
|
|
|
-(18/5) rounded.
|
|
|
|
-
|
|
|
|
-1 class.
|
|
|
|
-
|
|
|
|
-1 negated.
|
|
|
|
-
|
|
|
|
-1 negated negated.
|
|
|
|
-
|
|
|
|
-(1 + 3) odd.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-basicTypesString
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Strings'
|
|
|
|
-contents:
|
|
|
|
-'"A String is a collection of characters. Use single quotes to create a String object. Print these expressions:"
|
|
|
|
-
|
|
|
|
-''ProfStef''.
|
|
|
|
-
|
|
|
|
-''ProfStef'' size.
|
|
|
|
-
|
|
|
|
-''abc'' asUppercase.
|
|
|
|
-
|
|
|
|
-''Hello World'' reversed.
|
|
|
|
-
|
|
|
|
-"You can access each character using at: message"
|
|
|
|
-
|
|
|
|
-''ProfStef'' at: 1.
|
|
|
|
-
|
|
|
|
-"String concatenation uses the comma operator:"
|
|
|
|
-
|
|
|
|
-''ProfStef'', '' is cool''.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-basicTypesSymbol
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Basic types: Symbols'
|
|
|
|
-contents:
|
|
|
|
-'"A Symbol is a String which is guaranteed to be globally unique.
|
|
|
|
-
|
|
|
|
-There is one and only one Symbol #ProfStef. There may be several ''ProfStef'' String objects.
|
|
|
|
-
|
|
|
|
-(Message == returns true if the two objects are the SAME)"
|
|
|
|
-
|
|
|
|
-''ProfStef'' asSymbol.
|
|
|
|
-
|
|
|
|
-#ProfStef asString.
|
|
|
|
-
|
|
|
|
-(2 asString) == (2 asString).
|
|
|
|
-
|
|
|
|
-(2 asString) asSymbol == (2 asString) asSymbol.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-(Smalltalk at: #ProfStef) next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-blocks
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Blocks'
|
|
|
|
-contents:
|
|
|
|
-'"Cascade is cool !! Let''s talk about blocks.
|
|
|
|
-
|
|
|
|
-Blocks are anonymous methods that can be stored into variables and executed on demand.
|
|
|
|
-
|
|
|
|
-Blocks are delimited by square brackets: []"
|
|
|
|
-
|
|
|
|
-[Transcript open].
|
|
|
|
-
|
|
|
|
-"does not open a Transcript because the block is not executed.
|
|
|
|
-
|
|
|
|
-Here is a block that adds 2 to its argument (its argument is named x):"
|
|
|
|
-
|
|
|
|
-[:x | x+2].
|
|
|
|
-
|
|
|
|
-"We can execute a block by sending it value messages."
|
|
|
|
-
|
|
|
|
-[:x | x+2] value: 5.
|
|
|
|
-
|
|
|
|
-[Transcript open] value.
|
|
|
|
-
|
|
|
|
-[:x | x+2] value: 10.
|
|
|
|
-
|
|
|
|
-[:x :y| x + y] value:3 value:5.
|
|
|
|
-
|
|
|
|
-[ProfStef next] value.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-blocksAssignation
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Block assignation'
|
|
|
|
-contents:
|
|
|
|
-'"Blocks can be assigned to a variable then executed later.
|
|
|
|
-
|
|
|
|
-Note that |b| is the declaration of a variable named ''b'' and that '':='' assigns a value to a variable.
|
|
|
|
-
|
|
|
|
-Select the three lines then Print It:"
|
|
|
|
-
|
|
|
|
-|b|
|
|
|
|
-b := [:x | x+2].
|
|
|
|
-b value: 12.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-conditionals
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Conditionals'
|
|
|
|
-contents:
|
|
|
|
-'"Conditionals are just messages sent to Boolean objects"
|
|
|
|
-
|
|
|
|
-1 < 2
|
|
|
|
- ifTrue: [100]
|
|
|
|
- ifFalse: [42].
|
|
|
|
-
|
|
|
|
-"Here the message is ifTrue:ifFalse
|
|
|
|
-
|
|
|
|
-Try this:"
|
|
|
|
-
|
|
|
|
-Transcript open.
|
|
|
|
-
|
|
|
|
-3 > 10
|
|
|
|
- ifTrue: [Transcript show: ''maybe there''''s a bug ....'']
|
|
|
|
- ifFalse: [Transcript show: ''No : 3 is less than 10''].
|
|
|
|
-
|
|
|
|
-3 = 3 ifTrue: [ProfStef next].'.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-debugger
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Debugger'
|
|
|
|
-contents: '"The Debugger may be the most famous tool of Smalltalk environments. It will open as soon as an unmanaged Exception occurs.
|
|
|
|
-
|
|
|
|
-The following code will open the debugger.
|
|
|
|
-
|
|
|
|
-***This should be rethought completely***"
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- '
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-doingVSPrinting
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Doing VS Printing: Doing'
|
|
|
|
-contents:
|
|
|
|
-'"Cool !! (I like to say Cooool :) ). You''ve just executed a Smalltalk expression. More precisely, you sent the message ''next'' to
|
|
|
|
-ProfStef class (it''s me !!).
|
|
|
|
-
|
|
|
|
-Note you can run this tutorial again by evaluating: ''ProfStef go''.
|
|
|
|
-''ProfStef previous'' returns to the previous lesson.
|
|
|
|
-
|
|
|
|
-You can also Do It using the keyboard shortcut ''CTRL d''
|
|
|
|
-
|
|
|
|
-Try to evaluate this expression:"
|
|
|
|
-
|
|
|
|
-window alert: ''hello world!!''.
|
|
|
|
-
|
|
|
|
-"Then go to the next lesson:"
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-instanciation
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Instanciation'
|
|
|
|
-contents:
|
|
|
|
-'"Objects are instances of their class. Usually, we send the message #new to a class for creating an instance of this class.
|
|
|
|
-
|
|
|
|
-For example, let''s create an instance of the class Array:"
|
|
|
|
-
|
|
|
|
-Array new
|
|
|
|
- add: ''Some text'';
|
|
|
|
- add: 3.;
|
|
|
|
- yourself.
|
|
|
|
-
|
|
|
|
-"See the array we''ve created? Actually, #(''Some text'' 3) is just a shorthand for instantiating arrays."
|
|
|
|
-
|
|
|
|
-"If we use a variable to keep track of this object, we''ll be able to do stuff with it."
|
|
|
|
-
|
|
|
|
-"The following code must be ran all at one, as the ''anArray'' variable will cease to exist once the execution finishes:"
|
|
|
|
-
|
|
|
|
-|anArray|
|
|
|
|
-
|
|
|
|
-anArray := Array new
|
|
|
|
- add: ''Some text'';
|
|
|
|
- add: 3;
|
|
|
|
- yourself;
|
|
|
|
-
|
|
|
|
-Transcript show: anArray; cr.
|
|
|
|
-
|
|
|
|
-anArray remove: 3.
|
|
|
|
-
|
|
|
|
-Transcript show: anArray; cr.
|
|
|
|
-
|
|
|
|
-anArray add: ''Some more text!!''.
|
|
|
|
-
|
|
|
|
-Transcript show: anArray; cr.
|
|
|
|
-
|
|
|
|
-"I''ll put myself in an instance of a class named Dictionary and go to the next lesson:"
|
|
|
|
-
|
|
|
|
-((Dictionary new add: (''move on!!'' -> ProfStef)) at: ''move on!!'') next'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-iterators
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Iterators'
|
|
|
|
-contents:
|
|
|
|
-'"The message do: is sent to a collection of objects (Array, Dictionary, String, etc), evaluating the block for each element.
|
|
|
|
-
|
|
|
|
-Here we want to print all the numbers on the Transcript (a console)"
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) do: [:each |
|
|
|
|
- Transcript show: each printString; cr].
|
|
|
|
-
|
|
|
|
-"Some other really nice iterators"
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) collect: [:each | each negated].
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) collect: [:each | each odd].
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) select: [:each | each odd].
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) select: [:each | each > 10].
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10) reject: [:each | each > 10].
|
|
|
|
-
|
|
|
|
-#(11 38 3 -2 10)
|
|
|
|
- do: [:each | Transcript show: each printString]
|
|
|
|
- separatedBy: [Transcript show: ''.''].
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-(Smalltalk current classes select: [:eachClass | eachClass name = ''ProfStef'']) do: [:eachProfstef | eachProfstef next].'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-loops
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Loops'
|
|
|
|
-contents:
|
|
|
|
-'"Loops are high-level collection iterators, implemented as regular methods."
|
|
|
|
-
|
|
|
|
-"Basic loops:
|
|
|
|
- to:do:
|
|
|
|
- to:by:do"
|
|
|
|
-
|
|
|
|
-1 to: 100 do:
|
|
|
|
- [:i | Transcript show: i asString; cr ].
|
|
|
|
-
|
|
|
|
-1 to: 100 by: 3 do: [:i | Transcript show: i asString; cr].
|
|
|
|
-
|
|
|
|
-100 to: 0 by: -2 do:
|
|
|
|
- [:i | Transcript show: i asString; cr].
|
|
|
|
-
|
|
|
|
-1 to: 1 do: [:i | ProfStef next].'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-mathematicalPrecedence
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Mathematical precedence'
|
|
|
|
-contents:
|
|
|
|
-'"Traditional precedence rules from mathematics do not follow in Smalltalk."
|
|
|
|
-
|
|
|
|
-2 * 10 + 2.
|
|
|
|
-
|
|
|
|
-"Here the message * is sent to 2, which answers 20, then 20 receive the message +
|
|
|
|
-
|
|
|
|
-Remember that all messages always follow a simple left-to-right precedence rule, * without exceptions *."
|
|
|
|
-
|
|
|
|
-2 + 2 * 10.
|
|
|
|
-
|
|
|
|
-2 + (2 * 10).
|
|
|
|
-
|
|
|
|
-8 - 5 / 2.
|
|
|
|
-
|
|
|
|
-(8 - 5) / 2.
|
|
|
|
-
|
|
|
|
-8 - (5 / 2).
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxBinary
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Binary messages'
|
|
|
|
-contents:
|
|
|
|
-'"Binary messages have the following form:
|
|
|
|
- anObject + anotherObject"
|
|
|
|
-
|
|
|
|
-3 * 2.
|
|
|
|
-
|
|
|
|
-Date today year = 2011.
|
|
|
|
-
|
|
|
|
-false | false.
|
|
|
|
-
|
|
|
|
-true & true.
|
|
|
|
-
|
|
|
|
-true & false.
|
|
|
|
-
|
|
|
|
-10 @ 100.
|
|
|
|
-
|
|
|
|
-10 <= 12.
|
|
|
|
-
|
|
|
|
-''ab'', ''cd''.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxCascade
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Cascade'
|
|
|
|
-contents:
|
|
|
|
-'"; is the cascade operator. It''s useful to send message to the SAME receiver
|
|
|
|
-Open a Transcript (console):"
|
|
|
|
-
|
|
|
|
-Transcript open.
|
|
|
|
-
|
|
|
|
-"Then:"
|
|
|
|
-
|
|
|
|
-Transcript show: ''hello''.
|
|
|
|
-Transcript show: ''Smalltalk''.
|
|
|
|
-Transcript cr.
|
|
|
|
-
|
|
|
|
-"is equivalent to:"
|
|
|
|
-
|
|
|
|
-Transcript
|
|
|
|
- show: ''hello'';
|
|
|
|
- show: ''Smalltalk'' ;
|
|
|
|
- cr.
|
|
|
|
-
|
|
|
|
-"You can close the development tools by clicking on the red circle with a cross at the bottom left of the website.
|
|
|
|
-Try to go to the next lesson with a cascade of two ''next'' messages:"
|
|
|
|
-
|
|
|
|
-ProfStef'.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxCascadeShouldNotBeHere
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Lost ?'
|
|
|
|
-contents:
|
|
|
|
-'"Hey, you should not be here !!!!
|
|
|
|
-
|
|
|
|
-Go back and use a cascade !!"
|
|
|
|
-
|
|
|
|
-ProfStef previous.'.
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxExecutionOrder
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Execution order'
|
|
|
|
-contents:
|
|
|
|
-'"Unary messages are executed first, then binary messages and finally keyword messages:
|
|
|
|
- Unary > Binary > Keywords"
|
|
|
|
-
|
|
|
|
-2.5 + 3.8 rounded.
|
|
|
|
-
|
|
|
|
-3 max: 2 + 2.
|
|
|
|
-
|
|
|
|
-(0@0) class.
|
|
|
|
-
|
|
|
|
-0@0 x: 100.
|
|
|
|
-
|
|
|
|
-(0@0 x: 100) class.
|
|
|
|
-
|
|
|
|
-"Between messages of similar precedence, expressions are executed from left to right"
|
|
|
|
-
|
|
|
|
--12345 negated asString reversed.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxExecutionOrderParentheses
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Parentheses'
|
|
|
|
-contents:
|
|
|
|
-'"Use parentheses to change order of evaluation"
|
|
|
|
-
|
|
|
|
-(2.5 + 3.8) rounded.
|
|
|
|
-
|
|
|
|
-(3 max: 2) + 2.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxKeyword
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Keyword messages'
|
|
|
|
-contents:
|
|
|
|
-'"Keyword Messages are messages with arguments. They have the following form:
|
|
|
|
- anObject akey: anotherObject akey2: anotherObject2"
|
|
|
|
-
|
|
|
|
-''Web development is a good deal of pain'' copyFrom: 1 to: 30
|
|
|
|
-
|
|
|
|
-"The message is copyFrom:to: sent to the String ''Web development is a good deal of pain''"
|
|
|
|
-
|
|
|
|
-1 max: 3.
|
|
|
|
-
|
|
|
|
-Array with: ''hello'' with: 2 with: Smalltalk.
|
|
|
|
-
|
|
|
|
-"The message is with:with:with: implemented on class Array. Note you can also write"
|
|
|
|
-
|
|
|
|
-Array
|
|
|
|
- with: ''Hi there!!''
|
|
|
|
- with: 2
|
|
|
|
- with: Smalltalk.
|
|
|
|
-
|
|
|
|
-ProfStef perform: ''next''.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-messageSyntaxUnary
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Message syntax: Unary messages'
|
|
|
|
-contents:
|
|
|
|
-'"Messages are sent to objects. There are three types of message: Unary, Binary and Keyword.
|
|
|
|
-
|
|
|
|
-Unary messages have the following form:
|
|
|
|
- anObject aMessage
|
|
|
|
-
|
|
|
|
-You''ve already sent unary messages. For example:"
|
|
|
|
-
|
|
|
|
-1 class.
|
|
|
|
-
|
|
|
|
-false not.
|
|
|
|
-
|
|
|
|
-Date today.
|
|
|
|
-
|
|
|
|
-Number pi.
|
|
|
|
-
|
|
|
|
-"And of course: "
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-pharoEnvironment
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Pharo environment'
|
|
|
|
-contents:
|
|
|
|
-'"Every Smalltalk system is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages.
|
|
|
|
-
|
|
|
|
-Every object understands the message ''explore''. As a result, you get an Explorer window that shows details about the object."
|
|
|
|
-
|
|
|
|
-Date today explore.
|
|
|
|
-
|
|
|
|
-"This shows that the date object consists of a point in time (start) and a duration (one day long)."
|
|
|
|
-
|
|
|
|
-ProfStef explore.
|
|
|
|
-
|
|
|
|
-"You see, ProfStef class has a lot of objects. Let''s take a look at my code:"
|
|
|
|
-
|
|
|
|
-ProfStef browse.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-printing
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Doing VS Printing: Printing'
|
|
|
|
-contents:
|
|
|
|
-'"Now you''re a Do It master !! Let''s talk about printing. It''s a Do It which prints the result next to the expression you''ve selected.
|
|
|
|
-For example, select the text below, and click on ''PrintIt'':"
|
|
|
|
-
|
|
|
|
-1 + 2.
|
|
|
|
-
|
|
|
|
-"As with ''DoIt'', there is also a shortcut to execute this command.
|
|
|
|
-
|
|
|
|
-Try CTRL-p on the following expressions:"
|
|
|
|
-
|
|
|
|
-Date today.
|
|
|
|
-
|
|
|
|
-"The result is selected, so you can erase it using the backspace key. Try it !!"
|
|
|
|
-
|
|
|
|
-Date today asDateString.
|
|
|
|
-
|
|
|
|
-Date today asTimeString.
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-reflection
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Reflection'
|
|
|
|
-contents:
|
|
|
|
-'"You can inspect and change the system at runtime.
|
|
|
|
-
|
|
|
|
-Take a look at the source code of the method #and: of the class Boolean:"
|
|
|
|
-
|
|
|
|
-(Boolean methodDictionary at: ''and:'') source.
|
|
|
|
-
|
|
|
|
-"Or all the methods it sends:"
|
|
|
|
-
|
|
|
|
-(Boolean methodDictionary at: ''and:'') messageSends.
|
|
|
|
-
|
|
|
|
-"Here''s all the methods I implement:"
|
|
|
|
-
|
|
|
|
-ProfStef methodDictionary.
|
|
|
|
-
|
|
|
|
-"Let''s create a new method to go to the next lesson:"
|
|
|
|
-
|
|
|
|
-|newMethod|
|
|
|
|
-newMethod := Compiler new load: ''goToNextLesson ProfStef next.'' forClass: ProfStef.
|
|
|
|
-ProfStef class addCompiledMethod: newMethod
|
|
|
|
-
|
|
|
|
-"Wow!! I can''t wait to use my new method!!"
|
|
|
|
-
|
|
|
|
-ProfStef goToNextLesson.'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-reflectionContinued
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Reflection continued'
|
|
|
|
-contents:
|
|
|
|
-'"So cool, isn''t it ? Before going further, let''s remove this method:"
|
|
|
|
-
|
|
|
|
-ProfStef class methodAt: #goToNextLesson.
|
|
|
|
-
|
|
|
|
-ProfStef class removeCompiledMethod: (ProfStef class methodAt: #goToNextLesson).
|
|
|
|
-
|
|
|
|
-ProfStef class methodAt: #goToNextLesson.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-"Then move forward:"
|
|
|
|
-
|
|
|
|
-ProfStef perform:#next'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-theEnd
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Tutorial done !!'
|
|
|
|
-contents:
|
|
|
|
-'"This tutorial is done. Enjoy programming Smalltalk with JTalk.
|
|
|
|
-
|
|
|
|
-You can run this tutorial again by evaluating: ProfStef go.
|
|
|
|
-
|
|
|
|
-See you soon !!"
|
|
|
|
-'
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
-welcome
|
|
|
|
- ^ Lesson
|
|
|
|
-title: 'Welcome'
|
|
|
|
-contents:
|
|
|
|
-' "Hello!! I''m Professor Stef.
|
|
|
|
-
|
|
|
|
-You must want me to help you learn Smalltalk.
|
|
|
|
-
|
|
|
|
-So let''s go to the first lesson. Select the text below and click on the ''DoIt'' button"
|
|
|
|
-
|
|
|
|
-ProfStef next.'
|
|
|
|
-! !
|
|
|
|
-
|
|
|