В языке Lisp существует несколько десятков диалектов, включая MacLisp, Standard Lisp, SpiceLisp, S-1 Lisp, ZetaLisp, Nil, InterLisp и Scheme. В начале 80-х годов под воздействием идей объектно-ориентированного программирования возникла серия новых диалектов Lisp, многие из которых были ориентированы на представление знаний. Успех Ги Стила (Guy Steele) в стандартизации Common Lisp способствовал попытке стандартизировать объектно-ориентированные диалекты в 1986 г. Идея стандартизации была поддержана летней конференцией 1986 г. по ACM Lisp и функциональному программированию, в результате чего была создана специальная рабочая группа при комитете X3J13 ANSI (Комитет по стандартизации Common Lisp).
Поскольку новый диалект должен был стать надстройкой к Common Lisp, он получил название Common Lisp Object System (сокращенно CLOS). В комитет вошли Боб Матис и Ги Стил (Bob Mathis, Guy Steele). Возглавил комитет Дэниел Бобров (Daniel Bobrow), а его членами стали Соня Кин, Линда де Мишель, Патрик Дассуд, Ричард Габриель, Джеймс Кемпф, Грегор Кацазлес и Девид Мун (Sonya Keene, Linda de Michiel, Patrick Dussud, Richard Gabriel, James Kempf, Gregor Kicazles, David Moon).
Серьезное влияние на проект CLOS оказали языки NewFlavors и CommonLoops. После двухлетней работы в 1988 г. была опубликована полная спецификация CLOS.
Кин (Keene) отмечает, что в проекте CLOS ставились три основные цели:
- "Представление стандартного расширения языка, включающего все наиболее
полезные приемы объектно-ориентированного проектирования. - Обеспечение эффективного и гибкого интерфейса программиста, позволяющего
реализовать самые различные задачи. - Проект CLOS должен быть открытым для дальнейшего совершенствования и учета
требований пользователя объектно-ориентированного программирования".
Не поддерживая прямо механизм устойчивости, CLOS имеет расширение с протоколом метаобъектов для реализации этого механизма.
Характеристики CLOS:
Абстракции | Переменные объектов Методы объектов Переменные классов Методы классов |
Да Да Да Да |
Ограничение доступа | Для переменных
Для методов |
Чтение, запись, доступ Общедоступные |
Модульность | Виды модульности | Пакет (монолитный) |
Иерархия | Наследование Обобщенные блоки Метаклассы |
Множественное Нет Да |
Типирование | Строгое типирование Полиморфизм |
Возможно Да (множественный) |
Параллельность | Многозадачность | Да |
Устойчивость | Устойчивость объектов | Косвенно |