Skip to main content

Les formes impératives

Références

Une référence est un objet correspondant à une adresse mémoire et donc l'indirection est faite automatiquement dans toute situation où une valeur est requise. L'adresse associée à une référence n'est pas directement manipulable en tant que telle (il n'existe pas d'opérations pour le programmeur sur les références)

  • Un symbole est lié à une référence, correspondant à un atome ou une paire pointée
  • L'évaluation d'un symbole renvoie une référence vers sa valeur
  • La référence est utilisée partout où la valeur n'est pas requise

Passage d'arguments

Soit ff une fonction, soient p1,p2,...pnp_1,p_2, ... p_n ses paramètres formels. Soit l'application

\texttt{(f a_1 a_2 ... a_n)}

Soient r1,r2...rnr_1, r_2 ... r_n les références vers les résultats des évaluations respectives des arguments a1,a2,...ana_1, a_2, ... a_n

Lors de l'application, un environnement local est construit. Il est constitué des liaisons entre les paramètres formels pip_i de la fonction ff et les références rir_i des arguments de l'application

\texttt{((p_1.r_1)(p_2.r_2)...(p_n.r_n))}

Les références r1,r2,...,rnr_1,r_2,..., r_n sont utilisées comme des valeurs à travers les symboles p1,p2,...,pnp_1, p_2, ..., p_n, les indirections étant effectuées automatiquement. Ainsi, il est impossible de modifier un paramètre pip_i car la modification reste locale à cet environnement.

L'affectation

La forme set!set!

(set! <id> <e>)\texttt{(set! <id> <e>)}

  • La référence associée à l'identificateur <id><id> est remplacée par la référence du résultat de l'évaluation de l'expression <e><e>.

  • La valeur de retour de l'affectation est la valeur #<void>\#<void> que la fonction readread n'affiche pas. La procédure voidvoid rend ce même résultat en prenant un nombre quelconque d'arguments

Modification de paires pointées

On ne peut pas modifier les paires pointées de base dans la norme scheme. En Racket, il faut utiliser le paquetage mpairmpair.

Blocs d'expression

Certaines expressions pouvant effectuer des effets de bord, il devient possible de les mettre en séquence. Contrairement aux formes letlet et lambdalambda, certaines formes, telle le ifif nécessitent d'utiliser une forme spéciale de mise en séquence.

Les forme beginbegin

\texttt{(begin <e_1> <e_2> ... <e_n>)}

  • Chaque expression eie_i est évaluée selon son ordre d'apparition
  • Le résultat de l'évaluation de la séquence est celui de la dernière
  • Les valeurs des évaluations des expressions précédentes sont perdues
  • Il existe une forme begin0begin0 qui renvoie le résultat de la première expression de la séquence