Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Elixir宏-作为变量传递的参数的模式匹配_Macros_Elixir - Fatal编程技术网

Macros Elixir宏-作为变量传递的参数的模式匹配

Macros Elixir宏-作为变量传递的参数的模式匹配,macros,elixir,Macros,Elixir,我试图更好地理解Elixir宏,但我很难找到一个场景,在这个场景中,当我试图传递的值是一个变量时,我可以对传递给宏的参数进行模式匹配。下面是一个简单的例子来说明: macro\u test.ex defmodule MacroTest do use MacroTest.UseMe def run() do atom = :hello_world macro_a(atom) end end defmodule MacroTest.UseMe do defmac

我试图更好地理解Elixir宏,但我很难找到一个场景,在这个场景中,当我试图传递的值是一个变量时,我可以对传递给宏的参数进行模式匹配。下面是一个简单的例子来说明:

macro\u test.ex

defmodule MacroTest do
  use MacroTest.UseMe

  def run() do
    atom = :hello_world

    macro_a(atom)
  end
end
defmodule MacroTest.UseMe do
  defmacro __using__(_) do
    quote do

      defmacro macro_a(:hello_world) do
        quote do
          "Success!"
        end
      end

      defmacro macro_a(:some_other_atom) do
        quote do
          "Did something else..."
        end
      end

    end
  end
end
使用_me.ex

defmodule MacroTest do
  use MacroTest.UseMe

  def run() do
    atom = :hello_world

    macro_a(atom)
  end
end
defmodule MacroTest.UseMe do
  defmacro __using__(_) do
    quote do

      defmacro macro_a(:hello_world) do
        quote do
          "Success!"
        end
      end

      defmacro macro_a(:some_other_atom) do
        quote do
          "Did something else..."
        end
      end

    end
  end
end
当我试图编译这段代码时,我得到了错误

== Compilation error in file lib/macro_test.ex ==
** (FunctionClauseError) no function clause matching in MacroTest.macro_a/1  
如果我更改初始的
run()
函数,使原子直接传递给宏,例如
macro\u a(:hello\u world)
,那么它编译/运行得很好


如何更改此方案,使宏模式能够匹配作为变量提供的值,而不是文字值本身?

这取决于您要执行的操作。宏在编译时运行,并对部分源代码进行操作(与所述源代码返回的运行时值相反)。因此,在本例中,宏知道它已被一个名为
atom
的变量调用,但它无法知道该变量已在调用函数的前面被赋值

您可以在运行时检查给定变量的值:

  defmacro macro_a(a) do
    quote do
      case unquote(a) do
        :hello_world ->
          "Success!"
        :some_other_atom ->
          "Did something else..."
      end
    end
  end

也就是说,每次调用
宏a
都会被上面的
case
表达式替换,使用作为参数传递的任何变量或其他表达式。

这取决于您要执行的操作。宏在编译时运行,并对部分源代码进行操作(与所述源代码返回的运行时值相反)。因此,在本例中,宏知道它已被一个名为
atom
的变量调用,但它无法知道该变量已在调用函数的前面被赋值

您可以在运行时检查给定变量的值:

  defmacro macro_a(a) do
    quote do
      case unquote(a) do
        :hello_world ->
          "Success!"
        :some_other_atom ->
          "Did something else..."
      end
    end
  end

也就是说,每次调用
macro\u a
都会被上面的
case
表达式替换,使用任何变量或其他表达式作为参数传递。

Ah,非常好的建议。这是我正在开发的应用程序的一个很好的解决方案,非常感谢。啊,非常好的建议。这是我正在开发的应用程序的一个很好的解决方案,非常感谢。