【问题标题】:What is the return value of quote block?引用块的返回值是多少?
【发布时间】:2016-04-08 12:30:19
【问题描述】:

我尝试学习宏并有以下代码 sn-p:

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"

现在我的问题是,引用块的返回值是多少? 这个?

if !false, do: "block entered"

【问题讨论】:

  • 投反对票——基本上是零研究工作。当然,与您在所涵盖的 Macro.to_string/1 中找到该示例的来源相同。

标签: elixir


【解决方案1】:

您可以在宏中使用Macro.to_string/1 和IO.puts/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

演示:

iex(1)> require ControlFlow
nil
iex(2)> ControlFlow.unless 2 == 5, do: "block entered"
if(!(2 == 5)) do
  "block entered"
end
"block entered"

所以,你的代码变成了:

if(!(2 == 5)) do
  "block entered"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多