Пример создания в ANSI Common Lisp Пола Грэма

Кто-нибудь может объяснить пример на странице 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 кажутся мне особенно волшебными. Будем признательны за любые комментарии.

13
задан Terje Norderhaug 8 May 2011 в 15:53
поделиться