gpt4 book ai didi

macros - 检查宏内函数的相等性

转载 作者:行者123 更新时间:2023-12-04 04:43:51 25 4
gpt4 key购买 nike

我有一个宏,我需要检查传递的表单的第一个元素是否正是 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 (而不是其他一些可能未提及的),您可以使用 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"

关于macros - 检查宏内函数的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com