Common Lisp (組み込み) 関数は 2 つ以上の値を返しますか? 2 を返すものはたくさん知っていますが、3 を返すものは思いつきません。
(ここで 2 つ以上の値を返すことについてのコメントを見て、CL がこれを行ったができないケースを考えてみました。)
Common Lisp (組み込み) 関数は 2 つ以上の値を返しますか? 2 を返すものはたくさん知っていますが、3 を返すものは思いつきません。
(ここで 2 つ以上の値を返すことについてのコメントを見て、CL がこれを行ったができないケースを考えてみました。)
はい、そのような機能は存在します。以下は、SBCL ソース コードで宣言されているように、正確に 3 つの値を返す COMMON-LISP パッケージの関数の完全なリストです。
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
さらに、次の関数は、3 より大きい定数の値を返します。
DECODE-UNIVERSAL-TIME required: 9, optional: 0, rest?: NIL
GET-DECODED-TIME required: 9, optional: 0, rest?: NIL
これらの関数は可変数の値を返すため、3 つ以上になる可能性があります。
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?
、可変数の値が期待されることを示します。(&optional のみmacroexpand
をmacroexpand-1
実際に使用します。理由は聞かないでください。)
念のため、これらのテーブルを作成するために使用したソース コードを次に示します。
(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))))
decode-universal-time は 9 つの値を返します。
get-setf-expansion 関数があります。5 つの値を返します。
VALUESおよびVALUES-LISTなど。