在上面的宏中,没有符号的语法引用/命名空间,所以表单中的第一件事就是'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"