Macros 对动态生成的宏进行双引号取消引用

Macros 对动态生成的宏进行双引号取消引用,macros,metaprogramming,elixir,Macros,Metaprogramming,Elixir,鉴于以下情况: for fn_name <- [:foo, :bar, :baz] do defmacro unquote(fn_name)(do: inner) do fn_name = unquote(fn_name) # <--- Why? quote do IO.puts "#{unquote(fn_name)} called" unquote(inner) end end end

鉴于以下情况:

  for fn_name <- [:foo, :bar, :baz] do
    defmacro unquote(fn_name)(do: inner) do
      fn_name = unquote(fn_name) # <--- Why?
      quote do
        IO.puts "#{unquote(fn_name)} called"
        unquote(inner)
      end
    end
  end

对于fn\u名称是因为卫生

长生不老药有宏观卫生的概念。卫生意味着您在宏中定义的变量、导入和别名不会泄漏到调用方自己的定义中

for fn_name <- [:foo, :bar, :baz] do
    defmacro unquote(fn_name)(do: inner) do
      fn_name = unquote(fn_name) # <-- This is macro's context
      quote do
        IO.puts "#{unquote(fn_name)} called" # <-- This is caller's context
        unquote(inner)
      end
    end
  end

对于fn\u名称是因为卫生

长生不老药有宏观卫生的概念。卫生意味着您在宏中定义的变量、导入和别名不会泄漏到调用方自己的定义中

for fn_name <- [:foo, :bar, :baz] do
    defmacro unquote(fn_name)(do: inner) do
      fn_name = unquote(fn_name) # <-- This is macro's context
      quote do
        IO.puts "#{unquote(fn_name)} called" # <-- This is caller's context
        unquote(inner)
      end
    end
  end

对于fn_name让我们稍微简化一下示例:

for fn_name <- [:foo, :bar, :baz] do
  defmacro unquote(fn_name)(do: inner) do
    fn_name = unquote(fn_name) # <--- Why?
    quote do
      {unquote(fn_name), unquote(inner)}
    end
  end
end

对于fn_name让我们稍微简化一下示例:

for fn_name <- [:foo, :bar, :baz] do
  defmacro unquote(fn_name)(do: inner) do
    fn_name = unquote(fn_name) # <--- Why?
    quote do
      {unquote(fn_name), unquote(inner)}
    end
  end
end

有关fn\u名称,谢谢!从宏和调用方上下文的角度思考是非常有帮助的!非常感谢。从宏和调用方上下文的角度思考是非常有帮助的!谢谢你抽出时间!这很有道理,我现在有了更多的工具来解释元编程:感谢花时间!这很有道理,我现在有更多的工具来解释元编程:D