Elixir中导入的宏生成代码的范围

时间:2015-12-21 16:17:49

标签: functional-programming macros elixir

我正在经历SašaJurić的精彩series on macros,在运行以下代码时,我遇到了一些令我困惑的事情:

do_match/3

我的问题是:

  • 哪个模块注入了Plug.Router函数?是在MyRouter模块中,还是在use模块中?在文章的下面,提到requireimport将代码注入调用者的模块中。这对Macro.to_string/3 ed宏也有效吗?

  • 在Elixir的代码中我应该寻找这种行为的实现吗?

  • 有一种简单的方法可以在扩展后检查模块的结构吗?相当于Module的东西,但是对于{{1}} s?

1 个答案:

答案 0 :(得分:1)

宏生成的函数将在MyRouter

中定义

如果你require一个模块,它的宏将可供调用者模块使用。如果您import模块,则可以访问其宏和函数,而无需使用模块名称作为前缀。有关详细信息,请参阅getting started guide on alias, require and import

requireimport是Elixir的相当低级别的功能,因此它们直接在Erlang中实现。可以找到相当数量的importrequire逻辑here

我不知道对这些事情进行反省的方法,因为宏基本上不会在编译的代码中留下任何痕迹。它是宏的美妙之处,它们不会为您的代码带来任何额外的开销。但是,您可以使用MyRouter.__info__(:functions)

检查宏扩展后模块中的哪些功能