2

渡されたフォームの最初の要素が正確に clojure.core/not 関数であるかどうかを確認する必要があるマクロがあります。どうすればそれを達成できますか?

(defmacro foo [form]
  (println (= clojure.core/not (first form)))) ; expect true here, but its false

そして、私はそのマクロを次のように使用します:

(foo (not smthng))

#' でシンボルを解決することについて聞いたことがありますが、この場合にどのように役立つでしょうか (それが役立つ場合でも)? どんな考えでも大歓迎です。

4

1 に答える 1

3

上記のマクロでは、シンボルの構文の引用/名前空間が行われていないため、フォームの最初の部分は単に 'not.

(defmacro foo [form]
  (println (first form)))

(foo (not nil))
;=> not

したがって、最初のシンボルが存在するかどうかを確認する単純なマクロは次のようにnotなります。

(defmacro foo [form]
   (println (= 'not (first form))))

編集

正しいclojure.core/not(参照された可能性のある他のものではない) ことを確認するために、resolve関数を使用して完全修飾 var を取得できます。

(defmacro foo [form]
  (if (= #'clojure.core/not (resolve (first form)))
    (println "(first form) is clojure.core/not")
    (println "(first form) is not clojure.core/not")))

 (foo (not nil))
 ;;=> "(first form) is clojure.core/not"

 (foo (+ 3 4))
 ;;=> "(first form) is not clojure.core/not"
于 2013-08-29T08:20:08.240 に答える