3.5.3 호출 스택
3.5.3 호출 스택 (Call Stack)
함수가 호출될 때마다 새로운 평가 프레임이 생성되고, 계산 중 특정 시점의 활성 환경들은 호출 스택을 통해 접근할 수 있어요. 동적 스코프와 렉시컬 스코프의 차이를 이해하려면 호출 스택이 어떻게 동작하는지 알아두면 좋아요.
출처: 문서
본문
3.5.3 호출 스택
함수가 호출될 때마다 새로운 평가 프레임(evaluation frame)이 생성돼요. 계산이 진행되는 동안 특정 시점에 현재 활성화된 환경들은 호출 스택(call stack) 을 통해 접근할 수 있어요. 함수가 호출될 때마다 컨텍스트(context)라는 특별한 구조가 내부적으로 생성되어 컨텍스트 목록에 추가되고, 함수가 평가를 마치면 해당 컨텍스트는 호출 스택에서 제거돼요.
호출 스택의 더 위쪽에서 정의된 변수들을 사용할 수 있게 하는 것을 동적 스코프(dynamic scope) 라고 해요. 변수에 대한 바인딩은 그 변수의 가장 최근(시간상) 정의에 의해 결정되죠. 이는 R의 기본 스코프 규칙, 즉 함수가 정의된 환경에서 바인딩을 사용하는 렉시컬 스코프(lexical scope) 와는 대조적이에요. 특히 모델 수식을 사용하거나 조작하는 일부 함수들은 호출 스택에 직접 접근하여 동적 스코프를 흉내 내야 할 필요가 있어요.
호출 스택에 대한 접근은 이름이 sys.로 시작하는 함수 계열을 통해 제공돼요. 아래에 간단히 정리할게요.
sys.call— 지정된 컨텍스트의 호출(call)을 가져와요.sys.frame— 지정된 컨텍스트의 평가 프레임을 가져와요.sys.nframe— 모든 활성 컨텍스트의 환경 프레임을 가져와요.sys.function— 지정된 컨텍스트에서 호출 중인 함수를 가져와요.sys.parent— 현재 함수 호출의 부모를 가져와요.sys.calls— 모든 활성 컨텍스트의 호출들을 가져와요.sys.frames— 모든 활성 컨텍스트의 평가 프레임들을 가져와요.sys.parents— 모든 활성 컨텍스트의 숫자 레이블들을 가져와요.sys.on.exit— 지정된 컨텍스트가 종료될 때 실행할 함수를 설정해요.sys.status—sys.frames,sys.parents,sys.calls를 호출해요.parent.frame— 지정된 부모 컨텍스트의 평가 프레임을 가져와요.