user@xubuntu:~/src$ cat define-code-generator.scm (define-library define-code-generator (import (scheme base)) (export define-code-generator) (begin (define-syntax define-code-generator (er-macro-transformer (lambda (form r compare?) (let ((%code-generator (gensym)) (%form (gensym)) (%inject (gensym)) (%compare? (gensym)) (identifier (cadr form)) (expr (caddr form))) `(,(r 'begin) (,(r 'define) ,identifier (,(r 'let-syntax) ((,%code-generator (,(r 'ir-macro-transformer) (,(r 'lambda) (,%form ,%inject ,%compare?) (,(r cadr) ,%form))))) (,%code-generator ,expr)))))))))) user@xubuntu:~/src$ csc -extend r7rs -R r7rs -sJ define-code-generator.scm user@xubuntu:~/src$ cat my.gen.scm (define-library (my gen) (import (define-code-generator) (scheme base) (prefix (only (scheme write) display) scheme-)) (export gen-display) (begin (define-code-generator gen-display (lambda (str) `(scheme-display ,str))))) user@xubuntu:~/src$ csc -extend r7rs -R r7rs -sJ my.gen.scm user@xubuntu:~/src$ cat my.macros.scm (define-library (my macros) (import (scheme base) ;; (prefix (only (scheme write) display) scheme-) (scheme write) (my gen)) (export m) (begin (display "Hello (my macros) runtime!\n") (define-syntax m (ir-macro-transformer (lambda (form inject compare?) (display "Hello expander!\n") (gen-display (cadr form))))))) user@xubuntu:~/src$ csc -extend r7rs -R r7rs -sJ my.macros.scm user@xubuntu:~/src$ cat my.main.scm (define-library (my main) (import (scheme base) (my macros)) (begin (define scheme-display "Hello expansion!\n") (m scheme-display))) user@xubuntu:~/src$ csc -extend r7rs -R r7rs my.main.scm Hello expander! user@xubuntu:~/src$ ./my.main Hello (my macros) runtime! Error: call of non-procedure: "Hello expansion!\n" Call history: my.macros.scm:12: ##sys#provide my.macros.scm:12: ##sys#require my.macros.scm:12: ##sys#require my.macros.scm:12: ##sys#require machine-byte-order ##sys#require my.gen.scm:44: ##sys#provide my.gen.scm:44: ##sys#require machine-byte-order ##sys#require define-code-generator.scm:25: ##sys#provide define-code-generator.scm:25: ##sys#require my.gen.scm:44: ##sys#require my.gen.scm:44: ##sys#require my.macros.scm:19: display my.main.scm:6: scheme-display <--