У меня есть этот модуль
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