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,累加:真)|
给朗