Optional parameters can be specified after required parameters, by using &OPTIONAL
keyword. There may be multiple optional parameters after it.
(defun foobar (x y &optional z)
(format t "X (~s) and Y (~s) are required.~@
Z (~s) is optional.~%"
x y z))
(foobar 10 20)
; X (10) and Y (20) are required.
; Z (NIL) is optional.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional.
;=> NIL
A default value can be given for optional parameters by specifying the parameter with a list; the second value is the default. The default value form will only be evaluated if the argument was given, so it can be used for side-effects, such as signalling an error.
(defun foobar (x y &optional (z "Default"))
(format t "X (~s) and Y (~s) are required.~@
Z (~s) is optional.~%"
x y z))
(foobar 10 20)
; X (10) and Y (20) are required.
; Z ("Default") is optional.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional.
;=> NIL
A third member can be added to the list after the default value; a variable name that is true if the argument was given, or NIL
if it wasn't given (and the default is used).
(defun foobar (x y &optional (z "Default" zp))
(format t "X (~s) and Y (~s) are required.~@
Z (~s) is optional. It ~:[wasn't~;was~] given.~%"
x y z zp))
(foobar 10 20)
; X (10) and Y (20) are required.
; Z ("Default") is optional. It wasn't given.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional. It was given.
;=> NIL