gpt4 book ai didi

return-value - 是否有任何 Common Lisp 函数返回 3 个值?

转载 作者:行者123 更新时间:2023-12-04 04:11:45 31 4
gpt4 key购买 nike

是否有任何 Common Lisp(内置)函数返回超过 2 个值?我知道很多返回 2,但我想不出一个返回 3。

(我在这里看到一条关于返回超过 2 个值的评论,并试图考虑 CL 这样做的情况,但不能。)

最佳答案

是的,存在这样的功能。以下是 COMMON-LISP 包中函数的完整列表,这些函数恰好返回三个值,如 SBCL 源代码中声明的那样:

COMPILE                                 required: 3, optional: 0, rest?: NIL
INTEGER-DECODE-FLOAT required: 3, optional: 0, rest?: NIL
COMPILE-FILE required: 3, optional: 0, rest?: NIL
GET-PROPERTIES required: 3, optional: 0, rest?: NIL
FUNCTION-LAMBDA-EXPRESSION required: 3, optional: 0, rest?: NIL
DECODE-FLOAT required: 3, optional: 0, rest?: NIL
RENAME-FILE required: 3, optional: 0, rest?: NIL

此外,以下函数返回大于三个的常量数量的值:
DECODE-UNIVERSAL-TIME                   required: 9, optional: 0, rest?: NIL
GET-DECODED-TIME required: 9, optional: 0, rest?: NIL

这些函数返回可变数量的值,因此可能超过三个:
NO-APPLICABLE-METHOD                    required: 0, optional: 0, rest?: T
NO-NEXT-METHOD required: 0, optional: 0, rest?: T
VALUES required: 0, optional: 0, rest?: T

(I've omitted some functions from this list where SBCL does not declare
a values type explicitly. get-setf-expansion is one of them.)

栏目说明: required是这些函数的最小返回值数, optional SBCL 认为可能会或可能不会返回的固定数量的返回值, rest?表示预期的值数量可变。 (只有 macroexpandmacroexpand-1 实际使用 &optional,别问我为什么。)

只是为了好玩,这里是我用来想出这些表的源代码:
(do-external-symbols (sym :common-lisp)                                         
(when (fboundp sym)
(multiple-value-bind (required optional rest)
(let ((fun-type (sb-int:info :function :type sym)))
(etypecase fun-type
(sb-kernel:fun-type
(let ((returns
(sb-kernel:fun-type-returns fun-type)))
(etypecase returns
(sb-kernel:values-type
(values (length (sb-kernel:values-type-required returns))
(length (sb-kernel:values-type-optional returns))
(sb-kernel:values-type-rest returns)))
(sb-kernel:named-type
(if (sb-kernel:named-type-name returns)
(values 1 0 t)
(values 0 0 nil))))))
(t
(values 0 0 t))))
(format t
"~A~40Trequired: ~D, optional: ~D, rest?: ~A~%"
sym
required optional rest))))

关于return-value - 是否有任何 Common Lisp 函数返回 3 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497229/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com