(module c-t-r (definer user c-t) (import scheme (chicken base) (chicken syntax)) (import-for-syntax (srfi 69)) (define-for-syntax c-t-info (make-hash-table)) (define-syntax definer (syntax-rules () ((_ name) (definer name "r-t-object")) ((_ name val) (begin (define name val) (register-entity name))))) (define-syntax register-entity (er-macro-transformer (lambda (x r c) (let ((name (strip-syntax (cadr x))) (val (if (pair? (cddr x)) (hash-table-ref c-t-info (caddr x)) "c-t-object"))) (hash-table-set! c-t-info name val) `(,(r 'void)))))) (define-syntax c-t (er-macro-transformer (lambda (x r c) (let ((name (strip-syntax (cadr x)))) `(,(r 'quote) ,(hash-table-ref c-t-info name)))))) (define-syntax user (syntax-rules () ((_ new old) (begin (definer new old) (register-entity new old))))) ) ; csc -J c-t-r.scm -s ; csc -s c-t-r.import.scm ---- (module main () (import scheme (chicken base)) (import c-t-r) (import (chicken format)) (definer thingy) (printf "Got ~S at run-time\n" thingy) (printf "Got ~S at compile-time\n" (c-t thingy)) (user new-thingy thingy) (printf "Got ~S at run-time\n" new-thingy) (printf "Got ~S at compile-time\n" (c-t new-thingy)) )