Pharo:
A malleable and powerful
platform
Damien Cassou and Camille Teruel
http://www.pharo.org
What is it?
Programming language + IDE
Object-Oriented, Dynamic, Reflective
Explore + Change running systems
The Ultimate L...
Pharo
MIT license
Great community of active doers
Powerful
Elegant and fun to program
Living system under your fingers
Mac,...
2nd most downloaded on Inria gforge
40-50 active commiters
> 600 mailing-list members
180 license agreements
50 associatio...
Create an ecosystem
where business/innovation
can bloom
We want that you can make research
and money with Pharo.
We want a powerful innovative
dynamic language where we can build...
A Little Journey in the Pharo
Object Model
A pure and minimal object model
Less is more!
No constructors, no static methods, no operators
No interfaces, no private/protected modifiers
No type declarations, no par...
Everything is an object
213 class
SmallInteger
Objects are instances of
Classes
class is a message sent
to the object 213
SmallInteger is the
resu...
Objects are instances of
Classes
Integer
SmallInteger
213
instance of
inherits
from
Sending a message
Integer
SmallInteger
213
factorial
instance of
inherits
from
Classes are objects too
213 class selectors
#(#instVarAt: #sizeInMemory
#printOn:base:length:padded: #< #bitXor: #''
#numb...
Classes are objects too
Number allSubclasses
an OrderedCollection(Fraction Float Integer
ScaledDecimal SmallInteger LargeP...
Fun with Numbers!
1 class
SmallInteger
1 class
SmallInteger
1 class maxVal
1073741823
1 class
SmallInteger
1 class maxVal
1073741823
1 class maxVal + 1
1073741824
1 class
SmallInteger
1 class maxVal
1073741823
1 class maxVal + 1
1073741824
(1 class maxVal + 1) class
LargePositiveInteg...
(1/3) + (2/3)
1
(1/3) + (2/3)
1
2/3 + 1
5/3
(1/3) + (2/3)
1
2/3 + 1
5/3
1000 factorial
4023872600770937735437024339230039857193748642107146325437999104299385123986290...
Point class
Point class
Classes are objects too
Point class
Point class
Classes are objects too
“Point class” is an anonymous class
with only one instance: Point.
We call...
Integer
SmallInteger
Class Parallel Inheritance
213
instance of
Integer
SmallInteger
Integer class
SmallInteger class
Class Parallel Inheritance
213
instance of
instance of
instance
of
Integer
SmallInteger
Integer class
SmallInteger class
A “static” method
is just a method of
the metaclass
Integer readFrom...
Class extensions
A method can be defined in a class that
belongs to another package!
Powerful to build DSLs
$x ctrl , $f ct...
Summary
Everything is an object
One single model
Classes are objects too
A class is instance of another class
One unique m...
Pharo: Syntax in a
Nutshell
asm
push: asm RBP;
mov: asm RSP -> asm RBP;
mov: 1024 -> asm RAX;
mov: asm RBP -> asm RSP;
pop: asm RBP;
ret.
identifier :...
Syntax on a PostCard
exampleWithNumber: x
|y|
true & false not & (nil isNil)
ifFalse: [ self halt ].
y := self size + supe...
Language Constructs
^	 return
“ 
 comments
#	 symbol or array
‘
 string
[]	 block
.	 separator
; cascade
|	 local or block...
Examples
comment:
 “a comment”
character:	 $c $.
string:	 	 'a nice string' 'lulu' 'l''idiot'
symbol:		 #mac #+
array:	 	 ...
Not Syntax
& 	 	 conjunction (and)
|	 	 disjunction (or)
+	 	 addition
<	 	 lower than
ifTrue:	 condition
do:	 	 iteration...
Not Syntax
& 	 	 conjunction (and)
|	 	 disjunction (or)
+	 	 addition
<	 	 lower than
ifTrue:	 condition
do:	 	 iteration...
3 kinds of messages
Unary messages
Binary messages
Keywords messages
5 factorial
Transcript cr
3 + 4
2 between: 0 and: 5
T...
postman.send( mail, recipient);
Keyword messages
postman.send( mail, recipient);
Keyword messages
postman send mail recipient
Keyword messages
postman send mail to recipient
Keyword messages
postman send: mail to: recipient
Keyword messages
postman send: mail to: recipient
Keyword messages
send:to: method in the
Postman class
receiver argument 1 argument 2
mess...
strings := OrderedCollection new
ArrayList<String> strings = new
ArrayList<String>();
Some Comparisons
persons collect: [:person | person name]
ArrayList<String> strings
= new ArrayList<String>();
for(Person person: persons) ...
persons collect: #name
ArrayList<String> strings
= new ArrayList<String>();
for(Person person: persons) {
strings.add(pers...
[ self doSomething ] fork
new Thread(
new Runnable() {
public void run() {
this.doSomething();}}).start();
Some Comparisons
(10 between: 1 and: 20 + 2) not
false
( ) > Unary > Binary > Keywords
A method definition in Point
Method name
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint...
A method definition in Point
Argument
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint."
...
A method definition in Point
Comment
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint."
^...
A method definition in Point
Return
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint."
^ ...
A method definition in Point
Instance variable
<= aPoint
"Answer whether the receiver is neither
below nor to the right of ...
A method definition in Point
Binary message
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPo...
A method definition in Point
Keyword message
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aP...
A method definition in Point
Block
<= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint."
^ x...
Point>> <= aPoint
"Answer whether the receiver is neither
below nor to the right of aPoint."
^ x <= aPoint x and: [y <= aP...
Statements and Cascades
Temporary variables Statement
Cascade
| p pen |
p := 100@100.
pen := Pen new.
pen
up;
goto: p;
dow...
Anonymous method
Passed as method argument or stored
f := [:x | x * x + 3].
f value: 2
7
Blocks (aka Closure)
BlockClosure...
Block usage
Integer>> factorial
self = 0
ifTrue: [ ^ 1 ].
self > 0
ifTrue: [ ^ self * (self - 1) factorial ]
#(1 2 3) do: ...
Control Structures
Every control structure is realized by message sends
[ stream atEnd ]
whileFalse: [ self process: strea...
Iterating Collections
#(2 3 4 -35 4)
collect: [ :each| each abs ]
#(2 3 4 35 4)
Iterating Collections
#(2 3 4 -35 4)
select: [ :each| each odd ]
#(-3 -35)
Iterating Collections
#(2 3 4 -35 4)
do: [ :each| Transcript crShow: each ]
2
3
...
Pharo, a live programming
environment
Demo
Modifying classes and methods while
the program is running
Nice libraries and
frameworks
'http://picasaweb.google.com/data/feed/
api/all?q=puppy' asUrl retrieveContents
Gofer new
smalltalkhubUser: 'PharoExtras'
project: 'XMLParser';
loadStable.
data := 'http://picasaweb.google.com/data/
feed/api/all?q=puppy' asUrl retrieveContents.
doc := XMLDOMParser parse: data
data := 'http://picasaweb.google.com/data/
feed/api/all?q=puppy' asUrl retrieveContents.
doc := XMLDOMParser parse: data.
...
data := 'http://picasaweb.google.com/data/
feed/api/all?q=puppy' asUrl retrieveContents.
doc := XMLDOMParser parse: data.
...
(ZnEasy getGif: url) asMorph openInHand
Your turn
Black magic
Execution Stack as an Object
To define exceptions from within the language
Debugger support!
Advanced debugging
Continuation
thisContext
returns an object that represents the
method invocation
can walk (even modify!) the stack
Serializing Continuations
[ "some code causing an error" ]
on: Error
do: [ :error |
FLSerializer
serialize: error
toFileNa...
Powerful Breakpoints?
Would be so good if we could say:
“Stop method bar only if it is called from
method named foo” i.e.,...
Halt>> whenCalledFrom: aSelector
| ctxt |
ctxt := thisContext.
[ ctxt sender isNil ]
whileFalse: [
ctxt := ctxt sender.
ct...
Pointer Swapping
anObject become: anotherObject
| pt1 pt2 ref |
pt1 := 0@0.
pt2 := 100@100.
ref := pt1.
pt1 become: pt2.
self assert: ref = (100@100).
self assert: pt2 = ...
Some Pharo’s success
stories
Continuous API Testing
keep your services under control 24/7
Norbert Hartl norbert@2denker.de
www.2denker.de
WEBDRUCK.CH
Web-To-Print Solution
• Design and create
individual printed
matter
• eShop with credit
card payment
• High qu...
NTed: disaster scenario
recovery
iBizLog - http://www.ibizlog.com
A product by Smallworks
Tuesday, May 15, 12
Pinesoft MBagger
We want more success
stories!
We are a cool community
www.10pines.com
www.2denker.de
www.agilitic.com
www.airflowing.com
www.anymorphic.com
www.ardishealth.com
www.beta9.be
www....
University of Bueno Aires
University of Bern scg.unibe.ch
University of Brussels soft.vub.ac.be/soft/
Ecole des Mines www....
Lafhis (University of Bueno Aires )
Software Composition Group (scg.unibe.ch)
CAR (Ecole des mines www.ensm-douai.fr)
RMoD...
Community Ongoing Work
Better widgets, UI Builder (A. Plantec, G. Chambers, B. van Ryseghem)
Better browsers (B. van Ryseg...
Consortium & Association
How to sustain Pharo?
How to structure the community?
Consortium Members
Managed by Inria for now
Who: companies, institutions, user groups
Privileged access to the core develo...
Pharo User Association
Managed by the Pharo Association
Individuals
Premium (99 €/year)
Normal (40 €/year)
Join and partic...
Pharo books
Pharo by example
translated to french, merci!
translated to spanish, gracias!
translated to japanese, ありがとう!
g...
New books are coming
Deep into Pharo
Pharo for the Enterprise
A glimpse at VM
Everybody can help
Reporting bugs
Confirming bugs
Writing tests
Writing examples
Writing comments
Simple contributing fixes
...
May 2008 Bern
July 2009 Bern
October 2009 Lille
November 2009 Buenos Aires
March 2010 Bern
May 2010 Buenos Aires
June 2010...
To Take Away
Because it is simple and extensible, Pharo is a nice
platform to experiment on
Use it for your own research (...
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Pharo tutorial at ECOOP 2013
Upcoming SlideShare
Loading in …5
×

Pharo tutorial at ECOOP 2013

1,008 views
929 views

Published on

Pharo is an open-source live-programming environment and programming language started in 2008. The official web site is http://www.pharo-project.org. By providing a stable and small core system, excellent dev tools, and maintained releases, Pharo is an attractive platform to build and deploy mission-critical applications.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,008
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Pharo tutorial at ECOOP 2013

  1. 1. Pharo: A malleable and powerful platform Damien Cassou and Camille Teruel http://www.pharo.org
  2. 2. What is it? Programming language + IDE Object-Oriented, Dynamic, Reflective Explore + Change running systems The Ultimate Live Programming Environment!
  3. 3. Pharo MIT license Great community of active doers Powerful Elegant and fun to program Living system under your fingers Mac, Linux, Android, iOS, Windows
  4. 4. 2nd most downloaded on Inria gforge 40-50 active commiters > 600 mailing-list members 180 license agreements 50 association members 17 industrial consortium members around 300 external projects Pharo in numbers Very High Activity
  5. 5. Create an ecosystem where business/innovation can bloom
  6. 6. We want that you can make research and money with Pharo. We want a powerful innovative dynamic language where we can build our future.
  7. 7. A Little Journey in the Pharo Object Model
  8. 8. A pure and minimal object model Less is more!
  9. 9. No constructors, no static methods, no operators No interfaces, no private/protected modifiers No type declarations, no parametrized types No primitive types, no boxing/unboxing Still powerful
  10. 10. Everything is an object
  11. 11. 213 class SmallInteger Objects are instances of Classes class is a message sent to the object 213 SmallInteger is the result of the message sent In “Java”: 213.getClass()
  12. 12. Objects are instances of Classes Integer SmallInteger 213 instance of inherits from
  13. 13. Sending a message Integer SmallInteger 213 factorial instance of inherits from
  14. 14. Classes are objects too 213 class selectors #(#instVarAt: #sizeInMemory #printOn:base:length:padded: #< #bitXor: #'' #numberOfDigitsInBase: #'//' #threeDigitName #highBitOfPositiveReceiver #bitAnd: #isLarge #largeIdentityHash #'>=' #nextObject #nextInstance #gcd: #printStringBase: #lowBit #pointsTo: #basicIdentityHash #fromString:radix: ...)
  15. 15. Classes are objects too Number allSubclasses an OrderedCollection(Fraction Float Integer ScaledDecimal SmallInteger LargePositiveInteger LargeNegativeInteger)
  16. 16. Fun with Numbers!
  17. 17. 1 class SmallInteger
  18. 18. 1 class SmallInteger 1 class maxVal 1073741823
  19. 19. 1 class SmallInteger 1 class maxVal 1073741823 1 class maxVal + 1 1073741824
  20. 20. 1 class SmallInteger 1 class maxVal 1073741823 1 class maxVal + 1 1073741824 (1 class maxVal + 1) class LargePositiveInteger
  21. 21. (1/3) + (2/3) 1
  22. 22. (1/3) + (2/3) 1 2/3 + 1 5/3
  23. 23. (1/3) + (2/3) 1 2/3 + 1 5/3 1000 factorial 4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048004799886101971960586316668729948085589013238296699445 9099742450408707375991882362772718873251977950595099527612087497546249704360141827809464649629105639388743788648733711918104582578364784997701247663288983 5955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593 2019280908782973084313928444032812315586110369768013573042161687476096758713483120254785893207671691324484262361314125087802080002616831510273418279777047 8463586817016436502415369139828126481021309276124489635992870511496497541990934222156683257208082133318611681155361583654698404670897560290095053761647584 7728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103 9681759215109077880193931781141945452572238655414610628921879602238389714760885062768629671466746975629112340824392081601537808898939645182632436716167621 7916890977991190375403127462228998800519544441428201218736174599264295658174662830295557029902432415318161721046583203678690611726015878352075151628422554 0265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860 7883861502794659551311565520360939881806121385586003014356945272242063446317974605946825731037900840244324384656572450144028218852524709351906209290231364 9327349756551395872055965422874977401141334696271542284586237738753823048386568897646192738381490014076731044664025989949022222176590433990188601856652648 5061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970 1374285319266498753372189406942814341185201580141233448280150513996942901534830776445690990731524332782882698646027898643211390835062170950025973898635542 7719674282224875758676575234422020757363056949882508796892816275384886339690995982628095612145099487170124451646126037902930912088908694202851064018215439 9457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970 0277534720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  24. 24. Point class Point class Classes are objects too
  25. 25. Point class Point class Classes are objects too “Point class” is an anonymous class with only one instance: Point. We call such classes “metaclasses”
  26. 26. Integer SmallInteger Class Parallel Inheritance 213 instance of
  27. 27. Integer SmallInteger Integer class SmallInteger class Class Parallel Inheritance 213 instance of instance of instance of
  28. 28. Integer SmallInteger Integer class SmallInteger class A “static” method is just a method of the metaclass Integer readFrom: '123' 123 Class Parallel Inheritance factorial class class readFrom:
  29. 29. Class extensions A method can be defined in a class that belongs to another package! Powerful to build DSLs $x ctrl , $f ctrl Ctrl + X , Ctrl + F ctrl method in Character class
  30. 30. Summary Everything is an object One single model Classes are objects too A class is instance of another class One unique method lookup, look in the class of the receiver
  31. 31. Pharo: Syntax in a Nutshell
  32. 32. asm push: asm RBP; mov: asm RSP -> asm RBP; mov: 1024 -> asm RAX; mov: asm RBP -> asm RSP; pop: asm RBP; ret. identifier := #letter asParser , #word asParser star Assembly Parsers Syntax Examples
  33. 33. Syntax on a PostCard exampleWithNumber: x |y| true & false not & (nil isNil) ifFalse: [ self halt ]. y := self size + super size. { 1 . 2 . #($a #a ‘a’ 1 1.0) } do: [ :each | Transcript show: (each class name); show: (each printString); show: ‘ ‘ ]. ^ x < y
  34. 34. Language Constructs ^ return “ comments # symbol or array ‘ string [] block . separator ; cascade | local or block variable := assignment $ character <...> annotation
  35. 35. Examples comment: “a comment” character: $c $. string: 'a nice string' 'lulu' 'l''idiot' symbol: #mac #+ array: { 1 . 123 + 1 } literal array: #(1 2 3 (1 3) $a 4) byte array: #[1 2 3] block: [ :x | x * 2 ] integer: 1 2r101 real: 1.5 6.03e-34 4 2.4e7 keywords: true false nil self super thisContext
  36. 36. Not Syntax & conjunction (and) | disjunction (or) + addition < lower than ifTrue: condition do: iteration ... all of these are plain methods!
  37. 37. Not Syntax & conjunction (and) | disjunction (or) + addition < lower than ifTrue: condition do: iteration ... Boolean>> Boolean>> Number>> Magnitude>> Boolean>> Collection>> their classes 3 = 2 ifTrue: [ Error signal: 'Help' ]
  38. 38. 3 kinds of messages Unary messages Binary messages Keywords messages 5 factorial Transcript cr 3 + 4 2 between: 0 and: 5 Transcript show: 'hello world'
  39. 39. postman.send( mail, recipient); Keyword messages
  40. 40. postman.send( mail, recipient); Keyword messages
  41. 41. postman send mail recipient Keyword messages
  42. 42. postman send mail to recipient Keyword messages
  43. 43. postman send: mail to: recipient Keyword messages
  44. 44. postman send: mail to: recipient Keyword messages send:to: method in the Postman class receiver argument 1 argument 2 message send
  45. 45. strings := OrderedCollection new ArrayList<String> strings = new ArrayList<String>(); Some Comparisons
  46. 46. persons collect: [:person | person name] ArrayList<String> strings = new ArrayList<String>(); for(Person person: persons) { strings.add(person.name()); } Some Comparisons
  47. 47. persons collect: #name ArrayList<String> strings = new ArrayList<String>(); for(Person person: persons) { strings.add(person.name()); } Some Comparisons
  48. 48. [ self doSomething ] fork new Thread( new Runnable() { public void run() { this.doSomething();}}).start(); Some Comparisons
  49. 49. (10 between: 1 and: 20 + 2) not false ( ) > Unary > Binary > Keywords
  50. 50. A method definition in Point Method name <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  51. 51. A method definition in Point Argument <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  52. 52. A method definition in Point Comment <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  53. 53. A method definition in Point Return <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  54. 54. A method definition in Point Instance variable <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  55. 55. A method definition in Point Binary message <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  56. 56. A method definition in Point Keyword message <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  57. 57. A method definition in Point Block <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] (2@3) <= (5@6) true
  58. 58. Point>> <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint." ^ x <= aPoint x and: [y <= aPoint y] in books and slides, we specify the class name Class name
  59. 59. Statements and Cascades Temporary variables Statement Cascade | p pen | p := 100@100. pen := Pen new. pen up; goto: p; down; goto: p+p
  60. 60. Anonymous method Passed as method argument or stored f := [:x | x * x + 3]. f value: 2 7 Blocks (aka Closure) BlockClosure>>value:
  61. 61. Block usage Integer>> factorial self = 0 ifTrue: [ ^ 1 ]. self > 0 ifTrue: [ ^ self * (self - 1) factorial ] #(1 2 3) do: [ :each | each crLog ]
  62. 62. Control Structures Every control structure is realized by message sends [ stream atEnd ] whileFalse: [ self process: stream next ]. Magnitude>> max: aMagniture ^ self > aMagnitude ifTrue: [ self ] ifFalse: [ aMagnitude ]
  63. 63. Iterating Collections #(2 3 4 -35 4) collect: [ :each| each abs ] #(2 3 4 35 4)
  64. 64. Iterating Collections #(2 3 4 -35 4) select: [ :each| each odd ] #(-3 -35)
  65. 65. Iterating Collections #(2 3 4 -35 4) do: [ :each| Transcript crShow: each ] 2 3 ...
  66. 66. Pharo, a live programming environment
  67. 67. Demo Modifying classes and methods while the program is running
  68. 68. Nice libraries and frameworks
  69. 69. 'http://picasaweb.google.com/data/feed/ api/all?q=puppy' asUrl retrieveContents
  70. 70. Gofer new smalltalkhubUser: 'PharoExtras' project: 'XMLParser'; loadStable.
  71. 71. data := 'http://picasaweb.google.com/data/ feed/api/all?q=puppy' asUrl retrieveContents. doc := XMLDOMParser parse: data
  72. 72. data := 'http://picasaweb.google.com/data/ feed/api/all?q=puppy' asUrl retrieveContents. doc := XMLDOMParser parse: data. entries := doc allNodesSelect: [ :n | n name = 'entry' ]. entry := entries anyOne. content := entry nodesDetect: [ :n | n name = 'content']. url := content attributeAt: 'src'. 'http://lh3.ggpht.com/[...]/puppy-and-kitten.jpg'
  73. 73. data := 'http://picasaweb.google.com/data/ feed/api/all?q=puppy' asUrl retrieveContents. doc := XMLDOMParser parse: data. path := XPath for: 'entry/content/@src'. urls := path in: doc. url := urls anyOne. 'http://lh3.ggpht.com/[...]/puppy-and-kitten.jpg'
  74. 74. (ZnEasy getGif: url) asMorph openInHand
  75. 75. Your turn
  76. 76. Black magic
  77. 77. Execution Stack as an Object To define exceptions from within the language Debugger support! Advanced debugging Continuation
  78. 78. thisContext returns an object that represents the method invocation can walk (even modify!) the stack
  79. 79. Serializing Continuations [ "some code causing an error" ] on: Error do: [ :error | FLSerializer serialize: error toFileNamed: 'error.fuel' ] Then in a new image open a debugger on the serialized error: FLMaterializer materializeFromFileNamed: 'error.fuel'; debug.
  80. 80. Powerful Breakpoints? Would be so good if we could say: “Stop method bar only if it is called from method named foo” i.e., bar ... Halt whenCalledFrom: #foo. ...
  81. 81. Halt>> whenCalledFrom: aSelector | ctxt | ctxt := thisContext. [ ctxt sender isNil ] whileFalse: [ ctxt := ctxt sender. ctxt selector = aSelector ifTrue: [ self signal ] ]
  82. 82. Pointer Swapping anObject become: anotherObject
  83. 83. | pt1 pt2 ref | pt1 := 0@0. pt2 := 100@100. ref := pt1. pt1 become: pt2. self assert: ref = (100@100). self assert: pt2 = (0@0). self assert: pt1 = (100@100). Pointer Swapping
  84. 84. Some Pharo’s success stories
  85. 85. Continuous API Testing keep your services under control 24/7 Norbert Hartl norbert@2denker.de www.2denker.de
  86. 86. WEBDRUCK.CH Web-To-Print Solution • Design and create individual printed matter • eShop with credit card payment • High quality PDF output with Printing Process integration • Thousands of orders for seven Swiss printing companies
  87. 87. NTed: disaster scenario recovery
  88. 88. iBizLog - http://www.ibizlog.com A product by Smallworks Tuesday, May 15, 12
  89. 89. Pinesoft MBagger
  90. 90. We want more success stories!
  91. 91. We are a cool community
  92. 92. www.10pines.com www.2denker.de www.agilitic.com www.airflowing.com www.anymorphic.com www.ardishealth.com www.beta9.be www.bombardier.com www.cmsbox.com www.finworks.biz seaside.gemstone.com www.ibizlog.com www.inceptive.be www.jooshr.com www.majcon.de www.mindclue.ch www.miriamtech.com www.myneat.org www.netstyle.ch www.objectfusion.fr www.panasoft.com www.pinesoft.co.uk www.promedmedical.net www.sharedlogic.ca www.smallworks.com.ar www.trantaria.com www.square-i.net yesplan.be Companies
  93. 93. University of Bueno Aires University of Bern scg.unibe.ch University of Brussels soft.vub.ac.be/soft/ Ecole des Mines www.ensm-douai.fr Université de Savoie www.imus.univ-savoie.fr Ivan Franko National University of Ukraine Czech Technical University University of Life Sciences in Prague Northen Michigan University www.nmu.edu University Catholic of Argentina www.uca.edu.ar University of Santiago www.uchile.cl Universitat Policnica de Catalunya www.upc.edu Lectures
  94. 94. Lafhis (University of Bueno Aires ) Software Composition Group (scg.unibe.ch) CAR (Ecole des mines www.ensm-douai.fr) RMoD (Inria) Ummisco (IRD) Reveal (University of Lugano) Lysic (University of Bretagne Occidentale) Pleiad (University of Santiago) CEA-List Research Groups
  95. 95. Community Ongoing Work Better widgets, UI Builder (A. Plantec, G. Chambers, B. van Ryseghem) Better browsers (B. van Ryseghem, C. Bruni) Proxy (M. Martinez-Peck) New compiler (J. Ressia/M. Denker/C. Bera/) Vectorial canvas (I. Stasenko) Better FFI (I. Stasenko, E. Lorenzano) Bootstrap (G. Polito/S. Ducasse/N. Bouraqadi/L. Fabresse) PDF generation (O. Auverlot, G. Larcheveque) Network (WebSocket, Oauth, Zinc, Zodiac S. van Caekenberghe)
  96. 96. Consortium & Association How to sustain Pharo? How to structure the community?
  97. 97. Consortium Members Managed by Inria for now Who: companies, institutions, user groups Privileged access to the core development team Influence priorities of the next development Engineering support time Job posts Training/Conferences special prices
  98. 98. Pharo User Association Managed by the Pharo Association Individuals Premium (99 €/year) Normal (40 €/year) Join and participate!
  99. 99. Pharo books Pharo by example translated to french, merci! translated to spanish, gracias! translated to japanese, ありがとう! german started http://pharobyexample.org
  100. 100. New books are coming Deep into Pharo Pharo for the Enterprise A glimpse at VM
  101. 101. Everybody can help Reporting bugs Confirming bugs Writing tests Writing examples Writing comments Simple contributing fixes Discussion, feedback
  102. 102. May 2008 Bern July 2009 Bern October 2009 Lille November 2009 Buenos Aires March 2010 Bern May 2010 Buenos Aires June 2010 Bern June 2010 Bruxelles July 2010 London September 2010 Barcelona September 2010 Lille January 2011 Lille July 2011 Lille October 2011 Bruxelles February 2012 Bern October 2012 Bern April 2012 Lille August 2012 Ghent October 2012 Perto Madryn January 2013 Santiago February 2013 Lille April 2013 Lille June 2013 Lille Open Pharo Sprints
  103. 103. To Take Away Because it is simple and extensible, Pharo is a nice platform to experiment on Use it for your own research (language design or implementation, types, modularity, empirical studies…) http://www.pharo.org

×