Внедрение переменных в выражение в кавычках

У меня есть выражение в кавычках, например:

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), Другими словами, в приведенном выше коде нет ничего плохого.

Другие вопросы по тегам