Приветствую!
Суть: есть верхняя функция, которая порождает дерево вызовов других функций (произвольных), часть которых может сделать нечто вроде метки, на которую должна среагировать верхняя функция.
Пример:
(defun bottom (x)
(magic-shit (random x))
x)
(defun middle (arg)
(let ((x (random arg)))
(if (= x 42)
(bottom x)
x)))
(defun top ()
(magic-bind (value magic-arg) (middle 999)
(if magic-arg
(+ magic-arg value)
(/ value 42))))
magic-shit - нечто, устанавливающее протаскиваемое значение, в данном случае это (random 42). magic-bind - нечто, позволяющее получить это значение. Форма записи мэджиков непринципиальна, принципиально не изменять middle-функцию.
Сперва была мысль воспользоваться механизмом возвращения нескольких значений, но это не взлетит в силу того, что в общем случае под это придется подгонять middle. Еще в голове вертится слово «замыкание», не знаю, может меня от перенапряжения коротнуло просто. Написать top и множество bottom-функций в одной let-форме и замкнуться на ее переменную не получится, как еще замкнуть я не знаю... Последний вариант - глобальная переменная, да.
Какие есть в лиспе механизмы решения такой задачи?