(module proxying-example mzscheme (require (lib "class.ss")) (define-syntax (init-field&dispatch stx) (syntax-case stx () [else (raise-syntax-error #f "don't use me outside of proxy" stx)])) (define-syntax (proxy stx) (define (do-expansion sub-stx) (syntax-case sub-stx () [(_ (f val) names ...) (let ([accessors (map (lambda (acc) `(define/public (,acc . args) (send/apply ,(syntax-e (syntax f)) ,acc args))) (syntax-e (syntax (names ...))))]) (datum->syntax-object stx `((init-field ,(syntax (f val))) ,@accessors)))] [else (raise-syntax-error #f "do-expansion" stx sub-stx)])) (syntax-case stx () [(_ parent% (field&dispatch f names ...) body ...) (with-syntax ([(expanded-field&accessors ...) (do-expansion (syntax-e (syntax (field&dispatch f names ...))))]) (syntax/loc stx (class parent% expanded-field&accessors ... body ...)))])) (define person% (class object% (init name) (define -name name) (define/public (say-hello) (printf "hello world, my name is ~a~n" -name)) (define/public (get-name) -name) (super-new))) (define employee% (proxy object% (init-field&dispatch (person #f) say-hello get-name) (define/public (say-goodbye) (printf "goodbye from ~a~n" (get-name))) (super-new))))