檢視原始碼 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
。
傳回目前環境中的變數清單。
每個變數都由兩個元素的元組識別,其中第一個元素是變數名稱(以原子表示),第二個元素是其脈絡,可以是原子或整數。