, , ,

ref

En Abstrasy, le type «ref» fournit le dispositif d'indirection qui permettent de manipuler les données à l'aide de références et non directement leurs valeurs. On les appelle donc aussi à juste raison «cellules d'indirection».

Une cellule d'indirection est en effet un conteneur abstrait qui peut contenir une donnée, ou plus précisément la référence d'une donnée. La donnée en elle-même n'est pas physiquement stockée dans la cellule, mais la cellule contient la référence de cette donnée dans la mémoire de l'ordinateur et offre les méthodes qui permettent d'accéder à cette donnée et de la manipuler d'une manière transparente.

Ainsi, lorsque vous utilisez des variables mutables, vous manipulez des données à l'aide de cellules d'indirection. Comme il s'agit d'un type très abstrait, vous le faites sans vraiment vous en rendre compte.

(define '$a 1)
(set! $a (+ $a 10))
(display $a)

11

Dans l'exemple ci-dessus, nous déclarons et initialisons une variable mutable $a. Ensuite, nous lui affectons une nouvelle valeur. Et enfin, nous l'affichons dans la console.

En réalité, le symbole $a est assigné à une cellule d'indirection (un contenant abstrait du type «ref») qui permet de manipuler les références des différentes valeurs que la variable reçoit.

Comme vous pouvez le constater, il n'y aucun appel explicite du constructeur ou des méthodes du type «ref» lorsqu'on utilise des variables mutables. L'utilisation de ce type de donnée est totalement transparent.

Toutefois, l'évaluation des cellules d'indirection est toujours tardive. Ainsi, dans l'exemple ci-dessus, l'opérateur set! reçoit bien un type ref et non directement la valeur contenue par la cellule.

Si on teste le prédicat ref?, on obtient bien la confirmation que la variable $a est associée à une cellule d'indirection.

(define '$a 1)
(display (ref? $a))

(true)

Cette évaluation tardive est largement utilisée par d'autres conteneurs abstraits plus sophistiqués comme les vecteurs par exemple.

(define 'v (vector 4))
(set! (v 0) "zéro")
(set! (v 1) "un")
(set! (v 2) "deux")
(set! (v 3) "trois")
(display (v 0) "... " (v 1) "... " (v 2) "... " (v 3) "... ")

zéro... un... deux... trois... 

Les vecteurs stockent les données dans un tableau de cellules d'indirection. Lorsqu'on appelle un objet vector avec un numéro d'index en argument, on obtient la cellule d'indirection où est enregistré la donnée. L'opérateur set! peut alors utiliser la référence pour affecter l'élément spécifié. Ceci ne serait pas possible sans une évaluation tardive des cellules d'indirection.


Opérateurs