使用宏生成要在REPL中执行的Julia命令

使用宏生成要在REPL中执行的Julia命令,julia,Julia,我是Julia(和stackoverflow)的新手,但尝试简化函数调用失败。 我需要定义调用来创建30个不同结构的多个实例,每个都有一组不同的属性。 下面的代码可以工作,但会强制用户使用完全相同的字符串两次,如: EV_668876=新EV(“EV_668876”,“测试EV”) 这是一种痛苦,可能会导致错误。 我已经编写了一个宏来生成该命令,但无法让REPL执行该命令。 这是代码(很抱歉它太长了) 据我所知(我不确定在您的示例中打印是做什么的),您需要一个扩展的宏 @create <i

我是Julia(和stackoverflow)的新手,但尝试简化函数调用失败。 我需要定义调用来创建30个不同结构的多个实例,每个都有一组不同的属性。 下面的代码可以工作,但会强制用户使用完全相同的字符串两次,如: EV_668876=新EV(“EV_668876”,“测试EV”) 这是一种痛苦,可能会导致错误。 我已经编写了一个宏来生成该命令,但无法让REPL执行该命令。 这是代码(很抱歉它太长了)

据我所知(我不确定在您的示例中打印是做什么的),您需要一个扩展的宏

@create <id> <name>
@macroexpand
用于调试,因为我没有复制您的代码。它只获取宏调用产生的表达式


esc
aping在这里是必要的,因为您希望符号
id
给出的标识符最终在调用范围中定义。

这正是我删除@macroexpand时所需要的(我需要阅读Julia文档才能理解“esc”)当然,您需要删除它:)它的目的只是向您展示实际的宏调用将产生什么结果。
@create <id> <name>
<id> = newEV("<id>", name)
julia> macro create(id::Symbol, name)
           :($(esc(id)) = newEV($(String(id)), $name))
       end
@create (macro with 1 method)

julia> @macroexpand @create EV_234324 "new test"
:(EV_234324 = (Main.newEV)("EV_234324", "new test"))