Task

Create two classes   Point(x,y)   and   Circle(x,y,r)   with a polymorphic function print, accessors for (x,y,r), copy constructor, assignment and destructor and every possible default constructors




 
(struct Point ((real:x 0) (real:y 0)))
(struct Circle ((real:x 0) (real:y 0) (real:r 1)))
 
(define-method (print Point:p) (printf "📌 [%d %d]" p.x p.y))
(define-method (print Circle:c) (printf "⭕️ center:[%d %d] radius:%d" c.x c.y c.r))
 
(print (Point 5 6))
    → 📌 [5 6]
(print (Circle 2 3 4))
    → ⭕️ center:[2 3] radius:4
 
;; Accessors :
;; (Point-x p), (Point-y p) or p.x, p.y
;; (Circle-x c), c.x , etc.
;; Setters :
;; (set-Point-x! p value), (set-Circle-r!  c value)  etc.
 
;; Constructors
;; (Point) (Point x) (Point x y)
;; (Circle) (circle x) (Circle x y) (Circle x y r)
 
;;Copy
(print (copy (Circle 3 3 )))
    →  ⭕️ center:[3 3] radius:1
 
;;Assignment (to a variable)
(define my-point (Point 7 8))
 
;;Destructor : none. Points and Circles are garbage collected.
 
;;Type checking
(Point "here" "there")
    💣 error: Real : type-check failure : here → 'Point:x'
 
;;Initializer procedure
(struct Circle ((x 0) (y 0) (r 1) d) #:initialize circle-init)
(define (circle-init Circle:c) (set-Circle-d! c (* 2 PI c.r)))
(define-method (print Circle:c) 
    (printf "⭕️ center:[%d %d] radius:%d diameter:%d" c.x c.y c.r c.d))
 
(print (Circle 0 0 10))
    → ⭕️ center:[0 0] radius:10 diameter:62.83185307179586
 