Я хочу написать макрос в Julia, который генерирует количество макросов
@register_attribute foo
должен генерировать макросы
@set_foo
@get_foo
, которые, в свою очередь, должны быть определены как
@set_foo x 5 == set_attr!(x, :foo, 5)
Мне удалось получить первую часть этого штрафа, однако @macroexpand
показывает, что внутренняя переменная x
не экранирована должным образом, в результате UndefVarErrors
, если я вызываю метод с локальной переменной .
@macroexpand @set_foo x 5 =
:(Main.set_attr!(Main.x, (Symbol)("foo"), 5))
, тогда как я хочу
@macroexpand @set_foo x 5 =
:(set_attr!(x, (Symbol)("foo"), 5))
Мой код
macro register_attribute(name)
setn = Symbol("set_", string(name))
getn = Symbol("get_", string(name))
arg = gensym()
arg2 = gensym()
nsym = string(name)
return Expr(:block,
esc(:(
macro $(setn)($arg, $arg2)
:(set_attr!($$arg, $$Symbol($$nsym), $$arg2))
end)
),
esc(:(
macro $(getn)($arg, $arg2)
:(get_attr!($$arg, $$Symbol($$nsym), $$arg2))
end)
))
e2
end