Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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
Elixir中的源代码生成_Elixir - Fatal编程技术网

Elixir中的源代码生成

Elixir中的源代码生成,elixir,Elixir,我目前正在学习/阅读元编程长生不老药 我成功地生成了一个函数,该函数使用宏输入其名称: defmodule MyMacros do defmacro fun_gen(name) do atom_name = elem(name, 0) str_name = atom_name |> to_string quote do def unquote(name) do IO.puts unquote(str_name) end

我目前正在学习/阅读元编程长生不老药
我成功地生成了一个函数,该函数使用宏输入其名称:

defmodule MyMacros do
  defmacro fun_gen(name) do
    atom_name = elem(name, 0)
    str_name = atom_name |> to_string
    quote do
      def unquote(name) do
        IO.puts unquote(str_name)
      end
    end
  end
end

defmodule My do
  require MyMacros
  MyMacros.fun_gen(bar)
end
结果是:

iex(1)> My.bar
bar
:ok
这很好:)但我想知道是否可以使用Enum生成几个函数。每个函数或类似的函数:

defmodule MyMacros do
  defmacro fun_gen(name) do
    atom_name = elem(name, 0)
    str_name = atom_name |> to_string
    quote do
      def unquote(name) do
        IO.puts unquote(str_name)
      end
    end
  end
end

defmodule My do
  require MyMacros
  loop (~w(foo bar baz) do
    MyMacros.fun_gen(item)
  end
end
是否有一种循环的方式来生成源代码? 谢谢大家!

您完全可以不使用宏来执行此操作:

defmodule My do
@方法~w |一二三| a
我的方法一
一
iex>我的第二个
二
或使用宏:

defmodule MyMacros do
defmacro gen_funs(名称)do
我的名字是My2.one
一
iex>My2.2
二

注意:我们将列表直接传递给
gen\u funs
,而不是包含列表的符号或变量。我们必须这样做,因为宏收到引用的参数。这就是为什么必须在宏中执行循环,而不是在使用宏的模块中执行循环。

Cool!原子在内部表示为它们自己,这很方便:)谢谢you@BenNG是的,还有名单<代码>[:一、二、三]==引用do:[:一、二、三]