multiple-value-bind — 여러 값을 한꺼번에 변수에 묶기

multiple-value-bind — 여러 값을 한꺼번에 변수에 묶기

어떤 폼이 여러 값을 돌려줄 때, 그 값들을 각각 다른 변수에 담아 몸통을 실행하고 싶을 때가 있어요. multiple-value-bind는 바로 그런 일을 하는 매크로예요. 값들을 한 번에 묶어주니 values와 찰떡궁합이죠.

출처: MULTIPLE-VALUE-BIND - Common Lisp HyperSpec

시그니처

multiple-value-bind (var*) values-form declaration* form*
=> result*

본문

인자와 값

  • var — 변수를 가리키는 심볼이에요. 평가되지 않아요.
  • values-form이고, 평가돼요.
  • declarationdeclare 표현식이에요. 평가되지 않아요.
  • forms암묵적 progn이에요.
  • resultsforms가 돌려주는 값들이에요.

설명

var들에 대한 새 변수 바인딩을 만들고, 이 바인딩을 사용하는 일련의 forms를 실행해요. 만들어진 변수 바인딩은 special 선언이 없다면 어휘적(lexical) 바인딩이에요.

values-form을 평가하고, 그 폼이 돌려준 각각의 값에 var들을 하나씩 묶어요. var가 반환된 값보다 많으면, 남는 var에는 nil이 채워져요. 값이 var보다 많으면 초과분은 버려져요. var들은 forms가 실행되는 동안 그 값에 묶여 있고, forms는 암묵적 progn을 이룹니다. 만약 어떤 var에 타입 declaration을 지정했는데 그 var에 묶인 값이 타입 선언과 맞지 않다면, 그 결과는 지정되지 않아요(unspecified).

이름 바인딩과 declarations의 **스코프(유효 범위)**에는 values-form이 포함되지 않아요.

예제

(multiple-value-bind (f r)
    (floor 130 11)
  (list f r)) =>  (11 9)

Notes

(multiple-value-bind (var*) values-form form*)
==  (multiple-value-call #'(lambda (&optional var* &rest #1=#:ignore)
                            (declare (ignore #1#))
                            form*)
                        values-form)

더 알아보기

  • let — 변수 바인딩
  • multiple-value-call — 여러 값 전달
  • values — 여러 값 돌려주기