当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用无值的默认值区分和可选参数》经验,为你挑选了1个好方法。

根据功能上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

在第一种情况下,指定了可选参数,以便它作为函数的结果生成.

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

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



1> Renzo..:

根据规范,您可以在可选参数后添加另一个变量名称.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

在第一种情况下,指定了可选参数,以便它作为函数的结果生成.

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

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

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有