我正在尝试在 elixir 中编写一个宏,该宏创建一个 Phoenix 路由器和一个控制器,该控制器具有一个应该向调用者进程发送消息的操作(从测试中调用它)。
这是对宏的调用:
start_server self(), "TestService", 8080, "/some_action", fn(conn, _) ->
conn |> text("")
end
问题是我从测试中通过的 pid 在操作中没有保留。Line#1
打印正确的 pid,line#2
打印错误的 pid。我很确定我错过了一些关于quote
/的东西unquote
,但我找不到我做错了什么?
这是宏定义:
defmacro start_server pid, name, port, path, handler do
controller_name = String.to_atom("#{name}Controller")
router_name = String.to_atom("#{name}Router")
quote do
IO.inspect(unquote(pid)) # 1
ctrl = defmodule unquote(controller_name) do
use Phoenix.Controller
def handle conn, msg do
IO.inspect(unquote(pid)) # 2
send unquote(pid), {:request, unquote(path), unquote(name)}
unquote(handler).(conn, msg)
end
end
IO.inspect ctrl
router = defmodule unquote(router_name) do
use Phoenix.Router
post unquote(path), unquote(controller_name), :handle
end
Application.put_env(:phoenix, unquote(router_name),
port: unquote(port),
debug_errors: true
)
IO.inspect router
{:ok, pid} = unquote(router_name).start()
end
end