marp | title | description | author |
---|---|---|---|
true |
Le langage Pharo |
Pharo Training |
Nicolas Anquetil |
- Simple et élégant
- Complètement Objet
nil
true
,false
self
super
- (
thisContext
)
- Pas d'instruction de boucle
- Pas d'instruction de test
- Pas d'opérateurs
- Pas d'expressions arithmétiques ou booléennes
- Tout est fait par message
- Affectation :
variable := 5
- Retour de méthode :
^ 42
- Envoi de message :
object aMethod.
- Le point (
.
) comme séparateur d'instruction
- Non typées statiquement
- Doivent être déclarées
- Parmètres de méthodes :
#between: min and: max
- Variables locales (temporaires) :
| x y autreVariable |
- Par convention, nomage CamelCase, jamais de underscore (
_
)
- Nombre :
42
,3.14
,2e25
- Chaîne de caractères :
'This is a String with ''quotes'' !'
- Symbole (chaîne de caractères unique) :
#aSymbol
,#'More complex!'
- Caractères :
$a
,$:
,$'
, ... - Commentaires :
"Il est important de commenter les classes et les méthodes"
- Tableau de litéraux ("literal array") :
#( 1 $a Symbol )
- Tableaux "dynamique" :
{ 1 . 42 . 3+5 }
Valeurs séparées par des points.
et évaluées #( 3+5 ) = { 3 . $+ . 5 }
{ 3+5 } = #( 8 )
- Functions anonymes, "lambda" (en fait Closure)
- Sans paramètres :
[ 'Hello' traceCr ]
- Avec paramètres :
[ :param | 'Hello ' trace. param traceCr ]
- Avec variales locales :
[ :param ||a x| 'Hello ' trace. param traceCr ]
- Peuvent être passés en paramètre (très courant)
- Peuvent être stocké dans des variables (plus rare)
- Exécution
- Sans paramètres :
[ 'Hello' traceCr ] value
- Avec paramètres :
[ :x :y | 'somme=' trace. (x+y) asString traceCr ] value: 5 value: 37
- Sans paramètres :
- Unaires :
100 factorial
,Date today
,#(1 2 3) average
- Binaires :
1 + 2
,1 < 2
,1@2
- Mots clés :
2 between: 10 and: 20
(méthodebetween:and:
) - Priorité dans l'ordre ci-dessus
- Note:
+
,<=
,~=
sont des méthodes pas des opérateurs1 + 2 * 3 = 9
- Envoi de plusieurs messages au même objet
FamixJavaMethod new
name: 'squared' ;
signature: 'squared(int)' ;
mooseModel: FamixJavaModel new ;
yourself.
- If/Then/Else
(1 > 2) ifTrue: [ "bloc then" ] ifFalse: [ "bloc else" ]
- Boucles
10 timesRepeat: [:i | "corps de la boucle" ]
#(Chico Harpo Groucho Zeppo) do: [:marx | "corps de la boucle" ]
[ "test de fin" ] whileTrue: [ "corps de la boucle" ]
- If/Then/Else
(1 > 2) ifTrue: [ "bloc then" ] ifFalse: [ "bloc else" ]
Boolean >> ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
self subclassResponsibility
True >> ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^ trueAlternativeBlock value
False >> ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^ falseAlternativeBlock value
#initialize
constructeur#subclassResponsibility
pour les méthodes abstraites#yourself
retourne le receveur (fin de cascade)#shouldNotImplement
invalide une méthode héritée :-(#halt
,#haltIf: [...]
point d'arrêt (breakpoint)#flag:
ne fait rien, message à l'intention du dévelopeur
- Méthodes "coté classe" (méthodes statique) ex:
new
- Variables de classe
- API reflexive (
Object methods
donne une colelction deCompiledMethod
)
- Inventés dans Squeak (ancêtre de Pharo)
- Collection de méthodes qui sont injectés dans les classes utilisant le trait
- Pas de l'héritage
- Classe utilisatrice peut rejeter, renomer, réimplémenter une méthode de trait
Trait << #FamixTClass
traits: {FamixTPackageable + FamixTPackageable +
(FamixTType - {#queryStaticIncomingAssociations . #queryStaticOutgoingAssociations}) +
FamixTWithAttributes + FamixTWithComments + FamixTWithInheritances +
FamixTWithMethods};
...