LINUX.ORG.RU

Lisp make-instanse и initialize-instance


0

0

Необходимо создать объект класс примерно такой.

(defclass c1 () ((subclass)))

subclass - объект другого класса, которому для инициализации надо указать поле, допустим key. Есть ли возможность указать в make-instance значение, которое не будет записано в слот или какой-нибудь другой путь передать данные без дублирования их с1.

Ответ на: комментарий от mv

Не совсем оно. Эти классы не состоят в родственных отношениях.


(defclass class ()
  ((slot_number :initarg slot_number)
   (slot :initarg slot)))

(defclass subclass ()
  (subslot))

(make-instance 'class
	       :slot (make-instance 'subclass :subslot 1)
               :slot_number 2)

А хотелось бы записать создание примерно так:

(make-instance 'class
	        :subslot 1
               :slot_number 2)

Получить структуру аналогичную, описанной выше. 

ryukzak
() автор топика
Ответ на: комментарий от ryukzak

Make-instance вызывает initialize-instance со всеми
переданными аргументами.
Поэтому можно к initialize-instance добавить свой кейворд:
(defmethod initialize-instance :after ((object class) &key subslot &allow-other-keys)
  (setf (slot-value object 'slot)
        (make-instance 'subclass :subslot subslot)))

(make-instance 'class :subslot 1 :slot-number 2)

dmitry_vk ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.