Вопрос

Не мог бы кто-нибудь, пожалуйста, объяснить "слоты" в 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top