Elixir:生成catch-all函数调用

时间:2015-04-11 03:59:13

标签: macros elixir

我有一个宏,它将catch-all函数放在模块的末尾,因此生成的模块看起来像:

defmodule Module1 do
   <module body>
   ## Generated catch-all functions
   def fun1(_, _), do: :ok
   ## ..more catch-all functions...##
end ## of module

我试图解决的问题是禁止警告

&#34;此子句无法匹配,因为第XX行的前一个子句始终匹配&#34;如果宏的用户将具有,例如<​​/ p>

   def fun1(arg1, arg2), do: ...

在模块的正文中。

我想我可以通过模块的身体AST并在生成全部捕获函数之前对函数签名进行一些分析,但这似乎是很多工作。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

(我想你知道这个解决方案,但也许对其他SO用户来说回答这个问题很有用:))

正如José所说,在代码中隐藏太多是不太好的做法,因为它可能导致意外(隐藏代码可以做一些你不希望做的事情),甚至可以限制你(特别是如果你有明确的捕获,你就无法摆脱它......)。

我认为最好的方法是明确使用宏来生成所有样板代码。调用宏的一行不是样板;)

示例实施: https://gist.github.com/mprymek/73f878e103f60d6d89e2