DEFINE-SYMBOL-MACRO — 심볼 매크로 정의하기

DEFINE-SYMBOL-MACRO — 심볼 매크로 정의하기 (매크로)

심볼이 나타날 때마다 특정 표현식으로 확장되게 하는 symbol macro를 전역으로 정의하는 매크로예요. 변수처럼 보이는데 실제로는 매크로 확장을 거치는 이름을 만들고 싶을 때 써요.

출처: DEFINE-SYMBOL-MACRO - Common Lisp HyperSpec

시그니처 (Syntax)

define-symbol-macro symbol expansion => symbol
  • symbolsymbol.
  • expansionform.

본문 (Description)

지정한 symbolmacro expansion에 전역으로 영향을 주는 메커니즘을 제공해요.

symbol이 가리키는 symbol macro에 대한 확장 함수를 전역으로 확립해요. symbol macro의 확장 function이 가진 유일하게 보장된 성질은, 그 함수를 formenvironment에 적용했을 때 올바른 확장을 돌려준다는 거예요. (특히 확장이 개념적으로 확장 함수·environment·둘 다 어디에 저장되는지는 implementation-dependent해요.)

symbol에 대한 각 전역 참조(즉 같은 symbol 이름의 variable이나 symbol macro bindingshadowed되지 않은 참조)는 일반적인 매크로 확장 과정으로 확장돼요. Section 3.1.2.1.1 (Symbols as Forms)을 보세요. symbol macro의 확장은 일반 macro와 정확히 유사하게, symbol macro가 참조된 것과 같은 lexical environment에서 추가 macro expansion을 받아요.

이 정의의 scope 안에서 symbol에 대해 special 선언을 하면 결과는 불특정이에요(즉 같은 symbol 이름의 variable이나 symbol macro binding에 shadowed되지 않은 경우).

이 정의의 scope 안에서 setq를 써서 symbol의 값을 설정하는 것은 setf처럼 취급돼요. symbol에 대한 psetqpsetf처럼, multiple-value-setqvalues에 대한 setf처럼 취급돼요.

symbol macro의 bindinglet이나 symbol-macrolet으로 shadowed될 수 있어요.

예제 (Examples)

(defvar *things* (list 'alpha 'beta 'gamma)) =>  *THINGS*

(define-symbol-macro thing1 (first *things*)) =>  THING1

(define-symbol-macro thing2 (second *things*)) =>  THING2

(define-symbol-macro thing3 (third *things*)) =>  THING3

thing1 =>  ALPHA

(setq thing1 'ONE) =>  ONE

*things* =>  (ONE BETA GAMMA)

(multiple-value-setq (thing2 thing3) (values 'two 'three)) =>  TWO

thing3 =>  THREE

*things* =>  (ONE TWO THREE)

(list thing2 (let ((thing2 2)) thing2)) =>  (TWO 2)

더 알아보기 (See Also)

symbol-macrolet, macroexpand

예외 상황 (Exceptional Situations)

symbol이 이미 global variable로 정의되어 있으면 typeprogram-error인 에러가 신호돼요.

Notes

없음.