Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 检查宏中的函数是否相等_Macros_Clojure - Fatal编程技术网

Macros 检查宏中的函数是否相等

Macros 检查宏中的函数是否相等,macros,clojure,Macros,Clojure,我有一个宏,需要检查传递表单的第一个元素是否就是clojure.core/not函数。我怎样才能做到这一点 (defmacro foo [form] (println (= clojure.core/not (first form)))) ; expect true here, but its false 我这样使用宏: (foo (not smthng)) 我听说过用#来解析符号,但在这种情况下它能帮我什么忙(如果它能帮上忙的话)? 欢迎任何想法。在上面的宏中,没有符号的语法引用/名称

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

(defmacro foo [form]
  (println (= clojure.core/not (first form)))) ; expect true here, but its false
我这样使用宏:

(foo (not smthng))
我听说过用#来解析符号,但在这种情况下它能帮我什么忙(如果它能帮上忙的话)?
欢迎任何想法。

在上面的宏中,没有符号的语法引用/名称空间,因此表单中的第一件事就是“不”

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

(foo (not nil))
;=> not
因此,检查第一个符号是否为
not
的简单宏是:

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

为了确保您拥有正确的
clojure.core/not
(而不是其他可能被引用的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"

我不知道如何写
#“~(第一种形式)
。它的语法有点混乱。但是它可以像预期的那样工作,谢谢,对我有效的最终代码是
(if(#'clojure.core/not(eval`#'~(first form)))`(如果为true,宏将返回此代码)`(如果为false,则返回此代码)
。你能补充你的答案吗?假设它对其他用户有帮助。@hsestupin-干得好!我还对我的答案做了一些编辑——你的评论促使我做了更多的调查(主要是想看看是否有办法使用
eval
)。我找到了
resolve
函数,它看起来比我之前的建议更适合您的需求。希望有帮助!谢谢调查<代码>解析很棒。现在我也在我的代码中使用它。