Ответ 1
Использовать CLOS. Это не сложно.
В противном случае используйте структуры.
Если у вас есть конкретный вопрос, как их использовать, просто спросите.
(defclass point ()
((x :type number)
(y :type number)))
(defclass rectangle ()
((p1 :type point)
(p2 :type point)
(color :type color)))
В конечном итоге это приводит к таким интерфейсам, как Rectangles в CLIM (Common Lisp Interface Manager).
История
Чтобы немного расширить его: исторически "структуры" использовались в некоторых ситуациях низкого уровня. Структуры имеют одно наследование, а доступ к слотам - "быстрый". Некоторые диалекты Lisp имеют больше структур, чем предлагает Common Lisp. Затем с середины 70-х годов были разработаны различные формы объектно-ориентированных представлений для Lisp. Большая часть представления структурированных объектов перешла от структур к некоторому объектно-ориентированному расширению Lisp. Популярными в 80-е годы были классические системы, такие как Flavors, LOOPS и другие. Также популярны системы на основе рамок или прототипов, такие как KEE Units или Object Lisp. Первый Macintosh Common Lisp использовал Object Lisp для всех своих пользовательских интерфейсов и объектов ввода-вывода. Машина MIT Lisp использовала Flavors в основном везде. Начиная с середины 80-х годов был разработан ANSI CL. Обычная OO-система была разработана специально для Common Lisp: CLOS. Он был основан на Flavors и Loops. В течение этого времени в основном ничего не было сделано для того, чтобы действительно улучшить структуру - помимо разработчиков, которые нашли способы улучшить реализацию и обеспечить неглубокую интеграцию CLOS. Например, структуры не обеспечивают упаковку данных. Если имеется два слота с содержимым в 4 байта, нет возможности проинструктировать Common Lisp для кодирования обоих слотов в одну область с 8-разрядной памятью.
В качестве примера вы можете найти в Lisp Руководство по машинам, глава о структурах (PDF), что у него было гораздо более сложные структуры, чем Common Lisp обеспечивает. Некоторые из них уже присутствовали в Maclisp в 70-х годах: DEFSTRUCT в руководстве Maclisp.
CLOS, Общая Lisp Система объектов
Большинство людей согласятся с тем, что CLOS - хороший дизайн. Иногда это приводит к "большему" коду, главным образом потому, что идентификаторы могут затянуться. Но есть какой-то CLOS-код, такой как тот, что в книге AMOP, который действительно красиво написан и показывает, как он должен использоваться.
Со временем разработчики должны были справиться с проблемой, которую разработчики хотели использовать CLOS, но также хотели иметь "скорость" структур. Это еще больше задача с "полным" CLOS, который включает почти стандартный протокол метаобъектов (MOP) для CLOS. Таким образом, есть некоторые трюки, которые предоставляют разработчики. В течение 80-х годов какое-то программное обеспечение использовало коммутатор, поэтому он мог компилироваться с использованием структур или с использованием CLOS-CLX (примером этого был низкоуровневый Common Lisp X11-интерфейс). Причина: на некоторых компьютерах и реализациях CLOS был намного медленнее, чем структуры. Сегодня было бы необычным предоставить такой компилятор.
Если я посмотрю сегодня на хорошую реализацию Common Lisp, я бы ожидал, что он использует CLOS почти везде. STREAM - это классы CLOS. УСЛОВИЯ - это классы CLOS. Инструментарий GUI использует классы CLOS. Редактор использует CLOS. Он может даже интегрировать иностранные классы (например, классы Objective C) в CLOS.
В любой не-игрушечной версии Common Lisp CLOS будет инструментом для предоставления структурированных данных, общего поведения и множества других вещей.
Как упоминалось в некоторых других ответах, в некоторых местах CLOS может не понадобиться.
Общий Lisp может возвращать более одного значения из функции:
(defun calculate-coordinates (ship)
(move-forward ship)
(values (ship-x ship)
(ship-y ship)))
Можно хранить данные в закрытии:
(defun create-distance-function (ship x y)
(lambda ()
(point-distance (ship-x ship) (ship-y ship) x y)))
Для конфигурации можно использовать какие-то списки:
(defship ms-germany :initial-x 0 :initial-y 0)
Вы можете поспорить, что я бы применил модель корабля в CLOS.
Урок написания и поддержки программного обеспечения CLOS заключается в том, что его нужно тщательно спроектировать, а CLOS настолько мощна, что с ним можно создавать действительно сложное программное обеспечение - сложность, которая часто не очень хорошая идея. Рефакторинг и упростить! К счастью, для многих задач достаточно базовых средств CLOS: DEFCLASS, DEFMETHOD и MAKE-INSTANCE.
Указатели на введение CLOS
Для начала у Ричарда П. Габриэля есть его документы CLOS для загрузки.
Также смотрите:
- http://cl-cookbook.sourceforge.net/clos-tutorial/index.html
- http://www.aiai.ed.ac.uk/~jeff/clos-guide.html
- Глава книги из Практических Общих Lisp, Переориентация объектов, Классы
- Раздел книги из Практических Общих Lisp, Переориентация объектов, общие функции
- Руководство разработчика С++ Coders для Lisp -style OO
- Книга: Искусство протокола метаобъектов. По словам какого-то парня по имени Алан Кей, самая важная книга по компьютерной науке за десятилетие, к сожалению, написанная для Lispерса;-). В книге объясняется, как изменить или расширить сам CLOS. Он также включает простую реализацию CLOS в качестве источника. Для обычных пользователей эта книга действительно не нужна, но стиль программирования - это настоящие эксперты Lisp.