【问题标题】:Does any Common Lisp function return 3 values?是否有任何 Common Lisp 函数返回 3 个值?
【发布时间】:2009-01-30 21:01:55
【问题描述】:

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

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

【问题讨论】:

    标签: return-value common-lisp


    【解决方案1】:

    是的,存在这样的功能。下面是 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
    

    此外,以下函数会返回大于 3 的常数值:

    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))))
    

    【讨论】:

      【解决方案2】:

      decode-universal-time 返回九个值。

      【讨论】:

        【解决方案3】:

        有一个get-setf-expansion函数。它返回 5 个值。

        【讨论】:

          【解决方案4】:

          VALUESVALUES-LIST 等。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-29
            • 1970-01-01
            • 1970-01-01
            • 2017-10-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多