Elixir quote块的返回值是多少?
我尝试学习宏,并有以下代码片段:Elixir quote块的返回值是多少?,elixir,Elixir,我尝试学习宏,并有以下代码片段: defmodule ControlFlow do defmacro unless(expression, do: block) do quote do if !unquote(expression), do: unquote(block) end end end 它的工作原理与预期一致: iex(16)> ControlFlow.unless 2 == 5, do: "block entered" "block e
defmodule ControlFlow do
defmacro unless(expression, do: block) do
quote do
if !unquote(expression), do: unquote(block)
end
end
end
它的工作原理与预期一致:
iex(16)> ControlFlow.unless 2 == 5, do: "block entered"
"block entered"
现在我的问题是,quote块的返回值是多少?
这个
您可以在宏中使用
Macro.to_string/1
和IO.put/1
来检查返回的内容:
defmodule ControlFlow do
defmacro unless(expression, do: block) do
ast = quote do
if !unquote(expression), do: unquote(block)
end
ast |> Macro.to_string |> IO.puts
ast
end
end
演示:
因此,您的代码变成:
if(!(2 == 5)) do
"block entered"
end
您可以在宏中使用
Macro.to_string/1
和IO.put/1
来检查返回的内容:
defmodule ControlFlow do
defmacro unless(expression, do: block) do
ast = quote do
if !unquote(expression), do: unquote(block)
end
ast |> Macro.to_string |> IO.puts
ast
end
end
演示:
因此,您的代码变成:
if(!(2 == 5)) do
"block entered"
end
否决票——基本上是零研究工作。当然,与您在covered Macro.to_string/1以及.Downvote中找到该示例的来源相同——基本上没有任何研究工作。当然,与您在covered Macro.to_string/1中找到该示例的来源相同。