I have a macro defined thus: (define-syntax define-only (lambda (exp) (syntax-case exp () ((_ (n ...) e ...) (with-syntax (((tmp ...) (generate-temporaries (syntax (n ...))))) (syntax (begin (define n #f) ... (let ((tmp #f) ...) ((lambda () e ... (set! tmp n) ...)) (set! n tmp) ...)))))))) Which, if it works, would enable me to do the following: (define-only (mkcounter inc! val) (define-structure counter v) ;; Invisible from the top-level. (define mkcounter (lambda () (make-counter 0))) (define inc! (lambda (c) (counter-v-set! c (+ 1 (counter-v c))))) (define val counter-v)) But which, unfortunately, gives me the following: *** ERROR -- invalid context for definition (define mkcounter (lambda () (make-counter 0))) I suspected that perhaps (define...)'s were not allowed after (define-structure...)'s. So I did this: (pp (lambda () (define-structure test a) 'done)) Which prints the following: (lambda () (letrec ((##type-1-test (##structure ##type-type (##make-uninterned-symbol "##type-1-test") 'test 8 #f '#(a 0 #f))) (make-test (lambda (p1) (##structure ##type-1-test p1))) (test? (lambda (obj) (##structure-direct-instance-of? obj (##type-id ##type-1-test)))) (test-a (lambda (obj) (##direct-structure-ref obj 1 ##type-1-test test-a))) (test-a-set! (lambda (obj val) (##direct-structure-set! obj val 1 ##type-1-test test-a-set!)))) 'done)) Which makes me wonder why my macro doesn't work. After all (define...)'s are allowed at the beginning of a letrec's body, no? TJ