如何将Julia宏的参数传递给同一宏内部的表达式
错误原因
- 核心问题是宏的参数求值阶段不匹配:
arg是宏的入参,它的所有.args属性都是宏展开(编译期)就能获取的值,你之前的写法把arg.args[2].args[2]直接留在生成的struct代码里,相当于把取字段的操作推迟到了运行时,而运行时不存在arg这个宏参数变量,自然会报未定义错误。
修正后的宏代码
macro myMacro(name, arg) # 编译期提前提取字段名、默认值,不需要等到运行时 field_name = arg.args[1] default_val = arg.args[2].args[2] # 把提取到的值直接插值到生成的表达式中 quote struct $name $field_name function $name(; $field_name = $default_val) new($field_name) end end end |> esc end
这里加esc是为了绕过Julia宏的变量卫生机制,确保生成的struct、字段名和你调用宏时的作用域一致,不会被宏修改命名空间。
效果验证
运行你给出的展开测试代码:
julia> macroexpand(Main, :(@myMacro myM ((arg,(default=10))))) quote struct myM arg function myM(; arg = 10) new(arg) end end end
完全符合预期展开结果。实际调用也能正常使用默认值:
julia> @myMacro myM ((arg,(default=10))) julia> myM() myM(10) julia> myM(arg=20) myM(20)
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

