Что означает & rest в elisp?
Что означает &rest
в этом: (append &rest sequences)
Я закончил книгу "elisp_intro", но я не нашел ответа. Я буду очень благодарен, если вы сможете мне помочь.
Ответы
Ответ 1
Он указывает, что следующий аргумент является аргументом "rest". В случае вашего примера sequences
- это аргумент останова.
В отличие от обычного аргумента, аргумент rest будет потреблять "отдых" любых параметров, предоставленных пользователем. Это способ сделать функцию, которая принимает переменное количество аргументов. Внутри тела функции аргументом будет список, содержащий все дополнительные параметры.
Итак, если у вас есть функция, похожая на (add &rest numbers)
, вы можете называть ее как (add 1 2 3 4 5)
, а внутри функции аргумент numbers
имеет значение (1 2 3 4 5)
.
Или, например, ((lambda (a &rest r) r) 1 2 3) ;=> (2 3)
Ответ 2
Любые аргументы, следующие за символом & rest в определении функции, будут собраны в один объект списка. Таким образом, в случае (append & rest sequence), если вы вызываете функцию:
(append 1)
переменные последовательности будут списком (1) в теле функции. Если вы называете это
(append 1 2 3)
переменные последовательности будут списком (1 2 3) в теле функции. Это объясняется в справочном руководстве Elisp, в списке аргументов node.
(info "(elisp)Argument List")
Ответ 3
elisp/Common Lisp &rest
аналогичен параметру *args
в Python
Если вы поместите это в свой общий Lisp repl и вызовите foo с различным количеством аргументов, вы увидите, что довольно быстро.
(defun foo (a b &rest trailing)
(format t "~a :: ~a :: ~a~%" a b trailing))