只返回其参数的函数?

Ell*_*son 8 common-lisp

在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)

sds*_*sds 10

看看identity:

功能 IDENTITY

句法:

身份 对象对象

论点和价值观:

对象 - 对象.

描述:

返回其参数对象.

顺便说一下,ANSI CL标准规定了近千个符号.你不可能一夜之间学会它们.此外,Lisp是一种具有丰富历史的语言,因此如果您想要"通用"的东西,很可能是语言提供的,或者某些(半)标准库.

问一下!不要重新发明自行车.


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)

在你的情况下,这可能不是一个很大的区别,但它将避免额外的函数调用.通常,这可能很有用,因为它可以更容易地将关键参数传递给库函数,而不必担心它们是否为零.