Мультидиспетчеризация не по типам - Lisp
Формулировка задачи:
A := Object clone do( a := 0 accept := method(visitor, visitor doA(self)) ) B := Object clone do( b := 0 accept := method(visitor, visitor doB(self)) ) Visitor := Object clone do( doA := method(acceptor, acceptor a = acceptor a + 1) doB := method(acceptor, acceptor b = acceptor b + 1) ) a := A clone b := B clone visitor := Visitor clone list(a, b) foreach(acceptor, acceptor accept(visitor)) writeln(a a, b b) #>>>>11
Решение задачи: «Мультидиспетчеризация не по типам»
(defclass a-class () ((a :initform 0 :accessor a))) (defclass b-class () ((b :initform 0 :accessor b))) (defun do-a (obj) (incf (a obj))) (defun do-b (obj) (incf (slot-value obj 'b))) (defclass visitor () ()) (defgeneric accept (who whom)) (defmethod accept ((who a-class) (whom visitor)) (declare (ignore whom)) (do-a who)) (defmethod accept ((who b-class) (whom visitor)) (declare (ignore whom)) (do-b who)) (let ((a-guy (make-instance 'a-class)) (b-guy (make-instance 'b-class)) (visitor (make-instance 'visitor))) (dolist (acceptor (list a-guy b-guy)) (accept acceptor visitor)) (format t "~^~S ~S~%" (a a-guy) (b b-guy))) ; 1 1
Объяснение кода листинга программы
В коде определены два класса: a-class
и b-class
. У каждого из них есть свой атрибут: a
и b
соответственно.
Также определены два метода: do-a
и do-b
, которые увеличивают значение соответствующего атрибута на единицу.
Следующий класс — visitor
— представляет собой посетитель, который используется для навещания объектов и увеличения их атрибутов.
Определённый затем метод accept
является общим для двух классов и увеличивает значение атрибута a
или b
в зависимости от того, какой класс навещает посетитель.
Далее создаются два объекта: a-guy
и b-guy
, которые представляют собой экземпляры классов a-class
и b-class
соответственно.
Затем создаётся объект visitor
, который является экземпляром класса visitor
.
В цикле dolist
перебираются два элемента — a-guy
и b-guy
. Для каждого из них вызывается метод accept
, который увеличивает значение соответствующего атрибута на единицу.
В конце выводится сообщение с значениями атрибутов a
и b
созданных объектов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д