在Elixir中,如果使用Macro.escape/1
代替quote/1
?我看过beginner's guide并没有帮助。
答案 0 :(得分:6)
quote 返回代码块传递的AST。
Macro.escape 返回传入值的AST。
这是一个例子:
iex(1)> a = %{"apple": 12, "banana": 90}
%{apple: 12, banana: 90}
iex(2)> b = quote do: a
{:a, [], Elixir}
iex(3)> c = Macro.escape(a)
{:%{}, [], [apple: 12, banana: 90]}
quote
会保留原点a,而Macro.escape
会为返回的AST注入一个val。
iex(4)> Macro.to_string(b) |> Code.eval_string
warning: variable "a" does not exist and is being expanded to "a()", please use parentheses to remove the ambiguity or change the variable name
nofile:1
iex(5)> Macro.to_string(c) |> Code.eval_string
{%{apple: 12, banana: 90}, []}
iex(6)> Macro.to_string(b) |> Code.eval_string([a: "testvalue"])
{"testvalue", [a: "testvalue"]}