(module class mzscheme (require (lib "class.ss")) (define-syntax init-private/h (syntax-rules () [(_ decl) (begin)] [(_ decl (name default-value) clause ...) (begin (decl ((internal-name name) default-value)) (define name internal-name) (init-private/h decl clause ...))] [(_ decl name clause ...) (begin (decl ((internal-name name))) (define name internal-name) (init-private/h decl clause ...))])) (define-syntax init-private (syntax-rules () [(_ args ...) (init-private/h init args ...)])) (define-syntax init-private-field (syntax-rules () [(_ args ...) (init-private/h init-field args ...)])) (define-match-expander % (lambda (stx) (syntax-case stx () [(% class-or-interface access ...) (with-syntax ([(app-exp ...) (map (lambda (acc) (syntax-case acc () [(x (method args ...)) #'(app (lambda (y) (send y method args ...)) x)] [(x id) (identifier? #'id) #'(app (lambda (y) (get-field id y)) x)] [id (identifier? #'id) #'(app (lambda (y) (get-field id y)) id)])) (syntax->list #'(access ...)))]) #'(and (? (lambda (v) (is-a? v class-or-interface))) app-exp ...))]))) (provide init-private init-private-field %))