Il est possible pour le receveur d'un message de s'envoyer un message. La construction syntaxique pour cela est la pseudo variable self , qui désigne le receveur. Nous définissons ainsi des méthodes récursives , comme la fonction factorielle. La fonction factorielle est définie dans la classe des entiers. Le corps de la méthode est une alternative sur la valeur de l'entier. Si l'entier est nul alors la factorielle est égale à 1 sinon elle est égale au produit de l'entier par la factorielle de son précédent.
factorielle
``rend la valeur factorielle du receveur''
self = 0
ifTrue: [^1]
ifFalse: [^self * (self -1) factorielle]
En Smalltalk, une expression alternative est est codée par un envoi de message à un objet expr_bool de type booléen (de classe Boolean) : expr_bool ifTrue:[bloc1] ifFalse: [bloc2]. Cet envoi de message a deux paramètres de type bloc. Un bloc est une suite d'instruction évaluée uniquement à l'exécution. La notion de bloc est détaillée dans la section 3.4.2. L'envoi de message est évalué comme suit : si le booléen est vrai le bloc bloc1 est exécuté sinon le bloc bloc2 est exécuté. Notez que le retour du résultat d'une opération se fait en préfixant par ^ . Il s'agit d'une sortie inconditionnelle de la méthode en cours.