Quirks of Common Lisp Types
Типы — это небеса
В CL тип — это множество, и каждый объект принадлежит хотя бы одному.
(type-of 37)
→ (INTEGER 0 …)
(type-of "漣")
→ (SIMPLE-ARRAY CHARACTER (1))
(typep 37 'integer)
→ T
, аналогично 'real
, 'number
, t
.
Типы не образуют строгую иерархию: строка всегда string
, но не обязательно simple-array
.
Типы для корректности
(defun f (n) (+ n "漣"))
— компилятор жалуется: "漣"
не NUMBER
.
(defstruct sky (molecules 0 :type integer))
(make-sky :molecules 1.1)
— ошибка типа.
То же для длины массива: (simple-array character (17))
отвергнет строку из 18 символов.
Типы для оптимизации
Подсказки помогают компилятору.
(defun add (n) (+ n 37))
без аннотаций → общий код.
Добавим (declare (type fixnum n))
— генерируется короткая машинная инструкция LEA
.
Классы — это земля
Классы реальны: (defclass point () ((x :initarg :x) (y :initarg :y)))
.
Наследование и множественный диспатч generic-функций работают как в CLOS.
Сердце машины
- «Абстрактные» классы — просто не создают экземпляров.
fixnum
— самый быстрый целый, в SBCL 61 бит (63 на 64-битных).
(type-of 4611686018427387904)
→(INTEGER 4611686018427387904)
— ужеbignum
.
Итог
CL даёт строгие типы без потери гибкости: проверки на этапе компиляции и выполнения, оптимизация, но возможность менять код в REPL.