> 1 <

Автор Сообщение

ivanoval

Members


Статус

4 сообщений

Где: Russia сергиев посад
Род занятий:
Возраст:

#7781   2017-07-12 19:30 GMT+3 часа(ов)      
Может быть, кому-нибудь пригодится этот простенький шаблон. Подобной реализации в готовом виде не нашел. Вопрос как ее сделать встречал три, или четыре раза (без ответа).

;;
;; объявление метода для класса и наследование. Массив объектов класса
;; [1] https://www.cs.northwestern.edu/academics/courses/325/readings/clos.php
;; [2] http://cl-cookbook.sourceforge.net/clos-tutorial/
;; [3] http://1ambda.github.io/clos-common-lisp-object-system/
;; [4] http://www.aiai.ed.ac.uk/~jeff/clos-guide.html
;; [5] http://lisper.ru/files/dmitry_vk/Common-Lisp.CLOS.MOP.pdf
;; [6] https://habrahabr.ru/post/230619/
;; [7] http://www.gigamonkeys.com/book/object-reorientation-generic-functions.html
;; (L) J.Z.Katsman (2017) list.development@gmail.com | jzkatsman @ jabber.ru
 
;; announcement and initialization of structure
(defclass 3dpoint ()
((x :initarg :x :initform '10 :accessor x)
(y :initarg :y :initform '20 :accessor y)
(z :initarg :z :initform '30 :accessor z))
)
;; наследование нужно для того что бы варьировать формы структур.
;; т.е. в какой-то степени для 'нормализации';
;; для того, что бы на каждую форму не было 'своей' структуры.
;; Мы подходим к сути ООП: когда количество предполагаемых
;; классов, чем-то напоминающих заголовок листа excel,
;; становится бесконечно счетным ...
;; возникает 'наследование'.
(defclass 4dpoint (3dpoint)
((k :initarg :k :initform '40 :accessor k)))
 
 
;; A generic function defines an abstract operation, specifying its
;; name and a parameter list but no implementation.
(defgeneric print4dpoint (4dpoint)
(:documentation "do something based on their job"))
 
;; function calculates a random number from an interval
(defun random-from-range (start end)
(+ start (random (+ 1 (- end start)))))
 
;; create array from item that has type '4dpoint type
(defvar *d4* (make-array '(10000) :element-type '4dpoint))
 
;; create array and set values in the class slots
(defun setf-my-points-loop (*d4*)
(declare (special *d4*))
(loop for i from 1 to 10000 do
(setf (aref *d4* i)
(make-instance '4dpoint
:x (random-from-range 1 100)
:y (random-from-range 200 300)
:z (random-from-range 300 400)
:k (random-from-range 300 400)
)
)
)
)
 
;; define method
(defmethod print4dpoint ((t1 4dpoint))
(format t "K(ran): ~D, X(ran): ~D" (k t1) (x t1))
)
 
;; call function that set random value in slots of structure
(setf-my-points-loop *d4*)
 
;; call some methods
(print4dpoint (aref *d4* 5))
(print4dpoint (aref *d4* 66))
(print4dpoint (aref *d4* (random-from-range 1 10000)))
 
;; Yours sincerely, J.Z.Katsman / Enjoy folks!

отредактировал(а) ivanoval: 2017-07-14 14:33 GMT+3 часа(ов)
> 1 <


Онлайн :

0 пользователь(ей), 10 гость(ей) :




Реклама на сайте: