THE 특수 연산자
THE 특수 연산자 (the)
the는 폼이 돌려줄 값의 타입을 선언하는 특수 연산자예요. 코드를 실행할 때 타입 검사로 동작하기보다는, 컴파일러에게 "이 폼은 이 타입이야"라고 알려줘서 최적화나 검사의 근거로 쓰이게 하는 역할을 해요. 다중 값(multiple value)에 대해 각 값의 타입을 지정할 수도 있어요.
문법 (Syntax)
the value-type form => result*
인자와 값 (Arguments and Values)
value-type— 타입 지정자(type specifier)이며, 평가되지 않아요.form— 폼이며, 평가돼요.results—form의 평가 결과로 나오는 값들이에요. 이 값들은value-type이 제시한 타입을 따라야 해요. (아래 참고.)
설명 (Description)
the는 form이 돌려주는 값이 value-type이 지정한 타입이라고 선언해요. 어느 결과가든 선언된 타입이 아니면 결과는 정의되지 않아요(undefined).
form이 value-type에 선언된 것과 다른 개수의 값을 만들어 내는 것도 허용돼요. 단, 타입이 선언된 값들이 실제로 그 타입이면 돼요. 타입을 검사할 때 없는 값은 nil로 취급돼요.
value-type에 선언된 값의 개수가 몇이든, the 특수 폼이 돌려주는 값의 개수는 form이 돌려주는 값의 개수와 같아요.
예제 (Examples)
(the symbol (car (list (gensym)))) => #:G9876
(the fixnum (+ 5 7)) => 12
(the (values) (truncate 3.2 2)) => 1, 1.2
(the integer (truncate 3.2 2)) => 1, 1.2
(the (values integer) (truncate 3.2 2)) => 1, 1.2
(the (values integer float) (truncate 3.2 2)) => 1, 1.2
(the (values integer float symbol) (truncate 3.2 2)) => 1, 1.2
(the (values integer float symbol t null list)
(truncate 3.2 2)) => 1, 1.2
(let ((i 100))
(declare (fixnum i))
(the fixnum (1+ i))) => 101
(let* ((x (list 'a 'b 'c))
(y 5))
(setf (the fixnum (car x)) y)
x) => (5 B C)
truncate 3.2 2는 두 값 1, 1.2를 돌려주는데, the로 (values ...)를 써서 각 값의 타입을 하나씩 지정할 수 있어요. 값의 개수보다 덜/더 선언해도 결과 값의 개수 자체는 변하지 않는 걸 볼 수 있어요. 마지막 setf 예제는 the 선언을 가진 자리에 새 값을 저장하는 모습을 보여줘요.
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
form이 만들어 낸 값이 value-type이 지정한 타입이 아니면 결과는 정의되지 않아요(undefined).
함께 보기 (See Also)
values
참고 (Notes)
values 타입 지정자로 다중 값의 타입을 나타낼 수 있어요.
(the (values integer integer) (floor x y))
(the (values string t)
(gethash the-key the-string-table))
the 타입 선언과 함께 setf를 쓸 수 있어요. 이 경우 선언은 새 값을 지정하는 폼으로 옮겨지고, 그 결과 setf 폼이 분석돼요.