区分具有默认值的 &optional 参数和无值

Posted

技术标签:

【中文标题】区分具有默认值的 &optional 参数和无值【英文标题】:Distinguish &optional argument with default value from no value 【发布时间】:2016-03-31 21:10:49 【问题描述】:

根据GigaMonkeys上的Functions,Common Lisp通过&optional支持可选的位置参数,默认值可以任意设置。

默认默认值为nil

(defun function (mandatory-argument &optional optional-argument) ... )

并且默认值可以任意设置

(defun function (mandatory-argument &optional (optional-argument "")) ....)

有没有办法区分可选参数具有显式传入的默认值与根本没有值的情况?

编辑:显然我链接的页面解释了这一点。

有时,知道一个可选的值是否是有用的 参数由调用者提供或者是默认值。相当 而不是编写代码来检查参数的值是否是 默认(无论如何,如果调用者碰巧 显式传递默认值),您可以添加另一个变量名 到默认值表达式之后的参数说明符。这 如果调用者实际提供了一个 此参数的参数,否则为 NIL。按照惯例,这些 变量通常被命名为与实际参数相同的名称 最后是“-supplied-p”。例如:

(defun foo (a b &optional (c 3 c-supplied-p)) 
    (list a b c c-supplied-p))

【问题讨论】:

这也适用于关键字参数。例如,见LISP: Keyword parameters, supplied-p。 这在您提供的同一个链接中得到了回答! 【参考方案1】:

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

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

第二种情况不指定可选参数,结果为第一个参数。

在最后一种情况下,即使可选参数的值等于默认值,该函数也可以辨别出一个参数实际上已经被指定,并且可以返回那个值。 p>

【讨论】:

一个常见的命名约定是使用 p 或 -p 后缀来命名提供的指标。

以上是关于区分具有默认值的 &optional 参数和无值的主要内容,如果未能解决你的问题,请参考以下文章

在具有默认值的反应道具中使用区分联合

具有默认值的选项的javascript设计模式?

groovy中具有默认值的命名参数

具有默认参数值的打字稿条件返回类型

在具有双向绑定的 <select> 中默认 Angular2 <option>

BASH:具有默认参数值的 getopts