с результатами:
начально мотивировано следующим вопросом:Сопоставленные вызовы к макросу clojurescript
Предположим, что вы хотите создать много похожих функций автоматически (т.е. без написания от руки их всех). Предположим, у нас есть некоторые уже существующие функции, и мы хотим обернуть их обработчиками для какого-либо обратного вызова:
(defn do-foo [] (println "I foo'ed"))
(defn do-bar [] (println "I bar'ed"))
(defn do-baz [] (println "I baz'ed"))
(defn manual-on-foo [] (do-foo))
(defn manual-on-bar [] (do-bar))
(defn manual-on-baz [] (do-baz))
(println "Calling manual-on-* functions")
(manual-on-foo)
(manual-on-bar)
(manual-on-baz)
с результатами:
Calling manual-on-* functions
I foo'ed
I bar'ed
I baz'ed
Мы хотим генерировать функции-оболочки автоматически, а не вручную.
Вы можете подумать, что вам нужен макрос для создания этой функции, и это одно из решений. Однако недостатком макросов является то, что они не могут быть переданы в качестве аргументов другой функции, такой какmap
, Таким образом, мы могли бы написать макрос вроде:
(generate-fn :foo) ;=> creates `on-foo` w/o hand-writing it
но следующее не получится:
(map generate-fn [:foo :bar :baz])
Как мы можем автоматизировать генерацию этих функций?