PROGV 특수 연산자

PROGV 특수 연산자 (progv)

progv는 Common Lisp의 특수 연산자로, 동적(dynamic) 변수의 새 바인딩을 만들어 각 폼을 그 바인딩으로 실행해요. let이 어휘 변수의 이름을 소스에 정해 두고 바인딩한다면, progv런타임에 이름을 정할 수 있는 동적 변수를 바인딩해요. Lisp 안에 다른 언어의 인터프리터를 만들 때 특히 쓸모가 있어요.

출처: CLHS: Special Operator PROGV

문법 (Syntax)

progv symbols values form* => result*

인자와 값 (Arguments and Values)

  • symbols — 기호들의 리스트이며, 평가돼요.
  • values — 객체들의 리스트이며, 평가돼요.
  • forms — 암시적 progn이에요.
  • resultsform들이 돌려준 값들이에요.

설명 (Description)

progv는 새 동적 변수 바인딩을 만들고 그 바인딩을 써서 각 폼을 실행해요. 각 폼은 순서대로 평가돼요.

progv는 이름이 런타임에 결정될 수 있는 동적 변수를 하나 이상 바인딩하게 해 줘요. symbols에 이름이 있는 동적 변수들을 대응하는 values에 바인딩한 채 각 폼을 순서대로 평가해요. values가 너무 적으면 남은 symbols는 바인딩된 뒤 값이 없도록 해요. values가 너무 많으면 초과분은 무시돼요. 동적 변수들의 바인딩은 progv를 빠져나갈 때 풀려요(undo).

예제 (Examples)

 (setq *x* 1) => 1
 (progv '(*x*) '(2) *x*) => 2
 *x* => 1

*x*가 전역 특별 변수가 아닐 때,

 (let ((*x* 3)) 
   (progv '(*x*) '(4) 
     (list *x* (symbol-value '*x*)))) => (3 4)

*x*는 특별 변수가 아니므로 let*x*를 값 3어휘(lexical) 바인딩으로 만들어요. 몸체에서 변수 참조 *x*는 그 어휘 바인딩(3)을 보죠. 한편 progv는 기호 *x*동적 값에 4라는 새 바인딩을 쌓으므로, (symbol-value '*x*)는 그 동적 값(4)을 읽어요. 그래서 결과가 (3 4)가 되고, progv를 빠져나오면 동적 바인딩은 풀려요.

영향 (Affected By)

없음.

예외 상황 (Exceptional Situations)

없음.

함께 보기 (See Also)

  • let
  • Section 3.1 (Evaluation)

참고 (Notes)

progv는 특히 Lisp에 내장된 언어들의 인터프리터를 작성할 때 유용해요. 동적 변수를 바인딩하는 메커니즘에 대한 손잡이(handle)를 제공하니까요.

더 알아보기 (Learn more)