4

CLHS 声明“&optional 和 &rest 标记可以出现在值类型列表中;它们指示函数的参数列表,当与值一起提供多值调用时,将正确接收这些值。” 有人可以解释一下这是什么意思吗?

CLHS 在别处声明 VALUES 类型说明符“只能用作函数类型说明符或特殊形式中的值类型”。既然如此,我不明白 CLHS 怎么能谈论 VALUES 类型说明符如何“指示函数的参数列表”。这似乎是一个矛盾,更不用说一个高深莫测的说法。函数的值类型(返回类型)的类型声明如何说明函数的(或其他函数的——它不是很清楚)形式参数?

编辑:

我在 sbcl-help 列表上问了这个问题,其中一位开发人员回答“出现 & optional,因此 VALUES 列表被视为完整的类似参数的语法。它对应于类型为 (FUNCTION (SYMBOL &OPTIONAL) *) 的函数,即只有一个参数的函数,该参数必须是 SYMBOL 类型。”

4

1 回答 1

3

以下是我对这段话的理解。至少这对我来说是有意义的,所以我可以声称理解它:)

我认为它想说的是(values ...)表单必须与函数的参数 lambda 列表兼容,如果从中调用,multiple-value-call它将正确接收这些参数。

换句话说,假设有两个函数:fgf返回值:(integer &rest more-integers)- 在人类语言中:它可以返回一个或多个整数。然后,如果你想调用(multiple-value-call #'g (f))你必须(实际上你是一个编译器)确保gis的签名(ftype (function (integer &rest more-integers) t))。的返回类型g无关紧要。

这是我尝试做一个例子来说明它:

CL-USER> (declaim (ftype (function () (values integer &rest more-integers)) f))
; No value
CL-USER> (defun f () (values 1 2))
F
CL-USER> (declaim (ftype (function (integer &rest more-integers) t) g))
; No value
CL-USER> (defun g (x &rest rest) (reduce #'+ rest :initial-value x))
G
CL-USER> (multiple-value-call #'g (f))
3
CL-USER> (declaim (ftype (function (single-float) t) x))
; No value
CL-USER> (defun x (y) y)
X
CL-USER> (multiple-value-call #'g (x 1.5))
; Evaluation aborted on #<TYPE-ERROR expected-type: INTEGER datum: 1.5>.
于 2013-10-21T10:52:08.673 回答