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.