Common lisp 只返回其参数的函数?

Common lisp 只返回其参数的函数?,common-lisp,Common Lisp,在Common Lisp中,标准库中是否有一个函数只返回给定的参数(即不操作数据)?此函数相当于(lambda(x)x)。我希望使用它作为可选参数的默认值。例如,这样一个函数将替换以下内容中的(lambda(x)x): (defun some-function (value &optional (transformation (lambda (x) x))) (other-function (funcall transformation value)) 查看标识: 作用 语法: 标

在Common Lisp中,标准库中是否有一个函数只返回给定的参数(即不操作数据)?此函数相当于
(lambda(x)x)
。我希望使用它作为可选参数的默认值。例如,这样一个函数将替换以下内容中的
(lambda(x)x)

(defun some-function (value &optional (transformation (lambda (x) x)))
  (other-function (funcall transformation value))

查看
标识

作用 语法: 标识对象和右箭头;反对

参数和值: 反对

说明: 返回其参数对象

顺便说一句,ANSI CL标准规定了近千个符号。 你不可能在一夜之间学会所有这些。 此外,Lisp是一种有着丰富历史的语言,因此,如果您想要一些“通用”的东西,很可能是该语言提供了这种功能,或者某些(半)标准库提供了这种功能

请走开!不要重新发明自行车

描述了identity函数,它符合您要求的规范:它几乎就是
(lambda(x)x)
。但是,值得注意的是,在

(defun some-function (value &optional (transformation (lambda (x) x)))
  (other-function (funcall transformation value))
将您的转换描述为键,并让nil指示不应将键函数应用于值,这可能更为惯用。这种行为存在于许多常见的Lisp函数中。例如,成员获取一个关键参数,该参数应用于序列的每个元素,以生成一个值,该值与正在搜索的项进行比较:

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)
默认行为与传递标识作为键时相同:

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)
但是,默认值不是identity,而是nil。的HyperSpec说明了关键点:

键—一个参数函数的指示符,或nil

其中规定:

如果提供了:key参数,则它是的函数的指示符 每个Ei调用一个参数作为参数,并产生一个 要用于比较的对象。(如果没有:关键参数,Zi) 是Ei。)

如果您想采用这种类型的约定,那么您的代码应该是

(defun some-function (value &optional transformation)
  (other-function (if (null transformation) value (funcall transformation value))))

在您的情况下,这可能没有太大的区别,但它将避免额外的函数调用。一般来说,这会很有帮助,因为这样可以更容易地将关键参数传递给库函数,而不必担心它们是否为nil

要展开一点,当您有一个参数时,
#identity
将返回其参数
#'list
将以列表的形式返回多个参数,而
#'value
将以多个值的形式返回它们,它们的用途相同,但实际上有一个非常不同的API。

identity
是您正在寻找的东西。一个人不能引用给定的参数,让它自己计算吗?因为您说的是惯用的,稍微好一点的代码是沿着以下几行重写if表单:
(定义某个函数(值和可选转换)(其他函数(if转换(funcall转换值)值))
@user1597986很可能是这样。虽然我非常喜欢使用动态类型语言(如Common Lisp),但我确实发现,从静态类型的角度考虑很方便,所以通常使用
(if(null x)…)
而不是
(if x…)
,当
x
在概念上不是布尔值时。除此之外,我通常喜欢将较简单的情况作为结果,将较复杂的情况作为替代,因此我更喜欢让我编写
(if…value(funcall transformation value))
而不是
(if…(funcall转换值)值)
。这些都是实现细节…@user1597986…尽管如此。由于这是一个其他人会使用但看不到其实现的函数,唯一公开的惯用或非惯用部分是nil as转换是否具有与identity相同的效果。这是其他用户将看到的部分,而不是实现N