【发布时间】:2015-12-22 02:28:02
【问题描述】:
我正在浏览 Saša Jurić 的精彩 series on macros,在运行以下代码时,我遇到了一些让我感到困惑的事情:
defmodule Plug.Router do
defmacro get(route, body) do
quote do
defp do_match("GET", unquote(route), var!(conn)) do
unquote(body[:do])
end
end
end
end
defmodule MyRouter do
import Plug.Router
def match(type, route) do
do_match(type, route, :dummy_connection)
end
get "/hello", do: {conn, "Hi!"}
get "/goodbye", do: {conn, "Bye!"}
MyRouter.match("GET", "/hello") |> IO.inspect
MyRouter.match("GET", "/goodbye") |> IO.inspect
end
我的问题是:
do_match/3函数注入到哪个模块中?是在Plug.Router模块中,还是在MyRouter模块中?在文章的后面,提到use和require将代码注入到调用者的模块中。这对imported 宏也有效吗?我应该在 Elixir 的代码中哪里寻找这种行为的实现?
有没有一种简单的方法可以在扩展后检查模块的结构?相当于
Macro.to_string/3,但对于Modules?
【问题讨论】:
-
我不确定您的其他问题的答案,但文档中有这样的内容:“请注意,自动导入模块需要它”(来自此处:elixir-lang.org/getting-started/alias-require-and-import.html)所以我会猜想 import 也将代码注入到调用者的模块中。
-
Import 不会将任何代码注入调用者模块。它纯粹是一个词法结构。
标签: functional-programming macros elixir