Macro.Env — 컴파일 시점 환경 정보를 담는 구조체

Macro.Env — 컴파일 시점 환경 정보를 담는 구조체

Macro.Env컴파일 타임 환경 정보를 담는 구조체예요. 코드가 컴파일되는 동안 "지금 어느 모듈의 몇 번째 줄에 있는지", "어떤 임포트와 alias가 유효한지" 같은 정보를 한 번에 들고 다니죠.

출처: Macro.Env

본문

현재 환경은 언제든 __ENV__/0으로 접근할 수 있어요. 매크로 안에서는 호출한 쪽의 환경을 __CALLER__/0으로 접근할 수 있고요.

이 모듈의 함수 대부분은 Elixir 컴파일러와 통합해야 하는 저수준 도구(언어 서버나 임베디드 언어 같은)를 위해 제공돼요. 일반적인 Elixir 코드와 매크로에서는 Macro 모듈을 쓰면 충분해요. 특히 Macro.Env 구조체를 직접 수정하는 일은 피하고, import, alias 같은 고수준 구성요소로 자신만의 환경을 만드는 쪽을 권장해요. 예를 들어 커스텀 환경을 만들려면 이런 함수를 정의하면 돼요:

def make_custom_env do
  import SomeModule, only: [some_function: 2], warn: false
  alias A.B.C, warn: false
  __ENV__
end

구조체 필드

Macro.Env 구조체는 다음 필드를 담아요:

  • context — 환경의 문맥. nil(기본 문맥), :guard(가드 안), :match(매치 안) 중 하나예요
  • context_modules — 현재 문맥에서 정의된 모듈들의 리스트
  • file — 현재 절대 파일 이름(binary)
  • function{atom, integer} 튜플. 첫 요소는 함수명, 둘째는 arity예요. 함수 안이 아니라면 nil
  • line — 현재 줄 번호(정수)
  • module — 현재 모듈 이름

다음 필드들은 Elixir의 매크로 확장 메커니즘에만 쓰이는 비공개 필드라서 직접 접근하면 안 돼요:

aliases, functions, macro_aliases, macros, lexical_tracker, requires, tracers, versioned_vars

더 알아보기

  • Macro — 매크로를 다룰 때 실제로 쓰게 될 고수준 모듈
  • __ENV__/0, __CALLER__/0 — 현재·호출 환경 접근 특수 형태
  • Quote and unquote — 매크로의 기반이 되는 인용(quoted expression) 개념