Слоты в CLOS - PullRequest
       13

Слоты в CLOS

6 голосов
/ 10 марта 2009

Может ли какой-нибудь CL'er объяснить «слоты» в CLOS? Мне трудно понять часть после названия слота. То есть в:

(defclass foo () (data1: initarg foo))

Что означают «initarg» и другие подобные вещи? Я перечитываю мануалы. Поэтому я был бы очень признателен, если бы кто-нибудь из вас смог объяснить это такому неспециалисту, как я.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 10 марта 2009

Ваш пример немного ошибочен. Должно быть:

(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 .

1 голос
/ 10 марта 2009

В спецификации слотов общим синтаксисом является ( имя слота [ опция-слота значение-опции ] ...). По существу, ссылка на authoritatiev страница HyperSpec для defclass , но вкратце:

: считыватель Функция для считывания значения слота
: writer Функция для записи значения слота
: accessor Функция для чтения и (через SETF) установки значения слота
: initarg Символ для установки значения слота из MAKE-INSTANCE

Есть и другие, но этот список - четыре, которые я в основном использую (на самом деле, я в основном использую: initarg и один из: accessor или: reader).

...