Spec-Zone.ru › Elixir 1.13

Macro.Env

Структура, хранящая информацию об окружении во время компиляции.

Текущее окружение можно получить в любой момент как __ENV__/0. Внутри макросов, окружение вызывающего макрос можно получить как __CALLER__/0.

Экземпляр Macro.Env не должен изменяться вручную. Если вам нужно создать пользовательское окружение для передачи в Code.eval_quoted/3, используйте следующий трюк:

def make_custom_env do
  import SomeModule, only: [some_function: 2]
  alias A.B.C
  __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

Краткое описание

Типы

context()
context_modules()
file()
line()
name_arity()
t()
variable()

Функции

fetch_alias(map, atom)

Возвращает псевдоним для данного атома.

fetch_macro_alias(map, atom)

Возвращает макро-псевдоним для данного атома.

has_var?(env, var)

Проверяет, принадлежит ли переменная текущему окружению.

in_guard?(env)

Возвращает true, если компиляция происходит внутри условия.

in_match?(env)

Возвращает true, если компиляция происходит внутри правила соответствия.

location(env)

Возвращает список ключевых слов, содержащий информацию о файле и строке как ключи.

lookup_import(map, pair)

Возвращает модули, из которых был импортирован данный {name, arity}.

prepend_tracer(env, tracer)

Добавляет отслеживатель в начало списка отслеживателей в окружении.

required?(map, mod)

Возвращает true, если указанный модуль был загружен.

stacktrace(env)

Возвращает стек отслеживания окружения.

to_match(env)

Возвращает Macro.Env в контексте соответствия.

vars(env)

Возвращает список переменных в текущем окружении.

Типы

context()Source

@type context() :: :match | :guard | nil

context_modules()Source

@type context_modules() :: [module()]

file()Source

@type file() :: binary()

line()Source

@type line() :: non_neg_integer()

name_arity()Source

@type name_arity() :: {atom(), arity()}

t()Source

@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()
}

variable()Source

@type variable() :: {atom(), atom() | term()}
END_OF_DOCUMENT_MARKER

Функции

fetch_alias(map, atom)Source

@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(map, atom)Source

@spec fetch_macro_alias(t(), atom()) :: {:ok, atom()} | :error

Возвращает макро-псевдоним для данного атома.

Возвращает {:ok, macro_alias} если псевдоним существует, :error в противном случае.

Макро-псевдоним используется только внутри развёртывания кода. Смотрите fetch_alias/2 для более общего примера.

has_var?(env, var)Source

@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

in_guard?(env)Source

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

Возвращает, находится ли среда компиляции внутри условия.

in_match?(env)Source

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

Возвращает, находится ли среда компиляции внутри ветви совпадения.

location(env)Source

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

Возвращает список ключевых слов с информацией о файле и строке как ключи.

lookup_import(map, pair)Source

@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)Source

@spec prepend_tracer(t(), module()) :: t()

Добавляет отслеживатель в начало списка отслеживателей в среде.

Примеры

Macro.Env.prepend_tracer(__ENV__, MyCustomTracer)

required?(map, mod)Source

@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

stacktrace(env)Source

@spec stacktrace(t()) :: list()

Возвращает стек отладки среды.

to_match(env)Source

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

Возвращает Macro.Env в контексте совпадения.

vars(env)Source

@spec vars(t()) :: [variable()]

Возвращает список переменных в текущей среде.

Каждая переменная идентифицируется кортежем из двух элементов: имя переменной как атом и контекст, который может быть атомом или целым числом.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.13.4/Macro.Env.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API