다중

다중 값 에서 Common Lisp

3개의 연습 문제

다중 값 소개

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
GitHub에서 편집 링크가 새 창이나 탭에서 열려요

다중 값 배우기

연습이 잠겨 있어요

다중 값 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요