查看源代码 Macro.Env (Elixir v1.16.2)
一个保存编译时环境信息的结构体。
当前环境可以在任何时候通过 __ENV__/0
访问。在宏内部,调用者环境可以通过 __CALLER__/0
访问。
不应手动修改 Macro.Env
实例。如果你需要创建自定义环境并传递给 Code.eval_quoted/3
,可以使用以下技巧
def make_custom_env do
import SomeModule, only: [some_function: 2], warn: false
alias A.B.C, warn: false
__ENV__
end
然后你可以调用 make_custom_env()
获取一个包含所需导入和别名的结构体。
它包含以下字段
context
- 环境的上下文;它可以是nil
(默认上下文)、:guard
(在守卫内)或:match
(在匹配内)context_modules
- 当前上下文中定义的模块列表file
- 当前绝对文件名,以二进制形式表示function
- 一个元组,格式为{atom, integer}
,其中第一个元素是函数名,第二个元素是它的元数;如果不在函数内部,则返回nil
line
- 当前行号,以整数形式表示module
- 当前模块名
以下字段是 Elixir 的宏扩展机制私有字段,不可直接访问
aliases
functions
macro_aliases
macros
lexical_tracker
requires
tracers
versioned_vars
摘要
类型
@type context() :: :match | :guard | nil
@type context_modules() :: [module()]
@type file() :: binary()
@type line() :: non_neg_integer()
@type t() :: %Macro.Env{ aliases: aliases(), context: context(), context_modules: context_modules(), file: file(), function: name_arity() | nil, functions: functions(), lexical_tracker: lexical_tracker(), line: line(), macro_aliases: macro_aliases(), macros: macros(), module: module(), requires: requires(), tracers: tracers(), versioned_vars: versioned_vars() }
函数
获取给定原子的别名。
如果别名存在,则返回 {:ok, alias}
,否则返回 :error
。
示例
iex> alias Foo.Bar, as: Baz
iex> Baz
Foo.Bar
iex> Macro.Env.fetch_alias(__ENV__, :Baz)
{:ok, Foo.Bar}
iex> Macro.Env.fetch_alias(__ENV__, :Unknown)
:error
获取给定原子的宏别名。
如果别名存在,则返回 {:ok, macro_alias}
,否则返回 :error
。
宏别名仅在引用扩展内部使用。有关更一般的示例,请参阅 fetch_alias/2
。
检查变量是否属于环境。
示例
iex> x = 13
iex> x
13
iex> Macro.Env.has_var?(__ENV__, {:x, nil})
true
iex> Macro.Env.has_var?(__ENV__, {:unknown, nil})
false
返回编译环境当前是否在守卫内部。
返回编译环境当前是否在匹配子句内部。
返回一个包含文件和行号信息作为键的关键字列表。
返回给定模块或原子的所有别名。
示例
iex> alias Foo.Bar
iex> Bar
Foo.Bar
iex> Macro.Env.lookup_alias_as(__ENV__, Foo.Bar)
[Elixir.Bar]
iex> alias Foo.Bar, as: Baz
iex> Baz
Foo.Bar
iex> Macro.Env.lookup_alias_as(__ENV__, Foo.Bar)
[Elixir.Bar, Elixir.Baz]
iex> Macro.Env.lookup_alias_as(__ENV__, Unknown)
[]
@spec lookup_import(t(), name_arity()) :: [{:function | :macro, module()}]
返回导入给定 {name, arity}
的模块。
它返回一个包含两个元素元组的列表,元组的格式为 {:function | :macro, module}
。列表中的元素没有特定顺序,顺序也不保证。
示例
iex> Macro.Env.lookup_import(__ENV__, {:duplicate, 2})
[]
iex> import Tuple, only: [duplicate: 2], warn: false
iex> Macro.Env.lookup_import(__ENV__, {:duplicate, 2})
[{:function, Tuple}]
iex> import List, only: [duplicate: 2], warn: false
iex> Macro.Env.lookup_import(__ENV__, {:duplicate, 2})
[{:function, List}, {:function, Tuple}]
iex> Macro.Env.lookup_import(__ENV__, {:def, 1})
[{:macro, Kernel}]
在环境的追踪器列表中添加一个追踪器。
示例
Macro.Env.prepend_tracer(__ENV__, MyCustomTracer)
从环境中修剪编译信息。
这种情况发生在编译时捕获环境时,例如,在模块主体中,然后在模块定义后使用它来评估代码。
如果给定模块已被要求,则返回 true
。
示例
iex> Macro.Env.required?(__ENV__, Integer)
false
iex> require Integer
iex> Macro.Env.required?(__ENV__, Integer)
true
iex> Macro.Env.required?(__ENV__, Kernel)
true
返回环境堆栈跟踪。
返回匹配上下文中的 Macro.Env
。
返回当前环境中的变量列表。
每个变量都由一个包含两个元素的元组标识,其中第一个元素是变量名,以原子形式表示,第二个元素是它的上下文,可以是原子或整数。