LINUX.ORG.RU

Lisp make-instanse и initialize-instance


0

0

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

(defclass c1 () ((subclass)))

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

Re: Lisp make-instanse и initialize-instance

(defclass parent ()
  ((slot :initarg slot)))

(defclass child (parent)
  ())

(make-instance 'child 'slot 1)

mv ★★★★★ ()
Ответ на: Re: Lisp make-instanse и initialize-instance от mv

Re: Lisp make-instanse и initialize-instance

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


(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 ()
Ответ на: Re: Lisp make-instanse и initialize-instance от ryukzak

Re: Lisp make-instanse и initialize-instance

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 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.