Кто-нибудь может объяснить пример на странице 110 ANSI Common Lisp Пола Грэма?
Пример пытается объяснить использование & rest и лямбда для создания средств функционального программирования. Одна из них - функция для составления функциональных аргументов. Я не могу найти ничего, объясняющего, как это работало. Код выглядит следующим образом:
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
Использование:
(mapcar (compose #'list #'round #'sqrt)
'(4 9 16 25))
Результат:
((2) (3) (4) (5))
Строки 2 и 6 кажутся мне особенно волшебными. Будем признательны за любые комментарии.