gpt4 book ai didi

macros - 如何定义定义宏的 julia 宏?

转载 作者:行者123 更新时间:2023-12-04 18:24:59 28 4
gpt4 key购买 nike

我原以为这会奏效:

macro meta_meta(x,y)
:(macro $x(arg) :($($y) + $arg) end)
end

预期的行为是调用 @meta_meta(f,2)应该等同于 macro f(arg) :(2 + $arg) end
换句话说:
julia> @meta_meta(f,2)
julia> @f(3)
5

相反,我得到:
ERROR: syntax: invalid macro definition

我对如何进行有点不知所措。我看到这个宏的表达式树与我手动生成 @f 并检查它的表达式树时得到的不同,我已经尝试了多次 @meta_meta 迭代,但我不知道如何将我的定义更改为让它工作。

最佳答案

在处理引用中的引用时,宏观卫生有点挑剔。通常我发现唯一的方法是完全拒绝宏观卫生,并使用 gensym自由地模拟它。

但是,在您简化的示例中,只需将内部引用转换为 Expr 就很简单了。 :

julia> macro meta_meta(x, y)
:(macro $(esc(x))(arg) Expr(:call, :+, $(esc(y)), esc(arg)) end)
end
@meta_meta (macro with 1 method)

julia> @meta_meta f 2
@f (macro with 1 method)

julia> @f 3
5

如果事情变得更复杂,我上面提到的方法包括使用 esc 关闭宏观卫生。 .这意味着我们必须自己做卫生,因此 gensym :
julia> macro meta_meta(x, y)
arg = gensym()
esc(:(macro $x($arg) :($$y + $$arg) end))
end
@meta_meta (macro with 1 method)

julia> @meta_meta f 2
@f (macro with 1 method)

julia> @f 3
5

关于macros - 如何定义定义宏的 julia 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986303/

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