gpt4 book ai didi

clojure - 在 defmacro (clojure) 中检查符号相等性

转载 作者:行者123 更新时间:2023-12-05 02:32:27 30 4
gpt4 key购买 nike

这将返回 false

(defmacro scratch [pattern]
`(= 'b (first ~pattern)))

(scratch '(b))

然而,下面的输出是b

(defmacro scratch2 [pattern]
`(first ~pattern))

(scratch2 '(b))

如何设置第一个返回 true 的宏?

最佳答案

这正在发生,因为你在宏中引入的 'b 是命名空间的:

例子:

user> (defmacro nsmac []
`(namespace 'b))

user> (nsmac)
;;=> "user"

虽然您传递的值不是:

user> (namespace (first '(b)))
;;=> nil

因此,您可以将命名空间符号传递给宏,如下所示:

user> (scratch '(user/b)) 
;;=> true

或者你可以修复你的宏以使用未命名空间的符号(已知的 qoute-unquote 技巧):

(defmacro scratch [pattern]
`(= '~'b (first ~pattern)))

user> (scratch '(b))
;;=> true

但您真正想要的是在编译时检查这个,因为您拥有的这个宏作为普通函数更好,因为它没有使用任何与宏相关的优点。

它可能看起来像这样:

(defmacro scratch [pattern]
(= 'b (first pattern)))

(scratch (b))
;;=> true

可以找到有关命名空间的信息in this article

关于clojure - 在 defmacro (clojure) 中检查符号相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71237576/

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