Общий Lisp: Работа с параметрами & rest
Может ли кто-нибудь сказать мне, как работать с параметрами, хранящимися в значении, указанном & rest.
Я читал много, и кажется, что авторы знают, как перечислять все параметры как таковые.
(defun test (a &rest b) b)
Это приятно видеть, но не очень полезно.
Лучшее, что я нашел до сих пор, это использовать первый, второй и т.д., чтобы получить требуемый параметр.
(defun test (a &rest b)
(first b))
Я заметил, что этот метод перестает работать с десятым параметром, но спецификация (из того, что я прочитал) поддерживает минимум 50. Даже если шансы тонкие, я буду использовать 50 параметров, я бы хотел знаете, как получить к ним доступ.
Спасибо
Ответы
Ответ 1
Функции FIRST, SECOND и т.д. - это "просто" служебные функции поверх CAR/CDR или NTH. Я полагаю, что ответ на ваш конкретный вопрос: "используйте NTH или ELT" (или создайте свои собственные специальные функции acccessor).
Если вы хотите, вы можете определить ELEVENTH как:
(defun одиннадцатый (список) (список nth 10))
Я считаю, что в основном я использую аргументы & REST, когда 0 или более вещей, которые я хочу что-то сделать, не заботясь о конкретной позиции данного аргумента в списке & REST. Это обычно подразумевает использование LOOP, DO или DOLIST для прохождения аргументов и выполнения чего-либо с каждым; семейство MAP или (иногда) СОКРАЩЕНИЕ.
Ответ 2
Параметр Rest - это просто список. Вы можете обрабатывать его, используя обычные операции с списком.
(defun test (a &rest b))
(dolist (s b)
(when (> s 1)
(print s)
(do-something-else b)))
Ответ 3
На самом деле функция полезна. Вам нужно только попробовать.
CL-USER 1 > (defun test (a &rest b) b)
TEST
CL-USER 2 > (test 1 2 3 4)
(2 3 4)
Итак, вы видите, что B - это просто список аргументов. Таким образом, все операции списка и последовательности применяются. Нет ничего волшебного. Существуют функции доступа к элементу NTH, функции для удаления элементов и т.д.
В Common Lisp HyperSpec перечислены соответствующие функции:
14. Словарь Conses
17. Словарь последовательностей
Для базового учебника Lisp ознакомьтесь с книгой Touretzky:
Общий Lisp: Нежное введение в символические вычисления
Книга загружается в формате PDF и Postscript. Он преподает основные общие Lisp.
Ответ 4
Вы также можете использовать destructuring-bind:
(defun my-function (&rest arguments)
(destructuring-bind (a b &rest c) arguments
(format nil "~A,~A followed with ~A" a b c)))
CL-USER> (my-function 1 2 "Give" 'me "more" 'arguments!!)
==> "1,2 followed with (Give ME more ARGUMENTS!!)"
Ответ 5
У меня просто есть рекурсивная итерация, чтобы пройти через все их, я думаю, долист лучше, но мне нравится использовать старомодный способ