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
Macros 模块属性的elixir元编程_Macros_Elixir_Metaprogramming - Fatal编程技术网

Macros 模块属性的elixir元编程

Macros 模块属性的elixir元编程,macros,elixir,metaprogramming,Macros,Elixir,Metaprogramming,我有这个模块 defmodule ElixirMeta.LangLoader do @external_resource [Path.join([__DIR__, "es.json"]), Path.join([__DIR__, "en.json"])] defmacro __using__(_) do for lang <- ["es", "en"] do {:ok, body} = File.read(Path

我有这个模块

defmodule ElixirMeta.LangLoader do

  @external_resource [Path.join([__DIR__, "es.json"]),
                      Path.join([__DIR__, "en.json"])]

  defmacro __using__(_) do
    for lang <- ["es", "en"] do
      {:ok, body} = File.read(Path.join([__DIR__, "#{lang}.json"]))
      {:ok, json} = Poison.decode(body)
      quote do
        def lang(unquote(lang)), do: unquote(Macro.escape(json))
      end
    end
  end
end

defmodule ElixirMeta.Lang do
  use ElixirMeta.LangLoader
end
可以这样称呼:

Lang.lang("es")
def unquote(:"lang_#{lang}")(), do: unquote(Macro.escape(json))
Lang.lang_es
甚至修改它的函数名,如下所示:

Lang.lang("es")
def unquote(:"lang_#{lang}")(), do: unquote(Macro.escape(json))
Lang.lang_es
被这样称呼:

Lang.lang("es")
def unquote(:"lang_#{lang}")(), do: unquote(Macro.escape(json))
Lang.lang_es
但是,是否可以对模块属性执行相同的操作

作为已编译的模块属性(?)我认为不可能从宏初始化它?也许在编译宏之前,我必须在
中执行它


出于本例的目的,我想访问
Lang.Lang_es
作为
@Lang_es
@Lang_en
LangLoader
属性

是的,可以使用(我已经用您的初始代码创建了一个MCVE):

defmodule ElixirMeta.LangLoader do
定义宏\uuuuuu使用\uuuu(\uu)do
[
(引用do:Module.register\u属性\uuuu模块,
:langs,累加:真)|

对于lang是的,可以通过以下方法实现(我已经用您的初始代码创建了一个MCVE):

defmodule ElixirMeta.LangLoader do
定义宏\uuuuuu使用\uuuu(\uu)do
[
(引用do:Module.register\u属性\uuuu模块,
:langs,累加:真)|
给朗