用无值的默认值区分和可选参数

时间:2015-12-26 07:40:36

标签: common-lisp default-value optional-parameters

根据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))

1 个答案:

答案 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

在第一种情况下,指定了可选参数,因此它是作为函数的结果生成的。

在第二种情况下,未指定可选参数,结果是第一个参数。

在最后一种情况下,即使可选参数的值等于默认值,该函数也可以区分实际已经指定了一个参数,并且可以返回该值。