SETQ 특수 폼
SETQ 특수 폼 (setq)
setq는 Common Lisp에서 **변수에 값을 할당하는 가장 기본적인 특수 폼(special form)**이에요. 이전 코드에서 만든 변수의 값을 바꾸거나, 여러 변수에 순서대로 값을 채울 때 가장 흔하게 쓰는 문장이죠. 특수 연산자와는 달리 인자를 평가하면서 할당을 수행하는데, 그래서 CLHS에서는 'Special Form'으로 분류해요.
발음 (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로 할당할 수 있어요.
var가 symbol-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 예제에서는 setq가 setf처럼 동작해 x 리스트의 원소가 실제로 바뀌는 걸 확인할 수 있어요.
부수 효과 (Side Effects)
각 form의 주 값이 대응하는 var에 할당돼요.
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
없음.
함께 보기 (See Also)
psetq,set,setf
참고 (Notes)
없음.