我只是为了娱乐而不是利润来搞乱灵丹妙药中的宏。所以我有一个逗号分隔的字符串,我想动态创建一个函数,该列表作为参数,即
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)
。那么如何将字符串转换为方法参数?
克里斯
答案 0 :(得分:1)
可能有更好的方法,但将"a,b,c"
转换为可注入def
参数列表的内容的一种方法是使用Code.string_to_quoted!/1
和unquote_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
来访问变量,而无法直接访问a
,b
或c
内部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]