Pregunta

¿Alguno de Common Lisp (builtin) función de retorno de más de 2 valores?Sé que muchos de retorno de 2, pero no puedo pensar en uno que devuelve 3.

(Vi un comentario aquí sobre la devolución de más de 2 valores, y trató de pensar en un caso donde CL hizo esto, pero no puede.)

¿Fue útil?

Solución

Hay una función get-setf-expansion. Devuelve 5 valores.

Otros consejos

Sí, existen funciones.Aquí está la lista completa de las funciones en el COMMON LISP paquete que devolver exactamente tres valores, tal como se declara en SBCL código fuente:

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

Además, las siguientes funciones devuelven un número constante de los valores mayores de tres:

DECODE-UNIVERSAL-TIME                   required: 9, optional: 0, rest?: NIL
GET-DECODED-TIME                        required: 9, optional: 0, rest?: NIL

Estas funciones devuelven un número variable de valores, por lo tanto, posiblemente más de tres:

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

Explicaciones de las columnas: required es el número mínimo de valores de retorno para estas funciones, optional un número fijo de valores de retorno que SBCL piensa que podría o no podría ser devuelto, rest? indica que un número variable de valores que se espera.(Sólo macroexpand y macroexpand-1 en realidad el uso y opcionales, no me pregunten por qué).

Y sólo por diversión, aquí está el código fuente que utiliza para llegar con estas tablas:

(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 devuelve nueve valores.

VALUES y VALUES-LIST , entre otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top