2009-03-10 4 views
6

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

(DEFCLASS Foo() (data1: initarg Foo))

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

Спасибо!

ответ

8

Ваш пример немного неправильный. Это должно быть:

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

+0

В описании: INITFORM, если слот data1 установлен в 10 или случайное значение от 0 тоже 1.0? –

+0

Да, это была ошибка. Исправлено выше. Когда initarg не задан, инициализация используется для инициализации слота. Я на самом деле механизм немного сложнее, но часто этого достаточно, чтобы знать. –

1

В спецификации слот, общий синтаксис (название Slot- [ слот-вариант опция-значение] ...). Справочник по существу-authoritatiev является the HyperSpec page on defclass, но короче:

: Читатель Функции для чтения значения слота
: писатель Функции, чтобы записать значение слота
: аксессор функция для чтения и (через SETF) установить значение слота
: initarg символ, чтобы установить значение для слота от MAKE-ИНСТАНЦИИ

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