2011-02-11 14 views

Respuesta

19

Indica que el siguiente argumento es el argumento "resto". En el caso de su ejemplo, sequences es el argumento de resto.

A diferencia de un argumento normal, el argumento de resto consumirá el "resto" de los parámetros proporcionados por el usuario. Es una forma de hacer una función que acepta una cantidad variable de argumentos. Dentro del cuerpo de la función, el argumento será una lista que contiene todos los parámetros adicionales.

Así que si había una función que parecía (add &rest numbers), entonces se podría llamar como (add 1 2 3 4 5), y dentro de la función del argumento numbers tendría el valor (1 2 3 4 5).

O por ejemplo, ((lambda (a &rest r) r) 1 2 3) ;=> (2 3)

+0

gracias. Su respuesta es muy explícita. –

+4

Vale la pena señalar que la función 'apply' funciona muy bien junto con la función' & rest', ya que 'apply' requiere que su argumento final sea una lista de argumentos. Entonces, si necesita aceptar una cantidad variable de argumentos para pasarlos a otra función, estas dos características lo hacen conveniente. – phils

10

Cualquier argumento siguientes el símbolo resto & en una definición de función serán recogidos en un único objeto lista. Así, en el caso de (anexar & secuencias de descanso), si se llama a la función:

(append 1) 

las secuencias variables serán la lista (1) en el cuerpo de la función. Si lo llama como

(append 1 2 3) 

las secuencias variables serán la lista (1 2 3) en el cuerpo de la función. Esto se explica en el manual de referencia de Elisp, en el argument list node.

(info "(elisp)Argument List") 
2

elisp/Common Lisp &rest es análogo al parámetro *args en Python

Si pones esto en su repl Common Lisp y llamar a foo con número de argumentos variable, se verá qué pasa con bastante rapidez.

(defun foo (a b &rest trailing) 
    (format t "~a :: ~a :: ~a~%" a b trailing))