檢視原始碼 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()]

傳回目前環境中的變數清單。

每個變數都由兩個元素的元組識別,其中第一個元素是變數名稱(以原子表示),第二個元素是其脈絡,可以是原子或整數。