Referencia rapida de sintaxe para metaprogramacao, inspecao de AST em tempo de compilacao e macros em Elixir.
🔗 Relacionado: Folha de dicas da Linguagem Elixir
Formas especiais e pseudovariáveis (Special Forms & Pseudo-Variables)
Constructos principais definidos em Kernel.SpecialForms:
__DIR__ # Caminho absoluto para o diretorio do arquivo atual
__MODULE__ # Atomo com o nome do modulo atual
__ENV__ # Struct do ambiente de compilacao (Macro.Env)
__CALLER__ # Struct do ambiente de quem chamou a macro
Inspecionando o ambiente (ENV)
# Inspecionar campos do ambiente de compilacao
Map.keys(__ENV__)
# => [:__struct__, :aliases, :context, :context_modules, :export_vars, :file,
# :function, :functions, :lexical_tracker, :line, :macro_aliases, :macros,
# :module, :requires, :vars]
# Inspecionar definicoes no modulo chamador
__CALLER__.module |> Module.definitions_in() |> IO.inspect()
Quotes, AST e despacho dinâmico (Quotes, AST & Dynamic Dispatch)
# Gerar arvore de sintaxe abstrata (AST)
quote do: 1 + 2
# => {:+, [context: Elixir, import: Kernel], [1, 2]}
# Unquote dentro de quote
number = 10
quote do: 1 + unquote(number)
# Invocacao dinamica de funcao
apply(Enum, :reverse, [[1, 2, 3]])
# => [3, 2, 1]