在 lambda 列表中,用 lambda 列表关键字 &optional 来标记可选形参。可选形参不是必需的,可以有默认值,还可以指定一个“supplied-p 形参”,它的取值为 “true” 还是 “false”,取决于有没有为该形参提供实参。
(defun optional-parameter (&optional (arg -1)) arg)
(optional-parameter) ; => -1
(optional-parameter 13) ; => 13
可选形参必须放在必需形参之后,但在具名形参或剩余形参之前。 实参先绑定到必需形参,再绑定到可选形参,最后绑定到剩余形参和具名形参。
(defun req-and-opt (req &optional (opt -1)) (list req opt)
(req-and-opt 1) ; => (1 -1)
(req-and-opt 1 13) ; => (1 13)
虽然多种类型的形参可以彼此组合(例如可选形参和关键字形参),但这可能带来问题,应该谨慎处理。 参见《Practical Common Lisp》中“混合不同类型的形参”一节。