и отдых в простонародье - PullRequest
0 голосов
/ 05 апреля 2020

Я смущен тем, что &rest делает в общем лиспе. Это может быть примером для представления того, что я имею в виду:

(defmacro switch (value &rest pairs)
             .... 
)

Что именно означает & rest и пары?

1 Ответ

6 голосов
/ 05 апреля 2020

Последнему параметру в определении функции (или макроса) может предшествовать &rest. В этом случае, когда вызывается функция (или макрос), все аргументы, не связанные с предыдущими параметрами, собираются в список, связанный с этим последним параметром. Это способ предоставления неопределенного числа аргументов функции или макросу.

Например:

CL-USER> (defun f (a &rest b)
           (list a (mapcar #'1+ b)))
F
CL-USER> (f 1 2 3 4 5)
(1 (3 4 5 6))
CL-USER> (f 1)
(1 NIL)
CL-USER> (f 1 2 3)
(1 (3 4))
CL-USER> (defmacro m (f g &rest pairs)
           (let ((operations (mapcar (lambda (pair) (list g (first pair) (second pair))) pairs)))
             `(,f (list ,@operations))))
M
CL-USER> (macroexpand-1 '(m print + (1 2) (3 4) (5 6)))
(PRINT (LIST (+ 1 2) (+ 3 4) (+ 5 6)))
T
CL-USER> (m print + (1 2) (3 4) (5 6))
(3 7 11)

Обратите внимание, что, если аргументов нет, список передается последний параметр пуст.

...