Après les paramètres requis, on aura éventuellement des paramètres facultatifs (en Anglais : optional parameters). Le début des paramètres facultatifs (et donc la fin des paramètres requis) est signalé par le symbole &optional. Exemple :
* (defun f (a b &optional c d)
(list a b c d))
F
* (f 1 2)
(1 2 NIL NIL)
* (f 1 2 3)
(1 2 3 NIL)
* (f 1 2 3 4)
(1 2 3 4)
*
Chaque paramètre facultatif peut être indiqué de trois manières différentes. Dans l'exemple ci-dessus, il est indiqué par un symbole simple. Dans ce cas, la valeur par défaut (si l'argument correspondant n'est pas fourni) est nil.
Il est possible de préciser une valeur par défaut pour un paramètre facultatif. On remplace le symbole simple par une liste de deux éléments, la variable et l'expression à évaluer si le paramètre n'est pas fourni. L'expression sera évaluée à chaque fois que le paramètre n'est pas fourni. Exemple :
* (defparameter *l* (list 9 8 7 6 5 4 3 2 1))
*L*
* (defun f (a b &optional c (d (pop *l*)))
(list a b c d))
F
* (f 1 2 3 4)
(1 2 3 4)
* (f 1 2 3)
(1 2 3 9)
* (f 1 2 3)
(1 2 3 8)
* (f 1 2)
(1 2 NIL 7)
* (f 1 2)
(1 2 NIL 6)
*