以下是我对这段话的理解。至少这对我来说是有意义的,所以我可以声称理解它:)
我认为它想说的是(values ...)
表单必须与函数的参数 lambda 列表兼容,如果从中调用,multiple-value-call
它将正确接收这些参数。
换句话说,假设有两个函数:f
和g
。f
返回值:(integer &rest more-integers)
- 在人类语言中:它可以返回一个或多个整数。然后,如果你想调用(multiple-value-call #'g (f))
你必须(实际上你是一个编译器)确保g
is的签名(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>.