В последнее время я пишу больше кода на Лиспе. В частности, рекурсивные функции, которые принимают некоторые данные и создают результирующую структуру данных. Иногда кажется, что мне нужно передать два или три фрагмента информации для следующего вызова функции в дополнение к предоставленным пользователем данным. Давайте назовем эти аккумуляторы.
Как лучше организовать эти интерфейсы в моем коде?
В настоящее время я делаю что-то вроде этого:
(defun foo (user1 user2 &optional acc1 acc2 acc3)
;; do something
(foo user1 user2 (cons x acc1) (cons y acc2) (cons z acc3)))
Это работает так, как мне бы хотелось, но я обеспокоен тем, что мне не нужно представлять & необязательные параметры программисту.
3 подхода, которые я несколько рассматриваю:
имеет функцию-обертку, которую рекомендуется использовать пользователю, которая немедленно вызывает расширенное определение.
использовать labels
внутри функции, чья сигнатура краткая.
просто начните использовать цикл и переменные. Тем не менее, я бы предпочел не делать этого, поскольку хотел бы действительно обернуть голову вокруг рекурсии.
Спасибо, ребята!