Внедрение переменных в выражение в кавычках
У меня есть выражение в кавычках, например:
ast = quote do
IO.puts x
end
И я хочу ввести переменную в выражение, чтобы х имел значение, и выражение не вызовет CompileError
из-за x
быть неопределенным при оценке следующим образом:
Code.eval_quoted ast, [x: "Hello, world!"]
Этот AST передан мне, и я не могу изменить код, с помощью которого он генерируется. Я могу изменить AST после того, как я прошел его, хотя.
Я думал, чтобы сделать это, я мог бы преобразовать AST, чтобы напомнить это цитируемое выражение:
ast = quote do
x = var!(x)
IO.puts x
end
После попытки этого мой AST выглядит так:
{:__block__, [],
[{:=, [],
[{:x, [], Elixir}, {:var!, [context: Check.Runner], [{:x, [], Elixir}]}]},
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [],
[{:x, [], Check.RunnerTest}]}]}
Это не работает Я думал, что это может быть связано с неправильным значением для контекста var!
,
Решение: теперь я понимаю, что переменные находились в неверной области видимости, и мне нужен AST, подобный этому:
{:__block__, [],
[{:=, [],
[{:x, [], Check.RunnerTest},
{:var!, [context: Check.Runner], [{:x, [], Check.Runner}]}]},
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [],
[{:x, [], Check.RunnerTest}]}]}
1 ответ
Ваш код должен просто работать. На самом деле, вы написали:
ast = quote do
x = var!(x)
IO.puts x
end
Но вы показали AST для какого-то другого кода, который вы назначили 1
в var!(x)
, Другими словами, в приведенном выше коде нет ничего плохого.