diff --git a/scheme/last-revision b/scheme/last-revision index c7410a5..89fd686 100644 --- a/scheme/last-revision +++ b/scheme/last-revision @@ -1 +1 @@ -1675 +1676 diff --git a/scheme/makefile.ss b/scheme/makefile.ss index 66c87ef..0e916a6 100755 --- a/scheme/makefile.ss +++ b/scheme/makefile.ss @@ -1310,6 +1310,7 @@ [make-variable-transformer i r sc] [variable-transformer? i] [variable-transformer-procedure i] + [make-compile-time-value i] [char-alphabetic? i r uc se] [char-ci<=? i r uc se] [char-cisyntax syntax-error syntax-violation syntax->datum - make-variable-transformer + make-variable-transformer make-compile-time-value variable-transformer? variable-transformer-procedure compile-r6rs-top-level boot-library-expand @@ -688,7 +688,7 @@ ((lexical core-prim macro macro! global local-macro local-macro! global-macro global-macro! displaced-lexical syntax import export $module - $core-rtd library mutable) + $core-rtd library mutable ctv local-ctv global-ctv) (values type (binding-value b) id)) (else (values 'other #f #f)))))) ((syntax-pair? e) @@ -703,7 +703,8 @@ ((define define-syntax core-macro begin macro macro! local-macro local-macro! global-macro global-macro! module library set! let-syntax - letrec-syntax import export $core-rtd) + letrec-syntax import export $core-rtd + ctv local-ctv global-ctv) (values type (binding-value b) id)) (else (values 'call #f #f)))) @@ -727,6 +728,7 @@ ;;; the output to one of: ;;; (lacal-macro . procedure) ;;; (local-macro! . procedure) + ;;; (local-ctv . compile-time-value) ;;; ($rtd . $rtd) ;;; and signals an assertion-violation otherwise. (define sanitize-binding @@ -737,6 +739,8 @@ ((and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x))) (cons* 'local-macro! (cdr x) src)) ((and (pair? x) (eq? (car x) '$rtd)) x) + ((and (pair? x) (eq? (car x) 'ctv)) + (cons* 'local-ctv (cdr x) src)) (else (assertion-violation 'expand "invalid transformer" x))))) ;;; r6rs's make-variable-transformer: @@ -747,6 +751,10 @@ (assertion-violation 'make-variable-transformer "not a procedure" x)))) + (define make-compile-time-value + (lambda (x) + (cons 'ctv x))) + (define (variable-transformer? x) (and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x)))) @@ -2648,9 +2656,9 @@ (define (local-macro-transformer x) (car x)) - (define (do-macro-call transformer expr) - (let ((out (transformer (add-mark anti-mark expr #f)))) - (let f ((x out)) + (define (do-macro-call transformer expr r) + (define (return x) + (let f ((x x)) ;;; don't feed me cycles. (unless (stx? x) (cond @@ -2660,16 +2668,33 @@ (syntax-violation #f "raw symbol encountered in output of macro" expr x))))) - (add-mark (gen-mark) out expr))) + (add-mark (gen-mark) x expr)) + (let ((x (transformer (add-mark anti-mark expr #f)))) + (if (procedure? x) + (return + (x (lambda (id) + (unless (id? id) + (assertion-violation 'rho "not an identifier" id)) + (let ([label (id->label id)]) + (let ([binding (label->binding label r)]) + (case (car binding) + [(local-ctv) (cadr binding)] + [(global-ctv) + (let ([lib (cadr binding)] + [loc (cddr binding)]) + (visit-library lib) + (symbol-value loc))] + [else #f])))))) + (return x)))) ;;; chi procedures (define chi-macro - (lambda (p e) (do-macro-call (macro-transformer p) e))) + (lambda (p e r) (do-macro-call (macro-transformer p) e r))) (define chi-local-macro - (lambda (p e) (do-macro-call (local-macro-transformer p) e))) + (lambda (p e r) (do-macro-call (local-macro-transformer p) e r))) - (define (chi-global-macro p e) + (define (chi-global-macro p e r) ;;; FIXME: does not handle macro!? (let ((lib (car p)) (loc (cdr p))) @@ -2680,7 +2705,7 @@ ((procedure? x) x) (else (assertion-violation 'chi-global-macro "BUG: not a procedure" x))))) - (do-macro-call transformer e))))) + (do-macro-call transformer e r))))) (define chi-expr* (lambda (e* r mr) @@ -2720,9 +2745,9 @@ (let ((lex (lexical-var value))) (build-lexical-reference no-source lex))) ((global-macro global-macro!) - (chi-expr (chi-global-macro value e) r mr)) - ((local-macro local-macro!) (chi-expr (chi-local-macro value e) r mr)) - ((macro macro!) (chi-expr (chi-macro value e) r mr)) + (chi-expr (chi-global-macro value e r) r mr)) + ((local-macro local-macro!) (chi-expr (chi-local-macro value e r) r mr)) + ((macro macro!) (chi-expr (chi-macro value e r) r mr)) ((constant) (let ((datum value)) (build-data no-source datum))) @@ -2790,9 +2815,9 @@ ((global) (stx-error e "attempt to modify imported binding")) ((global-macro!) - (chi-expr (chi-global-macro value e) r mr)) + (chi-expr (chi-global-macro value e r) r mr)) ((local-macro!) - (chi-expr (chi-local-macro value e) r mr)) + (chi-expr (chi-local-macro value e r) r mr)) ((mutable) (stx-error e "attempt to assign to an unexportable variable")) @@ -3062,19 +3087,19 @@ mix? sd?)))) ((global-macro global-macro!) (chi-body* - (cons (add-subst rib (chi-global-macro value e)) + (cons (add-subst rib (chi-global-macro value e r)) (cdr e*)) r mr lex* rhs* mod** kwd* exp* rib mix? sd?)) ((local-macro local-macro!) (chi-body* - (cons (add-subst rib (chi-local-macro value e)) + (cons (add-subst rib (chi-local-macro value e r)) (cdr e*)) r mr lex* rhs* mod** kwd* exp* rib mix? sd?)) ((macro macro!) (chi-body* - (cons (add-subst rib (chi-macro value e)) + (cons (add-subst rib (chi-macro value e r)) (cdr e*)) r mr lex* rhs* mod** kwd* exp* rib mix? sd?)) @@ -3798,6 +3823,12 @@ (cons (cons* label 'global-macro! loc) env) global* (cons (cons loc (binding-value b)) macro*)))) + ((local-ctv) + (let ((loc (gensym))) + (f (cdr r) + (cons (cons* label 'global-ctv loc) env) + global* + (cons (cons loc (binding-value b)) macro*)))) (($rtd $module) (f (cdr r) (cons x env) global* macro*)) (else (assertion-violation 'expander "BUG: do not know how to export" diff --git a/scheme/psyntax.library-manager.ss b/scheme/psyntax.library-manager.ss index ac0515c..c5ecda7 100644 --- a/scheme/psyntax.library-manager.ss +++ b/scheme/psyntax.library-manager.ss @@ -285,7 +285,8 @@ (lambda (x) (let ((label (car x)) (binding (cdr x))) (remove-location label) - (when (memq (car binding) '(global global-macro global-macro!)) + (when (memq (car binding) + '(global global-macro global-macro! global-ctv)) (remove-location (cdr binding))))) (library-env lib)))] [(name) (uninstall-library name #t)])) @@ -316,6 +317,8 @@ (cons 'global-macro (cons lib (cdr binding)))) ((global-macro!) (cons 'global-macro! (cons lib (cdr binding)))) + ((global-ctv) + (cons 'global-ctv (cons lib (cdr binding)))) (else binding)))) (set-label-binding! label binding)))) exp-env))