CLOS и пакеты
От: uncommand  
Дата: 29.04.08 16:55
Оценка:
Еще один глупый вопрос.

Допустим, в пакете A объявлен класс

(defclass my-class ()
  ((my-field :accessor my-field
            :initarg my-field)))


Пакет экспортирует символы my-class и my-field.
Вопрос: можно ли в пакете B инстанциировать класс с помощью make-instance, если в нем используется пакет A?

При попытке это сделать

(make-instance 'my-class :my-field <my-value>)


CLISP говорит, что

Illegal keyword/value pair :MY-FIELD, #<some object> in argument list.
The allowed keywords are #1=(A:MY-FIELD ...)


И даже непонятно префикс пакета как указывать для keyword символов.

Выход из этой ситуации можно найти, определив генерик-метод с теми же keyword параметрами как и при создании класса, но как-то некрасиво это...
Re: CLOS и пакеты
От: MasterZiv СССР  
Дата: 29.04.08 17:24
Оценка: 2 (1)
uncommand пишет:

> Допустим, в пакете A объявлен класс

>
> (defclass my-class ()
> ((my-field :accessor my-field
> :initarg my-field)))

:initarg :my-field
должно быть. Нет ?

> Пакет экспортирует символы my-class и my-field.

> Вопрос: можно ли в пакете B инстанциировать класс с помощью
> make-instance, если в нем используется пакет A?

Можно.

> При попытке это сделать

>
> (make-instance 'my-class :my-field <my-value>)

Всегда можно сделать так

(make-instance 'A::my-class :my-field <my-value>)

> CLISP говорит, что

>
> Illegal keyword/value pair :MY-FIELD, #<some object> in argument list.
> The allowed keywords are #1=(A:MY-FIELD ...)

Ну у вас :initarg неправильный, нету у вас инитарга :MY-FIELD.
У вас MY-FIELD — из вашего пакета.

> И даже непонятно префикс пакета как указывать для keyword символов.


Никак. Невозможно.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: CLOS и пакеты
От: uncommand  
Дата: 29.04.08 17:30
Оценка:
Здравствуйте, MasterZiv, Вы писали:

Понятно, вот так сработало

(make-instance 'my-class 'my-field <my-value>)
Re[3]: CLOS и пакеты
От: MasterZiv СССР  
Дата: 30.04.08 16:05
Оценка:
uncommand пишет:

> Здравствуйте, MasterZiv, Вы писали:

>
> Понятно, вот так сработало
>
> (make-instance 'my-class 'my-field <my-value>)

Это неправильно, тебе надо поменять :initarg на символ из пакета :KEYWORD.
Ну то есть так ТОЖЕ может работать, но так не делают.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.