在Common Lisp中,标准库中是否有一个函数只返回给定的参数(即不操作数据)?这个功能相当于(lambda (x) x).我希望将它用作可选参数的默认值.例如,这样的函数将替换(lambda (x) x)为:
(defun some-function (value &optional (transformation (lambda (x) x)))
(other-function (funcall transformation value))
Run Code Online (Sandbox Code Playgroud)
Jos*_*lor 10
sds的答案描述了身份功能,它符合您要求的规范:它几乎就是(lambda (x) x).但是,值得注意的是,在一个类似的功能
(defun some-function (value &optional (transformation (lambda (x) x)))
(other-function (funcall transformation value))
Run Code Online (Sandbox Code Playgroud)
它可能是更地道来形容你的改造作为重点,并让零表示没有键功能应适用于该值.许多 Common Lisp函数中都存在此行为.例如,member接受一个键参数,该参数应用于序列的每个元素,以生成与要搜索的项目进行比较的值:
CL-USER> (member nil '(1 2 3 4 nil 5 6 7 8))
(NIL 5 6 7 8)
CL-USER> (member nil '(1 2 3 4 nil 5 6 7 8) :key 'oddp)
(2 3 4 NIL 5 6 7 8)
Run Code Online (Sandbox Code Playgroud)
默认行为与将标识作为键传递时相同:
CL-USER> (member nil '(1 2 3 4 nil 5 6 7 8))
(NIL 5 6 7 8)
CL-USER> (member nil '(1 2 3 4 nil 5 6 7 8) :key 'identity)
(NIL 5 6 7 8)
Run Code Online (Sandbox Code Playgroud)
但是,默认值不是 标识,而是nil.成员的HyperSpec 说关键:
key - 一个参数的函数的指示符,或者nil.
这在17.2.1满足双论证测试中规定,该测试表明:
如果提供了:key参数,则它是一个参数的指示符,用于将每个Ei作为参数调用一个参数,并产生一个用于比较的对象Zi.(如果没有:关键参数,Zi就是Ei.)
如果你想采用这种类型的约定,那么你的代码就是这样的
(defun some-function (value &optional transformation)
(other-function (if (null transformation) value (funcall transformation value))))
Run Code Online (Sandbox Code Playgroud)
在你的情况下,这可能不是一个很大的区别,但它将避免额外的函数调用.通常,这可能很有用,因为它可以更容易地将关键参数传递给库函数,而不必担心它们是否为零.
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |