gpt4 book ai didi

macros - Elixir 宏 : how to define function with dynamic arity

转载 作者:行者123 更新时间:2023-12-04 01:58:59 25 4
gpt4 key购买 nike

引用这个帖子:How to create a dynamic function name using Elixir macro? .

上面的帖子问了如何使用宏生成不带参数的函数,但我想知道如何生成带参数的函数?

假设有一个宏 warp ,我可以编写如下代码:

warp fun, [args], :ok

然后它生成如下代码:
fun(args), do: :ok

最佳答案

如果要生成动态参数列表,则需要使用 unquote_splicing , 像这样:

defmacro warp(name, argument_names, code) do
quote do
def unquote(name)(unquote_splicing(argument_names)) do
unquote(code)
end
end
end

后来:
warp :foo, [a, b], {:ok, a, b}

它产生:
def foo(a, b), do: {:ok, a, b}

如果你调用它会产生:
foo(1, 2)
# {:ok, 1, 2}

您也可以在没有 unquote_splicing 的情况下像这样定义宏并将组合的名称和参数传递给 def :
defmacro warp(name_and_args, do: code) do
quote do
def unquote(name_and_args) do
unquote(code)
end
end
end

这意味着您需要调用 warp就像你会调用 def , 例如:
warp foo(a, b), do: {:ok, a, b}

关于macros - Elixir 宏 : how to define function with dynamic arity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com