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