(define (if-proc-apply it var) (if (procedure? it) (if (eq? var '()) (it '()) (apply it var)) it)) (define-syntax class (syntax-rules (public private) ((class (?var0 ?val0) ...) (let* ((?var0 ?val0) ...) (lambda (p . args) (cond ((eq? p '?var0) (if-proc-apply ?var0 args)) ... (else (error "input not found")))))) ((class private (?var0 ?val0) ... public (?var1 ?val1) ...) (let* ((?var0 ?val0) ...) (let* ((?var1 ?val1 )...) (lambda (p . args) (cond ((eq? p '?var1) (if-proc-apply ?var1 args)) ... (else (error "input not found"))))))))) ;this works (define g (class private (a 10) (b 20) public (get-a (lambda (x) a)) (set-a! (lambda (x) (set! a x))))) ;this does not (define ob2 (class private (a 10) (b 20) public (c '()) (get-a (lambda (x) a)) (get-b (lambda (x) b)) (set-a! (lambda (x) (set! a x))) (set-b! (lambda (x) (set! b x))) (push-c! (lambda (x) (set! c (cons x c)))) (pop-c! (lambda (x) (if (not (eq? c '())) (set! c (cdr c)) (error "stack empty!"))))))