Macros Elixir quote/unquote和宏行为

Macros Elixir quote/unquote和宏行为,macros,elixir,Macros,Elixir,我有两个版本的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。此代码不能正常工作(实际上,它不导入任何内容) 这是工作版本,但是,我不喜欢有两个独立的quote部分 defmodule SomeModule do defmacro __using__(opts \\ []) do if Keyword.has_key?(opts, :my_key) && o

我有两个版本的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。此代码不能正常工作(实际上,它不导入任何内容)

这是工作版本,但是,我不喜欢有两个独立的
quote
部分

defmodule SomeModule do
  defmacro __using__(opts \\ []) do
    if Keyword.has_key?(opts, :my_key) && opts[:my_key] == 3 do
      quote do
        import MyModuleOne
      end
    else
      quote do
        import MyModuleTwo
      end
    end
  end
end

第一个应该如何重写才能正常工作?

这是一个棘手的问题!我花了一段时间才弄明白原因

在讨论原因之前,让我向您保证,您的宏是完全有效的,Elixir的工作原理与您所说的完全相同

我尝试展开你发布的两个宏,得到了相同的结果,即导入了正确的东西。但是为什么它不能像你期望的那样工作呢

这就是为什么

重要的是要注意import/2是词法的

导入的文档中

让我给你们看两个例子

iex(1)> import Enum, only: [into: 2]
Enum
iex(2)> into [a: 1], %{}
%{a: 1}
iex(3)>
而且

iex(1)> if true do
...(1)>   import Enum, only: [into: 2]
...(1)> end
Enum
iex(2)> into [a: 1], %{}
** (CompileError) iex:2: undefined function into/2

导入只在您编写的子句中生效:)

这是一个棘手的问题!我花了一段时间才弄明白原因

在讨论原因之前,让我向您保证,您的宏是完全有效的,Elixir的工作原理与您所说的完全相同

我尝试展开你发布的两个宏,得到了相同的结果,即导入了正确的东西。但是为什么它不能像你期望的那样工作呢

这就是为什么

重要的是要注意import/2是词法的

导入的文档中

让我给你们看两个例子

iex(1)> import Enum, only: [into: 2]
Enum
iex(2)> into [a: 1], %{}
%{a: 1}
iex(3)>
而且

iex(1)> if true do
...(1)>   import Enum, only: [into: 2]
...(1)> end
Enum
iex(2)> into [a: 1], %{}
** (CompileError) iex:2: undefined function into/2
导入只在您编写的子句中生效:)

Huh,您是对的:)使用其他函数检查-确认:)Huh,您是对的:)使用其他函数检查-确认:)