Расширение параметра & rest в Common Lisp - PullRequest
7 голосов
/ 26 февраля 2011

Предположим, я устал от написания "format t ..." все время и хочу что-то немного меньше нажатий клавиш.

Итак, я пишу это:

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

(puts "~a ~a" 1 2)

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

Теперь vars был преобразован в список любых параметров, которые я передал. Его нужно "развернуть" в список значений.

Какое типичное решение этой проблемы?

Ответы [ 2 ]

11 голосов
/ 26 февраля 2011

Для этого можно использовать apply: (apply #'format t fstring vars) расширяет vars на отдельные аргументы до format.

2 голосов
/ 26 февраля 2011

Помимо apply, есть также возможность сделать это с макросом, в котором вы можете использовать ,@ для склейки списков внутри обратных кавычек:

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