gpt4 book ai didi

macros - 在 Clojure 宏中强制展开表达式

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

我正在尝试使用 Stuart Sierra 的 do-template defprotocol 内的宏Clojure 编译器提示我正在重新定义 do-template ——不是我想要的:

(defprotocol AProtocol
(a-method [_])
(do-template [name]
`(~(symbol (str name "-method")) [this that])
foo
bar
baz))

这应该扩展到:
(defprotocol AProtocol
(a-method [_])
(foo-method [this that])
(bar-method [this that])
(baz-method [this that]))

问题(我相信)是 do-template s 表达式正在传递给 defprotocol未扩展。有没有办法让它在通过之前进行评估?

顺便说一句, do-template实际上应该扩展到
(do
(foo-method [this that])
(bar-method [this that])
(baz-method [this that]))

但我已经尝试过(使用手动扩展版本)和 defprotocol嵌套 do 没问题.

怎样才能看到 do-template的实际扩展?我都试过了 (macroexpand '(do-template ...))(macroexpand-1 '(do-template ...))并得到:

(do (clojure.core/seq (clojure.core/concat (clojure.core/list (symbol (str foo "-method"))) (clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/this)) (clojure.core/list (quote user/that)))))))) (clojure.core/seq (clojure.core/concat (clojure.core/list (symbol (str bar "-method"))) (clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/this)) (clojure.core/list (quote user/that)))))))) (clojure.core/seq (clojure.core/concat (clojure.core/list (symbol (str baz "-method"))) (clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/this)) (clojure.core/list (quote user/that)))))))))



不是很容易阅读:-)。

另外,我可能想要 thisthat成为回指并扩展到自己: ~'this .

最佳答案

(1) defprotocol 不适用于 do 形式。它不会引发错误,但也不起作用。

(2) 你不能以这种方式做你想做的事。 defprotocol 是被调用的宏,因此它对如何扩展子表单具有绝对的权威。

(3) 第 (2) 项提出了一种解决方案,实际上与您最近的至少一个问题相同:定义一个新的宏,例如 with-methods ,它接受一个方法名称列表,后跟任何其他 defprotocol 参数,并扩展为一个 defprotocol 并具有适当的替换和已经完成的拼接,这样 defprotocol 可以和平地扩展,而无需知道关于你的 do-template 技巧的任何信息。

关于macros - 在 Clojure 宏中强制展开表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6402316/

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