Вставка функции с помощью макросов Clojure
больше из любопытства, что что-нибудь еще (но с ожиданием, что это может иногда быть полезным трюком для настройки производительности), можно ли использовать макросы Clojure для "встроенного" существующей функции?
т. е. я хотел бы иметь возможность сделать что-то вроде:
(defn my-function [a b] (+ a b))
(defn add-3-numbers [a b c]
(inline (my-function
a
(inline (my-function
b
c)))))
и пусть он производит (во время компиляции) точно такую же функцию, как если бы я сам вставил дополнения, такие как:
(defn add-3-numbers [a b c]
(+ a (+ b c)))
1 ответов
если вы не знали, вы можете определить встроенные функции с помощью definline
(doc definline)
-------------------------
clojure.core/definline
([name & decl])
Macro
Experimental - like defmacro, except defines a named function whose
body is the expansion, calls to which may be expanded inline as if
it were a macro. Cannot be used with variadic (&) args.
nil
также проверка источника,
(source definline)
-------------------------
(defmacro definline
[name & decl]
(let [[pre-args [args expr]] (split-with (comp not vector?) decl)]
`(do
(defn ~name ~@pre-args ~args ~(apply (eval (list `fn args expr)) args))
(alter-meta! (var ~name) assoc :inline (fn ~name ~args ~expr))
(var ~name))))
definline
просто определяет var
С мета-данными {:inline (fn definition)}
. Поэтому, хотя это не совсем то, что вы спрашивали, но вы можете повторно связать var с новыми метаданными, чтобы получить встроенное поведение.