Is it possible to use requiring-resolve for macros ?
It seems to give me something using it on a macro, but a "fn"...
requiring-resolve is a runtime operation, macros are compile time
you can't resolve a compile time operation at runtime and expect it to work
I though so.
So if I have an "optional library" which I don't want in my deps.edn,
I can not use requiring-resolve for any macro in it ?
well, not with requiring-resolve,you could write a macro to kinda do what you need
something like
(defmacro when-requiring-resolve-macro [sym & body] (when (try (-> sym requiring-resolve meta :macro) (catch Exception _ false)) `(do ~@body)))(when-requiring-resolve-macro lib/my-macro ..body using lib/my.macro..)user=> (ns foo)
nil
foo=> (defmacro x [y] `(println '~&form ~y))
#'foo/x
foo=> (in-ns 'user)
#object[clojure.lang.Namespace 0x3005db4a "user"]
user=> (defmacro when-requiring-resolve-macro [sym & body] (when (try (-> sym requiring-resolve meta :macro) (catch Exception _ false)) `(do ~@body)))
#'user/when-requiring-resolve-macro
user=> (defn a [] (when-requiring-resolve-macro foo/x (foo/x (println "foo"))))
#'user/a
user=> (defn b [] (when-requiring-resolve-macro does-not/exist (does-not/exist (println "foo"))))
#'user/b
user=> (a)
foo
(foo/x (println foo)) nil
nil
user=> (b)
nilBelo does not compile, when "carmine" is not in classpath.
taoensso.carmine/wcar
is the macro I want to use
(reset! ml/train-predict-cache {:use-cache true
:get-fn (fn [key]
(with-requiring-resolve-macro taoensso.carmine/wcar
(taoensso.carmine/wcar
wcar-opts
((requiring-resolve 'taoensso.carmine/get) key))))
:set-fn (fn [key value]
(with-requiring-resolve-macro taoensso.carmine/wcar
(taoensso.carmine/wcar
wcar-opts
((requiring-resolve 'taoensso.carmine/set) key value)))
)}))Just adding a tangential 2c here: If you need to do this in ClojureScript, anything touching requiring-resolve is very unlikely to work.
@carsten.behring What do you mean "does not compile", what's the error?
It does work, I looked wrong. Thanks for solution !!