¿Alguno de Common Lisp función de devolución de 3 valores?
-
20-08-2019 - |
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.)
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.