3
我有一個引用表達式,比如這一個:注入變量爲引用的表達
ast = quote do
IO.puts x
end
而且我想給一個變量注入表達,使x的值,並表達不會提高一個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}]}]}
啊,我粘貼不正確的一個。在閱讀下面的評論後,我意識到由於設置了錯誤的上下文,我的變量處於錯誤的範圍。我已經更新了上面的問題。 – lpil
現在你已經更新了這個問題,這個問題本身是錯誤的(這個例子確實有效),這個答案有些不對。 :P –
是的。這一切都是一團糟。大概現在最好走開! – lpil