Любая функция Common Lisp возвращает 3 значения? - PullRequest
3 голосов
/ 31 января 2009

Любая ли функция Common Lisp (встроенная) возвращает более 2 значений? Я знаю многих, которые возвращают 2, но я не могу вспомнить тот, который возвращает 3.

(Я видел здесь комментарий о возвращении более 2-х значений и пытался придумать случай, когда CL сделал это, но не смог.)

Ответы [ 4 ]

27 голосов
/ 11 февраля 2009

Да, такие функции существуют. Вот полный список функций в пакете 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? указывает, что переменное число значений ожидается. (Только 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))))
7 голосов
/ 08 февраля 2009

время универсального декодирования возвращает девять значений.

4 голосов
/ 31 января 2009

Есть функция get-setf-extension. Возвращает 5 значений.

2 голосов
/ 08 февраля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...