LINUX.ORG.RU

virtual void foo...


0

1

Покажите, как в CL вызывают «виртуальный» метод для элементов в списке.

(defparameter *source*
  '((make-instance 'base) (make-instance 'derived)))

(defmethod foo (obj base) '("base"))
(defmethod foo (obj derived) '("derived"))

(defparameter *dest*
  (mapcar ...))

сижу туплю, не знаю, как от одного параметра на каждой итерации mapcar перейти к двум требуемым в foo.

Я правильно думаю, что это должно быть распространённой задачей именно в таком виде при использовании ооп в CL?

★★

Ты ошибся в синтаксисе:

(defmethod foo ((obj base)) '("base"))
(defmethod foo ((obj derived)) '("derived"))

Параметр только один.

archimag ★★★
()
(defparameter *source*
  '((make-instance 'base) (make-instance 'derived)))

Это список из двух списков. QUOTE предотвращает вычисление.

Если тебе надо два инстанса, надо писать так:

(defparameter *source*
  (list (make-instance 'base) (make-instance 'derived)))

Если я правильно понимаю пример, вот полный рабочий код:

(defclass base () ())

(defclass derived (base) ())

(defparameter *source*
  (list (make-instance 'base) (make-instance 'derived)))
;;можно даже так:
;;(defparameter *source* (mapcar #'make-instance '(base derived)))

(defmethod foo ((obj base))
  "base")

(defmethod foo ((obj derived))
  "derived")

(defparameter *dest* (mapcar #'foo *source*))

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

Да, спасибо, я решил «сократить» list когда переписывал из SLIME сюда, вписал:

(defparameter *source*
  '((make-instance 'base) (make-instance 'derived)))

вместо

(defparameter *source*
  `(,(make-instance 'base) ,(make-instance 'derived)))

нет опыта, скосячил. И только сейчас дошло, что классы даже не обязательно связывать наследованием, чтобы сделать динамическую диспетчеризацию. С вопросом разобрался, в общем.

Вот ещё что заинтересовало. Если есть список, как используя mapcar вызвать ф-ю требующую несколько параметров?

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

Вот ещё что заинтересовало. Если есть список, как используя mapcar вызвать ф-ю требующую несколько параметров?

Обернуть ее в lambda с одним параметром. Кстати, количество параметров у функции, поставлямой mapcar, зависит от количества обрабатываемых списков.

(mapcar (lambda (x y) (+ x y))
        '(1 2 3 4 5)
        '(6 7 8 9 0))
;;==> (7 9 11 13 5)
Love5an
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.