Ваш пример немного неправильный. Это должно быть:
(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); создает объект и устанавливает данные слота1 в 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.
В описании: INITFORM, если слот data1 установлен в 10 или случайное значение от 0 тоже 1.0? –
Да, это была ошибка. Исправлено выше. Когда initarg не задан, инициализация используется для инициализации слота. Я на самом деле механизм немного сложнее, но часто этого достаточно, чтобы знать. –