Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 长生不老药

Elixir 长生不老药,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试用elixir编写一个宏,它创建一个Phoenix路由器和一个控制器,该控制器有一个动作,该动作应该将消息发送给调用方进程(从测试中调用它) 下面是对宏的调用: start_server self(), "TestService", 8080, "/some_action", fn(conn, _) -> conn |> text("") end 问题是,我从测试中传递的pid在操作中没有被保留。 第#1行打印正确的pid,第#2行打印错误的pid。我很确定我遗漏了一

我正在尝试用elixir编写一个宏,它创建一个Phoenix路由器和一个控制器,该控制器有一个动作,该动作应该将消息发送给调用方进程(从测试中调用它)

下面是对宏的调用:

start_server self(), "TestService", 8080, "/some_action", fn(conn, _) ->
  conn |> text("")
end
问题是,我从测试中传递的pid在操作中没有被保留。 第
#1行
打印正确的pid,第
#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

错误的pid是什么意思?此外,您不能像那样序列化函数(您不能获得匿名函数并将其注入到模块中,因为函数不是有效的引用表达式)。一开始,由于不同的原因,您试图做的似乎不起作用,但很难提出改进建议,因为不清楚您想要实现什么。@JoséValim我正在尝试运行http服务器,并在每个测试中提供它的单控制器操作行为。关于引用匿名函数,这里是我得到的:iex>quote do:fn(conn,)->conn |>text(“”)end{:fn,[],[],[],[],[[],[[[]:conn,[],[],[],[],[context:Elixir,import:Kernel],[context:Elixir,[],[],[],[],[],[],[]]抱歉,但动态生成控制器+路由器听起来并不是解决这个问题的好办法。首先,它会使您的测试套件变得昂贵,因为每次测试编译一堆模块会很昂贵。其次,它不容易理解,因为宏代码很复杂。最后,控制器是插头,至少在master上是这样,这意味着您可以直接测试它们: