SETQ 특수 폼

SETQ 특수 폼 (setq)

setq는 Common Lisp에서 **변수에 값을 할당하는 가장 기본적인 특수 폼(special form)**이에요. 이전 코드에서 만든 변수의 값을 바꾸거나, 여러 변수에 순서대로 값을 채울 때 가장 흔하게 쓰는 문장이죠. 특수 연산자와는 달리 인자를 평가하면서 할당을 수행하는데, 그래서 CLHS에서는 'Special Form'으로 분류해요.

출처: CLHS: Special Form SETQ

발음 (Pronunciation)

['set,kyoo]

문법 (Syntax)

setq {pair}* => result

pair::= var form

인자와 값 (Arguments and Values)

  • var상수 변수(constant variable)가 아닌 변수를 가리키는 심볼이에요.
  • form — 폼이에요.
  • result — 마지막 form의 **주 값(primary value)**이며, pair가 하나도 없으면 nil이에요.

설명 (Description)

setq는 변수에 값을 할당해요. (setq var1 form1 var2 form2 ...)는 Lisp의 단순 변수 할당 문장이에요. 먼저 form1을 평가해 그 결과를 var1에 저장하고, 이어서 form2를 평가해 결과를 var2에 저장하는 식으로 진행돼요. 렉시컬 변수든 다이내믹 변수든 모두 setq로 할당할 수 있어요.

varsymbol-macrolet이 만든 바인딩을 가리키면, 그 var는 마치 setq 대신 setf를 쓴 것처럼 취급돼요.

예제 (Examples)

;; A simple use of SETQ to establish values for variables.
(setq a 1 b 2 c 3) =>  3
a =>  1
b =>  2
c =>  3

;; Use of SETQ to update values by sequential assignment.
(setq a (1+ b) b (1+ a) c (+ a b)) =>  7
a =>  3
b =>  4
c =>  7

;; This illustrates the use of SETQ on a symbol macro.
(let ((x (list 10 20 30)))
  (symbol-macrolet ((y (car x)) (z (cadr x)))
    (setq y (1+ z) z (1+ y))
    (list x y z)))
=>  ((21 22 30) 21 22)

"sequential assignment" 예제가 핵심이에요. a를 바꾸고 난 뒤에 b를 계산하니까 b는 갱신된 a 값을 사용해요. 즉 setq는 오른쪽에서 왼쪽이 아니라 왼쪽에서 오른쪽으로 순차적으로 평가·할당을 진행해요. 마지막 symbol-macrolet 예제에서는 setqsetf처럼 동작해 x 리스트의 원소가 실제로 바뀌는 걸 확인할 수 있어요.

부수 효과 (Side Effects)

form의 주 값이 대응하는 var에 할당돼요.

영향 (Affected By)

없음.

예외 상황 (Exceptional Situations)

없음.

함께 보기 (See Also)

  • psetq, set, setf

참고 (Notes)

없음.

더 알아보기 (Learn more)