Два следующих примера использования функции в макросе приводят к оценке без ошибок.
(defmacro works []
(let [f (fn [] 1)]
`(~f)))
(works)
;; => 1
(defn my-nullary-fn []
(fn [] 2))
(defmacro also-works []
(let [f (my-nullary-fn)]
`(~f)))
(also-works)
;; => 2
Однако
(defmacro does-not-work []
(let [f (constantly 3)]
`(~f)))
(does-not-work)
бросает
java.lang.IllegalArgumentException: No matching ctor found
for class clojure.core$constantly$fn__4051
Аналогично,
(defn my-unary-fn [x]
(fn [] x))
(defmacro also-does-not-work []
(let [f (my-unary-fn 4)]
`(~f)))
(also-does-not-work)
бросает
java.lang.IllegalArgumentException No matching ctor found
for class user$my_other_fn$fn__12802
В чем может быть причина? Существует ли разница между функциональными объектами, возвращаемыми fn
, my-nullary-fn
, constantly
и my-unary-fn
?
Я запускаю Clojure 1.5.1.
CLJ-946 могут быть связаны.