2011-02-25 7 views
7

Supongamos que me canso de escribir "format t ..." todo el tiempo, y quiero algo con menos teclas.Ampliar el parámetro a & rest en Common Lisp

así que escribir esto:.

(defun puts (fstring &rest vars) 
    (format t fstring vars)) 

(puts "~a ~a" 1 2) 

;; error message results, because vars became (1 2) 

Ahora, vars se ha transformado en una lista de cualquier params pasé en Tiene que ser "ampliado" hacia fuera en una lista de valores.

¿Cuál es la solución típica para este problema?

Respuesta

11

Puede usar apply para eso: (apply #'format t fstring vars) amplía vars en argumentos separados a format.

+0

Gracias. Siempre me encuentro con este problema, pero nunca puedo recordar o averiguar qué hacer. –

2

Además apply, existe también la posibilidad de hacer esto con una macro en el que se puede utilizar para empalmar ,@ listas dentro de acentos graves:

(defmacro puts (fstring &rest vars) 
    `(format t ,fstring ,@vars)) 
+1

Lo he hecho también, pero las macros y yo todavía no nos sentimos lo suficientemente cómodas. :-) –

+0

Se prefieren las funciones, ya que son más fáciles de usar. –

+0

@Rainer: Sé que las funciones deberían preferirse si no hay un requisito específico para usar una macro, pero en el contexto del título de esta pregunta (parámetros de expansión y descanso) me pareció digno de atención que haya respaldo especial para esto en las comillas inversas. –