Введение

Common Lisp Object System (CLOS) — это механизм объектно-ориентированного программирования в ANSI Common Lisp. CLOS — мощная динамическая объектная система, которая радикально отличается от средств объектно-ориентированного программирования, встречающихся в более статических языках, таких как C++ или Java. CLOS был вдохновлён более ранними объектными системами Lisp, такими как MIT Flavors и CommonLoops, хотя он более универсален, чем любая из них. Изначально предлагавшийся как дополнение, CLOS был принят в качестве части стандарта ANSI для Common Lisp и был адаптирован для других диалектов Lisp, таких как EuLisp или Emacs Lisp.

Протокол метаобъекта

Помимо стандарта ANSI Common Lisp существует широко реализованное расширение CLOS, называемое протоколом метаобъектов (MOP). MOP определяет стандартный интерфейс к внутренним механизмам реализации CLOS, рассматривая классы, описания слотов, обобщенные функции и сами методы как экземпляры метаклассов, и позволяет определять новые метаклассы и изменять поведение CLOS. Гибкость MOP в CLOS предвосхитила аспектно-ориентированное программирование, которое позже было разработано одними и теми же инженерами, такими как Грегор Кицалес. MOP определяет поведение всей объектной системы посредством набора протоколов, которые определены в терминах CLOS. Таким образом, можно создавать новые объектные системы, расширяя или изменяя предоставляемую функциональность CLOS. В книге "Искусство протокола метаобъектов" описывается использование и реализация MOP в CLOS. Различные реализации Common Lisp поддерживают протокол метаобъектов в несколько различном объеме. Проект Closer направлен на обеспечение отсутствующих функций.

Влияние старых объектных систем на основе Lisp

Flavors (и его преемник New Flavors) была объектной системой на Lisp Machine MIT. Значительная часть операционных систем Lisp Machine и многие приложения для неё использовали Flavors или New Flavors. Flavors представила множественное наследование и миксины, среди прочих возможностей. Flavors в значительной степени устарела, хотя реализации для Common Lisp существуют. Flavors использовала парадигму передачи сообщений. New Flavors представила обобщённые функции. CommonLoops была преемницей LOOPS (из Xerox Interlisp D). CommonLoops была реализована для Common Lisp. Портативная реализация под названием Portable CommonLoops (PCL) стала первой реализацией CLOS. PCL широко портирована и до сих пор служит основой для реализации CLOS в нескольких реализациях Common Lisp. PCL реализована преимущественно на портативном Common Lisp, с небольшим количеством системно-зависимых частей.