elixir字符串到宏中的方法参数

时间:2016-08-27 10:14:51

标签: macros elixir

我只是为了娱乐而不是利润来搞乱灵丹妙药中的宏。所以我有一个逗号分隔的字符串,我想动态创建一个函数,该列表作为参数,即

defmacro  __using__(opts) do
  args = "a,b,c"
  quote do
    def test(unquote(args)) do
      IO.inspect("#{a},#{b},#{c}")
    end
  end
end

我遇到的问题是,由于显而易见的原因,创建的方法是:test("1,2,3")而不是test(1,2,3)。那么如何将字符串转换为方法参数?

克里斯

1 个答案:

答案 0 :(得分:1)

可能有更好的方法,但将"a,b,c"转换为可注入def参数列表的内容的一种方法是使用Code.string_to_quoted!/1unquote_splicing

defmacro  __using__(_opts) do
  args = "a,b,c"
  args = Code.string_to_quoted!("[#{args}]")
  quote do
    def test(unquote_splicing(args)) do
      IO.inspect(unquote(args))
    end
  end
end

请注意,由于卫生,您必须使用args来访问变量,而无法直接访问abc内部def。

完整示例:

defmodule Macros do
  defmacro  __using__(_opts) do
    args = "a,b,c"
    args = Code.string_to_quoted!("[#{args}]")
    quote do
      def test(unquote_splicing(args)) do
        IO.inspect(unquote(args))
      end
    end
  end
end

defmodule Main do
  use Macros

  def main do
    test("a", "b", "c")
    test(1, 2, 3)
  end
end

Main.main

输出:

["a", "b", "c"]
[1, 2, 3]