Ваш пример немного ошибочен. Должно быть:
(defclass foo ()
((data1 :initarg foo)))
Обратите внимание на добавленные скобки, чтобы указать список описаний слотов.
DEFCLASS занимает список слотов. Итак, с двумя слотами у нас есть:
(defclass foo ()
((data1 :initarg :data1arg
:initform (random 1.0)
:type number
:documentation "doc here"
:accessor foo-data1-acc)
(data2 :initarg :data2arg)))
DATA1 - название слота. За этим вы найдете пары: значение ключевого слова.
: INITARG сообщает вам, что является параметром для MAKE-INSTANCE.
(make-instance 'foo: data1arg 10); создает объект и устанавливает для слота data1 значение 10.
Обычно вы должны использовать символ ключевого слова (например: data1arg здесь).
: INITFORM устанавливает слот по умолчанию при создании объекта. Как в:
(make-instance 'foo); создает объект. В слоте установлено значение initform.
: TYPE указывает тип объекта слота.
: ДОКУМЕНТАЦИЯ - это просто строка для документации.
: ACCESSOR определяет функцию для чтения и записи слота.
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
Обратите внимание, что вы можете записывать пары в любом порядке, а также указывать несколько функций доступа. Также есть функции: READER и: WRITER.
С CLOS вы можете указать все это в макросе DEFCLASS. Эти вещи не генерируются автоматически, как в defstruct, который имеет более короткую запись.
Описание DEFCLASS здесь: DEFCLASS .
Short CLOS Intro .