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