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