Например, вы хотите назвать размеры шрифта:
(defconstant +large+ 3)
(defconstant +medium+ 2)
(defconstant +small+ 1)
Вы можете написать макрос, чтобы сделать это короче.
Определения выше констант обычно пишутся ТОЛЬКО тогда, когда эти числа должны быть переданы какому-либо внешнему не Лисп-коду.
В противном случае можно было бы просто использовать ключевые слова:: large,: medium и: small.
Вы можете проверить их с помощью EQ и всего, что использует какой-то тест на равенство.
(let ((size :medium))
(ecase size
(:small ...)
(:medium ...)
(:large ...)))
Вы также можете написать методы для этого:
(defmethod draw-string (message x y (size (eql :large))) ...)
Как уже упоминалось, вы можете определить тип набора:
(deftype size () '(member :small :medium :large))
Тогда вы можете проверить, является ли что-то из этого:
(let ((my-size :medium))
(check-type my-size size))
Выше будет сигнализировать об ошибке, если my-size не является одним из: small,: medium или: large.
Вы также можете использовать тип в форме defclass:
(defclass vehicle ()
((width :type size :initarg :width)))
Теперь вы будете создавать объекты, как здесь:
(make-instance 'vehicle :width :large)
Некоторые реализации Common Lisp проверят, когда вы установите для слота недопустимое значение.
Если вы сейчас создаете объекты класса транспортного средства, слоты будут одним из: больших, средних или маленьких. Если вы посмотрите на объект в отладчике, инспекторе или другом инструменте, вы увидите символические имена, а не 1, 2 или 3 (или любые другие значения, которые вы обычно используете).
Это часть стиля Lisp: используйте символические имена, когда это возможно. Используйте символы с числовыми значениями только в коде интерфейса для внешних функций (например, для вызова внешнего кода C, использующего перечисления).