根据GigaMonkeys上的Functions,Common Lisp通过&optional
支持可选的位置参数,默认值可以任意设置。
默认默认值为nil
。
(defun function (mandatory-argument &optional optional-argument) ... )
,默认值可以任意设置
(defun function (mandatory-argument &optional (optional-argument "")) ....)
有没有办法区分可选参数显式传递的默认值vs根本没有值的情况?
编辑:显然我链接的页面解释了这一点。
有时,了解可选项的值是否有用 参数由调用者提供或是默认值。宁 而不是编写代码来检查参数的值是否为 默认(如果调用者碰巧,它无论如何都不起作用 显式传递默认值),您可以添加另一个变量名称 到default-value表达式之后的参数说明符。这个 如果调用者实际提供了一个变量,则变量将被绑定为true 此参数的参数和NIL否则。按惯例,这些 变量通常与a的实际参数命名相同 " -supplied-P"最后。例如:
(defun foo (a b &optional (c 3 c-supplied-p))
(list a b c c-supplied-p))
答案 0 :(得分:10)
根据specification,您可以在可选参数后添加另一个变量名称。如果指定了可选参数,则此变量将绑定到t
,否则将绑定到nil
。
例如:
CL-USER> (defun foo (mandatory &optional (optional1 nil optional1-supplied-p))
(if optional1-supplied-p
optional1
mandatory))
FOO
CL-USER> (foo 3 4)
4
CL-USER> (foo 3)
3
CL-USER> (foo 3 nil)
NIL
在第一种情况下,指定了可选参数,因此它是作为函数的结果生成的。
在第二种情况下,未指定可选参数,结果是第一个参数。
在最后一种情况下,即使可选参数的值等于默认值,该函数也可以区分实际已经指定了一个参数,并且可以返回该值。