Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1786 / 192 | Оценка: 4.23 / 3.74 | Длительность: 15:37:00
Лекция 10:

Объектно-ориентированное программирование

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

Классы и экземпляры объектов

(defclass ob () (f1 f2 ...))

Это означает, что каждое вхождение объекта будет иметь поля-слоты f1 f2 ... (Слот - это поле записи или списка свойств.)

Чтобы сделать представителя класса, мы вызываем общую функцию:

(setf с (make-instance 'ob))

Чтобы задать значение поля, используем специальную функцию:

(setf (slot-value c) 1223)

До этого значения полей были не определены.

Свойства слотов

Простейшее определение слота - это его имя. Но в общем случае слот может содержать список свойств. Внешне свойства слота специфицируются как ключевые параметры функции. Это позволяет задавать начальные значения.

Можно объявить слот совместно используемым.

:allocation :class

Изменение такого слота будет доступно всем экземплярам объектов класса.

:documentation - свойство слота

Можно задать тип элементов, заполняющих слот.

Суперкласс

Нет необходимости все новые слоты создавать в каждом классе

;oop-compile

(defclass expr () 
((type :accessor td) (sd :accessor ft))
(:documentation "C-expression"))

(defclass un (expr)
;               \_____суперкласс для унарных форм

  ((type :accessor td) ;; можно убрать ???
   (sd :accessor ft))  ;; можно убрать ???
(:documentation "quote car *other *adr"))

(defclass bin (expr) 
     ((type :accessor td) 
      (sd :accessor ft)
      (sdd :accessor sd)  )
(:documentation "cons + lambda let"))

(defclass trio (expr) 
  ((type :accessor td) 
   (sd :accessor ft)
; (bin) ;; не объявлять sdd ???
   (sdd :accessor sd)
   (sddd :accessor td) )
(:documentation "if label"))

(defmethod texrp ((x expr) (nt atom))
     (setf (slot-value x 'type) nt)
     (setf (td x) nt) ;;--;; variant
(:documentation "объявляем тип выражения"))

(defmethod spread ((hd (eql 'QUOTE))
                   (tl expr))
   (let ( (x (make-instance 'un)) )
          (setf (ft x) (car tl))
          (setf (td x) hd)
) (:documentation "распаковка выражения"))

(defmethod compl ((hd (eql 'QUOTE))
                   (tl expr))
                 (list 'LDC tl)
) (:documentation "сборка кода"))

(defmethod compl ((hd (eql 'CAR))
                   (tl expr))
                 (append (compl(ft tl) N) '(CAR))
) (:documentation "сборка кода"))

(defmethod spread ((hd (eql 'CONS))
                   (tl expr))
   (let ( (x (make-instance 'bin)) )
          (setf (ft x) ( car tl))
          (setf (sd x) ( cadr tl))
          (setf (td x) hd)
) (:documentation "распаковка выражения"))

(defmethod compl ((hd (eql 'CONS))
                   (tl bin) N )
                 (append (compl(sd tl) N) (compl(ft tl) N) '(CONS))
) (:documentation "сборка кода"))

(defmethod compl ((hd (eql '+))
                   (tl bin) N )
                 (append (compl(ft tl) N) (compl(sd tl) N) '(ADD))
) (:documentation "сборка кода"))

(defmethod spread ((hd (eql 'IF))
                   (tl expr))
   (let ( (x (make-instance 'trio)) )
          (setf (ft x) ( car tl))
          (setf (sd x) ( cadr tl))
          (setf (td x) ( caddr tl))
          (setf (td x) hd)
) (:documentation "распаковка выражения"))

(defmethod compl ((hd (eql 'IF))
                   (tl expr) N   )
      (let ( (then (list (compl(sd tl) N) '(JOIN)))
             (else (list (compl(td tl) N) '(JOIN))) )
           (append (compl(ft tl) N) (list 'SEL then else) )
)(:documentation "сборка кода"))

(defmethod parh ((x expt))
  (let (ftx (ft x))
    (cond
      ((atom ftx) (spread 'ADR ftx))
      ((member (car ftx) '(QUOTE CAR CONS + IF LAMBDA LABEL LET))
       (spread (car ftx) (cdr ftx))
      (T (spread 'OTHER ftx) ))
)(:documentation "шаг разбора"))
Пример 10.2. Модель компилятора объектно-ориентированных программ

Тесты к этому определению имеются в курсе Основы функционального программирования [ [ 8 ] ]

Система CLOS (Common Lisp Object System) использует похожую модель обобщенных функций, но мы написали независимую модель, используя более старые представления, тем самым показав, что концептуально ООР - не более чем перефразировка идей функционального программирования с привкусом декларативного стиля. ООП - это одна из вещей, к которой Лисп изначально приспособлен. Для функционального стиля программирования в переходе к ООП нет ничего неожиданного. Это просто небольшая конкретизация механизмов представления и перебора ветвей функциональных объектов.

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?