8.17.0.6
Interoperability Macros for roos and racket/class
(require roos/class) | package: roos |
This module provides a compatibility layer between the roos object system and the standard racket/class system. It exports the macros send, ->, and new, which automatically dispatch to the appropriate implementation based on the type of the given object or class.
1 Macros
syntax
(send obj method arg ...)
A generic message-send macro that works for both Roos objects and standard Racket class objects.
If obj is a Roos object (roos-object?), it uses the Roos dispatch (->).
Otherwise, it falls back to the original send from racket/class.
Examples:
syntax
(-> obj method arg ...)
Similar to send, but uses a cleaner Racket-style method call syntax.
Dispatches to either Roos or Racket based on the object type.
Examples:
syntax
(new class arg ...)
Creates a new object. If class is a Roos class (roos-class?), then roos-new is used.
Otherwise, the standard new from racket/class is used, supporting initialization arguments such as (init-field val).
(require roos/class) ; instead of racket/class (define (t% x) (class object% (init-field (y* x)) (define/public (y) y*) (define/public (y! x) (set! y* x)) (define/public (f a) (* (send this y) a)) (super-new))) (def-roos (t x) this (supers) (y x) ((f a) (* (-> this y) a))) (displayln (let ((cl (t% 5))) (let ((o (new cl))) (= (send o f 2) 10)))) (displayln (let ((cl (t% 6))) (let ((o (new cl))) (= (-> o f 3) 18)))) (displayln (let ((o (new t 8))) (= (-> o f 4) 32))) (displayln (= (send (new t 4) f 2) 8))
2 Implementation Notes
3 Testing
The module includes an internal test suite using RackUnit. It validates consistent behavior of send, ->, and new across both Racket classes and Roos classes.