multiple-value-setq — 다중 반환값을 여러 변수에 담기

multiple-value-setq — 다중 반환값을 여러 변수에 담기

함수가 돌려주는 여러 값을 한 번에 변수들에 담고 싶을 때가 있어요. (multiple-value-bind (a b) (foo) ...)처럼 본문 안에서 쓰는 매크로도 있지만, 지역이 아니라 기존 변수에 값을 다시 담아야 한다면 어떻게 할까요? multiple-value-setq가 그 역할을 해요. 폼이 돌려주는 값을 여러 변수들에 한꺼번에 대입하는 매크로예요.

출처: CLHS 공식 문서 - MULTIPLE-VALUE-SETQ

본문

multiple-value-setqform을 평가하고, vars에 나열한 각 변수에 그 폼이 돌려준 값들을 순서대로 대입해요. 반환값은 폼의 **첫 번째 값(primary value)**이에요.

multiple-value-setq vars form
=> result

vars는 변수 이름 또는 심볼 매크로 이름들로 이루어진 리스트예요. 값이 변수보다 적으면 모자라는 변수에는 nil이 들어가고, 값이 더 많으면 남는 값은 버려져요.

(multiple-value-setq (quotient remainder) (truncate 3.2 2))
=>  1
quotient   ; =>  1
remainder  ; =>  1.2

(multiple-value-setq (a b c) (values 1 2))
=>  1
a   ; =>  1
b   ; =>  2
c   ; =>  NIL

(multiple-value-setq (a b) (values 4 5 6))
=>  4
a   ; =>  4
b   ; =>  5

vars 중 어떤 것이 심볼 매크로의 이름이라면 setf를 쓴 것처럼 대입돼요. 실제로 multiple-value-setq는 값의 평가 순서와 부수 효과 규칙이 setf와 일관되도록, 다음 형태와 항상 같은 동작을 하도록 정의되어 있어요.

(multiple-value-setq (symbol1 ... symboln) value-producing-form)
==  (values (setf (values symbol1 ... symboln) value-producing-form))

함께 보기

setq, symbol-macrolet