diff --git a/step_3a.rkt b/step_3a.rkt new file mode 100644 index 0000000000000000000000000000000000000000..80f02f2a1877c106c4273e1db1c7cd912f87b0b5 --- /dev/null +++ b/step_3a.rkt @@ -0,0 +1,43 @@ +(define (point x y) + (define (getx) x ) + (define (gety) y ) + (define (gettype) 'point ) + (define (getinfo)(list (self 'type) (self 'getx) (self 'gety))) + (define (setx value)(set! x value)) + (define (sety value)(set! y value)) + (define (add p) + (point (+ (getx) (p 'getx)) (+ (gety) (p 'gety)))) + (define (self m) + (cond ((eq? m 'getx) (getx)) + ((eq? m 'gety) (gety)) + ((eq? m 'type) (gettype)) + ((eq? m 'info) (getinfo)) + ((eq? m 'setx!) setx) + ((eq? m 'sety!) sety) + ((eq? m 'add) add) + (else (error "Message not understood")))) + self) + +(define (send p m . args) + (if (procedure? p) + (cond + ((null? args) (p m)) + (else ((p m) (car args))) + ) + (display "Inappropriate receiver object") ) + ) + + +( define p1 ( point 1 2 ) ) +( define p2 ( point 3 4 ) ) +(display ( send p1 'getx )) ; 1 +(display ( send p1 'gety )) ; 2 +(display ( send p2 'getx )) ; 3 +(display ( send p2 'gety )) ; 4 +;(display ( send p1 'add p2)) ;(4 6) +(define p (send p1 'add p2)) +(display ( send p 'info )) ; ( p o i n t 4 6) + +(send p1 'setx! 5) +(display (send p1 'getx )) ; r e t u r n s 5 +(display (send 'add 'getx)) \ No newline at end of file