【发布时间】:2018-10-30 11:16:53
【问题描述】:
我有这个模块
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
我知道我可以定义如下函数:
def lang(unquote(lang)), do: unquote(Macro.escape(json))
并且可以这样调用:
Lang.lang("es")
还要修改它的函数名,像这样:
def unquote(:"lang_#{lang}")(), do: unquote(Macro.escape(json))
然后这样称呼:
Lang.lang_es
但是是否可以对模块属性做同样的事情?
并且是编译的模块属性(?)我认为不可能从宏初始化它?也许我必须在before_compile 宏中执行此操作?
出于示例的目的,我想访问 Lang.lang_es 作为 @lang_es 和 @lang_en LangLoader 属性
【问题讨论】:
标签: macros elixir metaprogramming