CLHS声明“&可选和&休息标记可以出现在值类型列表中;它们表示函数的参数列表,当给予多值调用以及值时,它将正确接收那些价值观。“有人可以解释一下这意味着什么吗?
CLHS在其他地方声明VALUES类型说明符“只能用作函数类型说明符中的值类型或特殊形式”。在这种情况下,我不明白CLHS如何讨论VALUES类型说明符如何“指示函数的参数列表”。这似乎是一个矛盾,更不用说一个不可理喻的说法了。函数的值类型(返回类型)的类型声明如何说明函数(或其他一些函数 - 它不是很清楚)的形式参数?
修改
我在sbcl-help列表中询问了这个问题,并且其中一个开发人员回答“& optional出现,因此VALUES列表被视为完全类似于语法的语法。它对应于具有类型的函数(FUNCTION( SYMBOL& OPTIONAL)*),即一个必须是SYMBOL类型的参数的函数。“
答案 0 :(得分:3)
以下是我对此段落的理解。至少对我来说是有意义的,所以我可以声称理解它:)
我认为它试图说的是(values ...)
形式必须与函数的参数lambda列表兼容,如果从multiple-value-call
调用,它将正确地接收这些参数。
换句话说,假设有两个功能:f
和g
。 f
返回值:(integer &rest more-integers)
- 以人类语言:它可以返回一个或多个整数。然后,如果要调用(multiple-value-call #'g (f))
,您必须(实际上是编译器)确保g
的签名为(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>.