Paramètres mots-clés

Le paramètre reste peut être suivi d'une suite de paramètres mot-clés. Le début de la suite est signalé par le symbole &key. Un paramètre mot-clé peut être un symbole. Pour passer l'argument correspondant, deux arguments doivent être passés, le nom du paramètre et sa valeur. Le nom est indiqué par un symbole dont le nom est précédé de `:' (ce qui veut dire qu'il s'agit d'un symbole dans le paquetage des mots-clés. Si l'argument correspondant n'a pas été passé, la valeur du paramètre sera nil. Exemple :

* (defun f (x &key y z)
    (list x y z))

F
* (f 1)

(1 NIL NIL)
* (f 1 :y 2)

(1 2 NIL)
* (f 1 :z 3)

(1 NIL 3)
* (f 1 :z 3 :y 2)

(1 2 3)
* (f 1 :y 2 :z 3)

(1 2 3)
*

Un paramètre mot-clé peut être accompagné d'une expression à évaluer si l'argument correspondant n'est pas fourni. Exemple :

* (defun f (x &key (y (cons 'a 'b)) z)
    (list x y z))

F
* (f 1)

(1 (A . B) NIL)
* (f 1 :y 2)

(1 2 NIL)
* (f 1 :z 3)

(1 (A . B) 3)
*

Comme avec les paramètres facultatifs, il est possible de détecter si l'argument correspondant a été fourni. Exemple :

* (defun f (x &key (y 25 y-supplied-p))
    (list x y y-supplied-p))

F
* (f 1)

(1 25 NIL)
* (f 1 :y 25)

(1 25 T)
*

Si le symbole &allow-other-keys fait suite aux paramètres mots-clés, alors il est possible de passer d'autres couples (mot-clé, valeur) en arguments. Ces arguments seront simplement ignorés :

* (defun f (x &key y &allow-other-keys)
    (list x y))

F
* (f 23)

(23 NIL)
* (f 23 :y 2)

(23 2)
* (f 23 :y 2 :lskdfjs 22)

(23 2)
*

Ce mécanisme est plus utile en combinaison avec &rest, car le paramètre &rest contient toujours l'ensemble des couples mot-clé et valeur correspondante passés en arguments :

* (defun f (x &rest r &key y &allow-other-keys)
    (list x y r))

F
* (f 23)

(23 NIL NIL)
* (f 23 :y 2)

(23 2 (:Y 2))
* (f 23 :y 2 :lsdfjs 22)

(23 2 (:Y 2 :LSDFJS 22))
*

Irene DURAND
2011-10-14