Подтвердить что ты не робот

Общий Lisp: Работа с параметрами & rest

Может ли кто-нибудь сказать мне, как работать с параметрами, хранящимися в значении, указанном & rest.

Я читал много, и кажется, что авторы знают, как перечислять все параметры как таковые.

(defun test (a &rest b) b)

Это приятно видеть, но не очень полезно.

Лучшее, что я нашел до сих пор, это использовать первый, второй и т.д., чтобы получить требуемый параметр.

(defun test (a &rest b)
    (first b))

Я заметил, что этот метод перестает работать с десятым параметром, но спецификация (из того, что я прочитал) поддерживает минимум 50. Даже если шансы тонкие, я буду использовать 50 параметров, я бы хотел знаете, как получить к ним доступ.

Спасибо

4b9b3361

Ответ 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

У меня просто есть рекурсивная итерация, чтобы пройти через все их, я думаю, долист лучше, но мне нравится использовать старомодный способ