9.3 Декларация типов для форм

Часто бывает полезно задекларировать, что значение, возвращаемое некоторой формой будет принадлежать определённому типу. Использование declare может применяться только к значениям связанным с переменной, но не для безымянных форм. Для этих целей определена специальная форма the. (the type form) означает, что значение формы form будет принадлежать типу type.

[Специальный оператор] the value-type form

Вычисляется форма form. То, что будет вычислено, будет возвращено из формы the. Дополнительно будет осуществлена проверка на принадлежность возвращённого значения типу value-type (его форма не выполняется) и в случае несовпадения выдана ошибка. (Реализация может и не осуществлять эту проверку. Однако такая проверка поощряется при работе в интерпретаторе.) В целом эта форма декларирует, что пользователь гарантирует, что значение формы всегда принадлежит заданному типу. Например:

(the string (copy-seq x))     ;Результат будет строкой
(the integer (+ x 3))         ;Результат + будет целым числом
(+ (the integer x) 3)         ;Значением x будет целое число
(the (complex rational) (* z 3))
(the (unsigned-byte 8) (logand x mask))

value-type может быть любым спецификатором типа. Весь смысл в том, что это декларация, а не точное описание типа.

В случае если form возвращает только одно значение и value-type не принадлежит спецификатору values, конструкцию the можно заменить следующей:

(let ((#1=#:temp form)) (declare (type value-type #1#)) #1#)

В случае возврата нескольких значений, конструкция может быть записана более точно, используя, например, multiple-value-bind.