| 1 | (import coops (chicken format) (chicken keyword)) |
|---|
| 2 | |
|---|
| 3 | (define-class <rect> () ((x: 0.0) (y: 0.0) (w: 10.0) (h: 10.0) (children: '()))) |
|---|
| 4 | |
|---|
| 5 | (define-method (print-object (o <rect>) port) |
|---|
| 6 | (fprintf port "~ax~a~a~a~a~a" (slot-value o w:) (slot-value o h:) |
|---|
| 7 | (if (>= (slot-value o x:) 0) "+" "") (slot-value o x:) (if (>= (slot-value o y:) 0) "+" "") (slot-value o y:) )) |
|---|
| 8 | |
|---|
| 9 | ;; lifted from dscm; overkill for this example |
|---|
| 10 | ; (define-generic (->impl o . slots)) |
|---|
| 11 | (define-method (->impl (obj <standard-object>) . slots) |
|---|
| 12 | (let loop ([s slots][o obj]) |
|---|
| 13 | ; (printf "loop ~s in ~s~%" s o) |
|---|
| 14 | (cond |
|---|
| 15 | [(not o) #f] |
|---|
| 16 | [(promise? o) (loop s (force o))] |
|---|
| 17 | [(procedure? o) |
|---|
| 18 | (loop s (o))] |
|---|
| 19 | [(null? s) |
|---|
| 20 | o] |
|---|
| 21 | [else |
|---|
| 22 | (loop |
|---|
| 23 | (cdr s) |
|---|
| 24 | (let ([ref (car s)]) |
|---|
| 25 | (cond |
|---|
| 26 | [(keyword? ref) |
|---|
| 27 | (if (slot-initialized? o ref) |
|---|
| 28 | (slot-value o ref) |
|---|
| 29 | #f)] |
|---|
| 30 | [(symbol? ref) ;; workaround |
|---|
| 31 | (let ([kw (string->keyword (symbol->string ref))]) |
|---|
| 32 | (if (slot-initialized? o kw) |
|---|
| 33 | (slot-value o kw) |
|---|
| 34 | #f))] |
|---|
| 35 | [(integer? ref) |
|---|
| 36 | ; (printf "looking for ~s in ~s~%" ref o) |
|---|
| 37 | (cond |
|---|
| 38 | [(vector? o) (vector-ref o ref)] |
|---|
| 39 | [(pair? o) (list-ref o ref)] )] |
|---|
| 40 | [else (printf "-> failed to reference ~a in ~a~%" ref o)])))]))) |
|---|
| 41 | |
|---|
| 42 | (define-syntax -> (syntax-rules () [(_ ?obj ?slot ...) (->impl ?obj '?slot ...) ])) |
|---|
| 43 | |
|---|
| 44 | ;; normal usage: colons look good in a constructor; so the class _must_ be defined with keyword slot names |
|---|
| 45 | (define r (make <rect> w: 100 h: 200 children: '("whatever" "is" "wanted" "here"))) |
|---|
| 46 | |
|---|
| 47 | ;; colons don't look good in accessors: you can leave them out when using the -> syntax; otherwise, slot-value works as before |
|---|
| 48 | (printf "here's my rectangle ~a; its width is ~a and height is ~a; third child is ~s~%" |
|---|
| 49 | r (-> r w) (slot-value r h:) (-> r children 3)) |
|---|