multiple-value-bind — 여러 값을 한꺼번에 변수에 묶기
multiple-value-bind — 여러 값을 한꺼번에 변수에 묶기
어떤 폼이 여러 값을 돌려줄 때, 그 값들을 각각 다른 변수에 담아 몸통을 실행하고 싶을 때가 있어요. multiple-value-bind는 바로 그런 일을 하는 매크로예요. 값들을 한 번에 묶어주니 values와 찰떡궁합이죠.
시그니처
multiple-value-bind (var*) values-form declaration* form*
=> result*
본문
인자와 값
var— 변수를 가리키는 심볼이에요. 평가되지 않아요.values-form— 폼이고, 평가돼요.declaration—declare표현식이에요. 평가되지 않아요.forms— 암묵적 progn이에요.results—forms가 돌려주는 값들이에요.
설명
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— 여러 값 돌려주기