THE 특수 연산자

THE 특수 연산자 (the)

the폼이 돌려줄 값의 타입을 선언하는 특수 연산자예요. 코드를 실행할 때 타입 검사로 동작하기보다는, 컴파일러에게 "이 폼은 이 타입이야"라고 알려줘서 최적화나 검사의 근거로 쓰이게 하는 역할을 해요. 다중 값(multiple value)에 대해 각 값의 타입을 지정할 수도 있어요.

출처: CLHS: Special Operator THE

문법 (Syntax)

the value-type form => result*

인자와 값 (Arguments and Values)

  • value-type — 타입 지정자(type specifier)이며, 평가되지 않아요.
  • form — 폼이며, 평가돼요.
  • resultsform의 평가 결과로 나오는 값들이에요. 이 값들은 value-type이 제시한 타입을 따라야 해요. (아래 참고.)

설명 (Description)

theform이 돌려주는 값이 value-type이 지정한 타입이라고 선언해요. 어느 결과가든 선언된 타입이 아니면 결과는 정의되지 않아요(undefined).

formvalue-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 폼이 분석돼요.

더 알아보기 (Learn more)