Common Lisp에서 함수는 값을 하나만 반환하는 것이 아니라 여러 값을 반환할 수도 있어요. 예를 들어 0 방향으로 내림하는 floor는 두 개의 값을 반환하는데, 첫 번째는 내림한 값이고 두 번째는 나머지예요.
(floor 3.5) ; => 3
; 0.5
(여러 값이 반환되면 출력에서 각각 다른 줄에 표시할게요.)
함수가 여러 값을 반환하게 하고 싶다면 values 접근자를 사용해요.
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
반환하고 싶은 값들이 리스트로 있다면 value-list를 사용할 수 있어요.
(values-list '(a b c)) ; => a
; b
; c
첫 번째 값에만 관심이 있다면 특별히 할 일은 없어요. 언어가 알아서 처리해 줘요:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
하지만 나머지 값들에 접근하고 싶다면 사용해야 할 함수가 몇 가지 있어요.
대표적인 매크로가 multiple-value-list와 multiple-value-bind 두 가지예요.
이 둘은 여러 값을 반환하는 것을 감싸서 그 값들을 모두 담는 데 사용해요.
첫 번째는 모든 값으로 이루어진 리스트를 만들어요.
두 번째는 각각의 값에 변수를 묶을 수 있게 해줘요.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
a, b, c 변수는 multiple-values-bind 안에서만 스코프를 가진다는 점에 유의해요.
또 하나 유용한 매크로는 nth-value예요. 여러 값 중에서 "n번째" 항목을 반환한다는 점에서 리스트에 쓰는 nth와 비슷해요:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3