swap!! permet de permuter le contenu de deux cellules d'indirection «ref». Il s'agit d'un opérateur d'affectation qui produit un effet de bord.
La forme générale de swap!! est la suivante:
(swap!! <ref1> <ref2>)
La permutation doit respecter la règle du type dynamique fort. Cela signifie qu'il n'est pas possible de permuter des cellule qui contiennent des valeurs de types différents.
(define '$a 0) (define '$b 1) (swap!! $a $b) (display "$a = " $a) (display "$b = " $b)
⇒
$a = 1 $b = 0
Il est toutefois possible de permuter le contenu des cellule indépendamment du type si au moins une des deux contient (nothing).
(define '$a 0) (define '$b (nothing)) (swap!! $a $b) (display "$a = " $a) (display "$b = " $b)
⇒
$a = (nothing) $b = 0
Attention, notez que swap!! n'est pas une opération atomique. Elle ne devrait pas être utilisée dans une section critique sans synchronisation.