查看源代码 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

摘要

函数

获取给定原子的别名。

获取给定原子的宏别名。

检查变量是否属于环境。

返回编译环境当前是否在守卫内部。

返回编译环境当前是否在匹配子句内部。

返回一个包含文件和行号信息作为键的关键字列表。

返回给定模块或原子的所有别名。

返回导入给定 {name, arity} 的模块。

在环境的追踪器列表中添加一个追踪器。

从环境中修剪编译信息。

如果给定模块已被要求,则返回 true

返回环境堆栈跟踪。

返回匹配上下文中的 Macro.Env

返回当前环境中的变量列表。

类型

@type context() :: :match | :guard | nil
@type context_modules() :: [module()]
@type file() :: binary()
@type line() :: non_neg_integer()
@type name_arity() :: {atom(), arity()}
@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()
}
@type variable() :: {atom(), atom() | term()}

函数

链接到此函数

fetch_alias(env, atom)

查看源代码 (自 1.13.0 起)
@spec fetch_alias(t(), atom()) :: {:ok, atom()} | :error

获取给定原子的别名。

如果别名存在,则返回 {: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
链接到此函数

fetch_macro_alias(env, atom)

查看源代码 (自 1.13.0 起)
@spec fetch_macro_alias(t(), atom()) :: {:ok, atom()} | :error

获取给定原子的宏别名。

如果别名存在,则返回 {:ok, macro_alias},否则返回 :error

宏别名仅在引用扩展内部使用。有关更一般的示例,请参阅 fetch_alias/2

链接到此函数

has_var?(env, var)

查看源代码 (自 1.7.0 起)
@spec has_var?(t(), variable()) :: boolean()

检查变量是否属于环境。

示例

iex> x = 13
iex> x
13
iex> Macro.Env.has_var?(__ENV__, {:x, nil})
true
iex> Macro.Env.has_var?(__ENV__, {:unknown, nil})
false
@spec in_guard?(t()) :: boolean()

返回编译环境当前是否在守卫内部。

@spec in_match?(t()) :: boolean()

返回编译环境当前是否在匹配子句内部。

@spec location(t()) :: keyword()

返回一个包含文件和行号信息作为键的关键字列表。

链接到此函数

lookup_alias_as(env, atom)

查看源代码 (自 1.15.0 起)
@spec lookup_alias_as(t(), atom()) :: [atom()]

返回给定模块或原子的所有别名。

示例

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)
[]
链接到此函数

lookup_import(env, name_arity)

查看源代码 (自 1.13.0 起)
@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}]
链接到此函数

prepend_tracer(env, tracer)

查看源代码 (自 1.13.0 起)
@spec prepend_tracer(t(), module()) :: t()

在环境的追踪器列表中添加一个追踪器。

示例

Macro.Env.prepend_tracer(__ENV__, MyCustomTracer)
链接到此函数

prune_compile_info(env)

查看源代码 (自 1.14.0 起)
@spec prune_compile_info(t()) :: t()

从环境中修剪编译信息。

这种情况发生在编译时捕获环境时,例如,在模块主体中,然后在模块定义后使用它来评估代码。

链接到此函数

required?(env, module)

查看源代码 (自 1.13.0 起)
@spec required?(t(), module()) :: boolean()

如果给定模块已被要求,则返回 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
@spec stacktrace(t()) :: list()

返回环境堆栈跟踪。

@spec to_match(t()) :: t()

返回匹配上下文中的 Macro.Env

链接到此函数

vars(env)

查看源代码 (自 1.7.0 起)
@spec vars(t()) :: [variable()]

返回当前环境中的变量列表。

每个变量都由一个包含两个元素的元组标识,其中第一个元素是变量名,以原子形式表示,第二个元素是它的上下文,可以是原子或整数。