如何在Julia中实现多行宏@Estruct并解决调用报错问题
错误原因
你定义的@Estruct宏原本期望接收多个独立的位置参数,而使用begin ... end块调用时,整个块会被解析为单个Expr类型的参数传入宏,和宏的参数列表不匹配,因此触发MethodError。
适配多行begin块调用的宏修改方案
只需要修改宏定义,提取begin块内的参数即可:
macro Estruct(def_block) # 过滤块中自动生成的行号节点,提取用户输入的参数 params = [item for item in def_block.args if !(item isa LineNumberNode)] name, arg, type, max, min, description = params quote struct $(esc(name)) # 原写法未加类型标注,这里补充上更符合预期 $(esc(arg))::$(esc(type)) $(esc(name))($(esc(arg))) = new( check($(esc(type)), $(esc(arg)), $(esc(name)), $(esc(max)), $(esc(min)), $(esc(description))) ) end end end
修改后你原来的多行调用写法即可正常运行:
@Estruct begin B arg1 Float64 200.0 5.0 "this" end
备选方案:无需修改宏的多行写法
如果你不想调整宏定义,Julia原生支持宏参数换行,不需要加begin ... end,可以直接写成:
@Estruct( B, arg1, Float64, 200.0, 5.0, "this" )
注意事项
- 原宏定义中参数名
descritpion存在拼写错误,建议修正为description避免后续使用混乱 - 请确保你调用的
check校验函数已经提前定义,否则会触发函数未定义错误
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

