检查宏中的函数是否相等

时间:2013-08-29 07:30:39

标签: macros clojure

我有一个宏,我需要检查传递的表单的第一个元素是否完全是clojure.core / not函数。我怎么能做到这一点?

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

我像这样使用那个宏:

(foo (not smthng))

我听说过用#来解决符号,但在这种情况下它怎么能帮助我(如果它甚至可能有用)? 欢迎任何想法。

1 个答案:

答案 0 :(得分:3)

在上面的宏中,没有符号的语法引用/命名空间,所以表单中的第一件事就是'不是。

(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"