11

マクロで関数を使用する次の 2 つの例では、エラーのない評価が行われます。

(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

その理由は何ですか?fnmy-nullary-fn、によって返される関数オブジェクトに違いはありconstantlyますmy-unary-fnか?

Clojure 1.5.1 を実行しています。

CLJ-946が関連している可能性があります。

4

2 に答える 2