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