Вопрос
Не мог бы кто-нибудь, пожалуйста, объяснить "слоты" в CLOS?Мне трудно понять ту часть, которая стоит после названия слота.То есть в :
(defclass foo () (data1:инициализация foo))
Что означают "initarg" и другие подобные вещи?Я перечитываю руководства.Поэтому я был бы очень признателен, если бы кто-нибудь из присутствующих смог объяснить это такому непрофессионалу, как я.
Спасибо!
Решение
Ваш пример немного неверен.Это должно быть:
(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 - это название слота.За этим вы находите пары:ключевое слово value.
:INITARG сообщает вам, что такое параметр для MAKE-INSTANCE .(make-instance 'foo :data1arg 10) ;создает объект и присваивает слоту data1 значение 10.Обычно вам следует использовать символ ключевого слова (например, :data1arg здесь).
:INITFORM устанавливает слот по умолчанию при создании объекта.Как в:(make-instance 'foo) ;создает объект.Для этого слота устанавливается значение, указанное в форме инициализации.
:TYPE указывает тип объекта слота.
:DOCUMENTATION - это просто строка для, ну, документации.
:СРЕДСТВО ДОСТУПА задает функцию для чтения и записи слота.
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
Обратите внимание, что вы можете записать пары в любом порядке и что вы также можете указать несколько функций доступа.Существуют также функции :READER и : WRITER.
С помощью CLOS вы можете указать все это в макросе DEFCLASS.Эти вещи не генерируются автоматически, как в defstruct, который имеет более короткую нотацию.
Описание DEFCLASS находится здесь: ДЕФКЛАСС. Короткое Закрытое Вступление.
Другие советы
В спецификации слота общий синтаксис таков (название слота [слот-опция опция-значение]...).По существу, авторитетная ссылка такова страница HyperSpec в defclass, но вкратце:
:читатель Функция для считывания значения слота
:писатель Функция для записи значения слота
:аксессуар Функция для чтения и (через SETF) установки значения слота
:initarg Символ для установки значения слота из MAKE-ЭКЗЕМПЛЯРА
Есть и другие, но этот список - это четыре, которые я в основном использую (на самом деле, я в основном использую:initarg и один из:accessor или: reader).