根据功能上GigaMonkeys,Common Lisp中通过支持可选的位置参数&optional
和默认值可任意设定.
默认默认值为nil
.
(defun function (mandatory-argument &optional optional-argument) ... )
并且可以任意设置默认值
(defun function (mandatory-argument &optional (optional-argument "")) ....)
有没有办法区分可选参数显式传递的默认值vs根本没有值的情况?
编辑:显然我链接的页面解释了这一点.
有时,了解可调参数的值是由调用者提供还是默认值很有用.而不是编写代码来检查参数的值是否是默认值(无论如何,如果调用者恰好传递默认值),您可以在默认值之后向参数说明符添加另一个变量名称表达.如果调用者实际为此参数提供了参数,则此变量将绑定为true,否则为NIL.按照惯例,这些变量通常被命名为与实际参数相同,末尾带有"-supplied-p".例如:
(defun foo (a b &optional (c 3 c-supplied-p)) (list a b c c-supplied-p))
Renzo.. 11
根据规范,您可以在可选参数后添加另一个变量名称.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
在第一种情况下,指定了可选参数,以便它作为函数的结果生成.
在第二种情况下,未指定可选参数,结果是第一个参数.
在最后一种情况下,即使可选参数的值等于默认值,该函数也可以区分实际已经指定了参数,并且可以返回该值.
根据规范,您可以在可选参数后添加另一个变量名称.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
在第一种情况下,指定了可选参数,以便它作为函数的结果生成.
在第二种情况下,未指定可选参数,结果是第一个参数.
在最后一种情况下,即使可选参数的值等于默认值,该函数也可以区分实际已经指定了参数,并且可以返回该值.