Ein optionaler Parameter wird durch das Lambda-Listen-Schlüsselwort &optional in einer Lambda-Liste gekennzeichnet. Optionale Parameter sind nicht erforderlich, können einen Standardwert haben und außerdem einen „supplied-p“-Parameter angeben, der „wahr“ oder „falsch“ ist, je nachdem, ob ein Argument für den Parameter übergeben wurde.
(defun optional-parameter (&optional (arg -1)) arg)
(optional-parameter) ; => -1
(optional-parameter 13) ; => 13
Optionale Parameter müssen nach den erforderlichen Parametern, aber vor benannten oder Restparametern stehen. Argumente werden zuerst an erforderliche Parameter gebunden, dann an optionale Parameter und schließlich an Restparameter und benannte Parameter.
(defun req-and-opt (req &optional (opt -1)) (list req opt)
(req-and-opt 1) ; => (1 -1)
(req-and-opt 1 13) ; => (1 13)
Mehrere Parametertypen können zwar mit anderen Parametertypen kombiniert werden (optionale und Schlüsselwortparameter), aber das kann problematisch sein und sollte mit Bedacht erfolgen. Sieh dir den Abschnitt „Verschiedene Parametertypen mischen“ in Practical Common Lisp an.