2015-09-06 38 views
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}]}]} 

回答

2

你的代碼應該只是工作。事實上,你已經寫了:

ast = quote do 
    x = var!(x) 
    IO.puts x 
end 

但是你的表現爲AST您要分配給1一些var!(x)其他代碼之一。換句話說,上面的代碼沒有問題。

+0

啊,我粘貼不正確的一個。在閱讀下面的評論後,我意識到由於設置了錯誤的上下文,我的變量處於錯誤的範圍。我已經更新了上面的問題。 – lpil

+1

現在你已經更新了這個問題,這個問題本身是錯誤的(這個例子確實有效),這個答案有些不對。 :P –

+0

是的。這一切都是一團糟。大概現在最好走開! – lpil