From ea772aa8faa6be264cda61fb95606928ef8f18f2 Mon Sep 17 00:00:00 2001 From: duboissim Date: Fri, 26 Apr 2024 23:12:46 +0200 Subject: [PATCH] step5 attempt --- project-2/step5_attempt.rkt | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 project-2/step5_attempt.rkt diff --git a/project-2/step5_attempt.rkt b/project-2/step5_attempt.rkt new file mode 100644 index 0000000..954720d --- /dev/null +++ b/project-2/step5_attempt.rkt @@ -0,0 +1,59 @@ +(define-syntax define-class + (syntax-rules () + ((_ (class-name . args) body ...) + (let () + (define (class-name . args) + (let ((self ())) + (define (dispatch m) + (cond + ((eq? m 'self) self) + ((eq? m 'type) (lambda () 'class-name)) + ((eq? m 'init) + (lambda args + (set! self (apply class-name args)) + self)) + ((eq? m 'dispatch) dispatch) + (else (error "Unknown method" m))))) + body ... + dispatch))))) + +(define-class (object) + (define super 'nil) + (define (self m) + (cond + ((eq? m 'type) (lambda () 'object)) + (else (lambda args (display (string-append "Message not understood: " (symbol->string m) "\n"))))))) + +(define-class (point x y) + (define (getx) (lambda () x)) + (define (gety) (lambda () y)) + (define (type) (lambda () 'point)) + (define (setx!) (lambda (nx) (set! x nx))) + (define (sety!) (lambda (ny) (set! y ny))) + (define (info) (lambda () (list 'point x y))) + (define (add) (lambda (p) + (let ((px ((p 'getx))) + (py ((p 'gety)))) + (point (+ x px) (+ y py))))) + (define (sub) (lambda (p) + (let ((px ((p 'getx))) + (py ((p 'gety)))) + (point (- x px) (- y py)))))) + +(define-class (color-point x y color) + (define (type) (lambda () 'color-point)) + (define (get-color) (lambda () color)) + (define (info) (lambda () (append ((super 'info)) (list color)))) + (define (add) (lambda (p) + (let ((px ((p 'getx))) + (py ((p 'gety)))) + (color-point (+ x px) (+ y py) color)))) + (define (sub) (lambda (p) + (let ((px ((p 'getx))) + (py ((p 'gety)))) + (color-point (- x px) (- y py) color))))) + +(define (send receiver . message) + (if (procedure? receiver) + ((receiver 'dispatch) message) + (display (string-append "Inappropriate receiver object: " (symbol->string receiver) "\n"))))