3

Common Lisp (組み込み) 関数は 2 つ以上の値を返しますか? 2 を返すものはたくさん知っていますが、3 を返すものは思いつきません。

(ここで 2 つ以上の値を返すことについてのコメントを見て、CL がこれを行ったができないケースを考えてみました。)

4

4 に答える 4

27

はい、そのような機能は存在します。以下は、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 のみmacroexpandmacroexpand-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))))
于 2009-02-11T10:42:34.047 に答える
7

decode-universal-time は 9 つの値を返します。

于 2009-02-08T08:39:27.593 に答える
4

get-setf-expansion 関数があります。5 つの値を返します。

于 2009-01-30T21:56:00.690 に答える
2

VALUESおよびVALUES-LISTなど。

于 2009-02-08T05:29:53.140 に答える