|
@@ -85,6 +85,14 @@
|
|
|
(define (clone object)
|
|
|
(hash-copy object))
|
|
|
|
|
|
+(define (dispatch object msg)
|
|
|
+ (if (eq? object 'unknown)
|
|
|
+ (error "unknown message" msg)
|
|
|
+ (let ((slot (hash-ref object msg 'unknown)))
|
|
|
+ (if (eq? slot 'unknown)
|
|
|
+ (dispatch (hash-ref object '<<parent>> 'unknown) msg)
|
|
|
+ slot))))
|
|
|
+
|
|
|
(define-syntax !!
|
|
|
(syntax-rules ()
|
|
|
((_ object msg new-val)
|
|
@@ -93,12 +101,12 @@
|
|
|
(define-syntax ??
|
|
|
(syntax-rules ()
|
|
|
((_ object msg)
|
|
|
- (hash-ref object 'msg))))
|
|
|
+ (dispatch object 'msg))))
|
|
|
|
|
|
(define-syntax ->
|
|
|
(syntax-rules ()
|
|
|
((_ object msg arg ...)
|
|
|
- ((hash-ref object 'msg) object arg ...))))
|
|
|
+ ((dispatch object 'msg) object arg ...))))
|
|
|
|
|
|
(define Pino (new-object))
|
|
|
(!! Pino name "Pino")
|
|
@@ -129,11 +137,11 @@
|
|
|
(let ((o (new-object)))
|
|
|
(!! o <<parent>> parent)
|
|
|
o))
|
|
|
-(define (dispatch object msg)
|
|
|
- (if (eq? object 'unknown)
|
|
|
- (error "unknown message" msg)
|
|
|
- (let ((slot (hash-ref object msg 'unknown)))
|
|
|
- (if (eq? slot 'unknown)
|
|
|
- (dispatch (hash-ref object '<<parent>> 'unknown) msg)
|
|
|
- slot))))
|
|
|
+
|
|
|
+(define Glenn (son-of Pino))
|
|
|
+(!! Glenn name "Glenn")
|
|
|
+(!! Glenn age 50)
|
|
|
+
|
|
|
+(-> Glenn hello Pina)
|
|
|
+(?? Glenn age)
|
|
|
|