Может ли кто-нибудь объяснить пример в Paul Graham ANSI Common Lisp стр. 110?
В примере попытайтесь объяснить использование & 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 особенно напоминают мне волшебство. Любые комментарии будут оценены.