- added the ability to inject arbitrary compile time values using:
(define-syntax foo (make-compile-time-value <expr>))
  The value can be retrieved using curried macro transformers.
  E.g.,
     (let-syntax ([idval
                   (lambda (x)
                     (syntax-case x ()
                       [(_ id)
                        (lambda (rho)
                          (with-syntax ([val (datum->syntax #'here (rho #'id))])
                            #''val))]))])
       (let-syntax ([ctval (make-compile-time-value 'foo)])
         (list (idval ctval) (idval others))))
     ;=> (foo #f)
			
			
This commit is contained in:
		
							parent
							
								
									4fc46365e5
								
							
						
					
					
						commit
						fc80aaae37
					
				| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
1675
 | 
					1676
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1310,6 +1310,7 @@
 | 
				
			||||||
    [make-variable-transformer                   i r sc]
 | 
					    [make-variable-transformer                   i r sc]
 | 
				
			||||||
    [variable-transformer?                       i]
 | 
					    [variable-transformer?                       i]
 | 
				
			||||||
    [variable-transformer-procedure              i]
 | 
					    [variable-transformer-procedure              i]
 | 
				
			||||||
 | 
					    [make-compile-time-value                     i]
 | 
				
			||||||
    [char-alphabetic?                            i r uc se]
 | 
					    [char-alphabetic?                            i r uc se]
 | 
				
			||||||
    [char-ci<=?                                  i r uc se]
 | 
					    [char-ci<=?                                  i r uc se]
 | 
				
			||||||
    [char-ci<?                                   i r uc se]
 | 
					    [char-ci<?                                   i r uc se]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
          bound-identifier=? datum->syntax syntax-error
 | 
					          bound-identifier=? datum->syntax syntax-error
 | 
				
			||||||
          syntax-violation
 | 
					          syntax-violation
 | 
				
			||||||
          syntax->datum 
 | 
					          syntax->datum 
 | 
				
			||||||
          make-variable-transformer
 | 
					          make-variable-transformer make-compile-time-value
 | 
				
			||||||
          variable-transformer?
 | 
					          variable-transformer?
 | 
				
			||||||
          variable-transformer-procedure
 | 
					          variable-transformer-procedure
 | 
				
			||||||
          compile-r6rs-top-level boot-library-expand 
 | 
					          compile-r6rs-top-level boot-library-expand 
 | 
				
			||||||
| 
						 | 
					@ -688,7 +688,7 @@
 | 
				
			||||||
               ((lexical core-prim macro macro! global local-macro
 | 
					               ((lexical core-prim macro macro! global local-macro
 | 
				
			||||||
                 local-macro! global-macro global-macro!
 | 
					                 local-macro! global-macro global-macro!
 | 
				
			||||||
                 displaced-lexical syntax import export $module
 | 
					                 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))
 | 
					                (values type (binding-value b) id))
 | 
				
			||||||
               (else (values 'other #f #f))))))
 | 
					               (else (values 'other #f #f))))))
 | 
				
			||||||
        ((syntax-pair? e)
 | 
					        ((syntax-pair? e)
 | 
				
			||||||
| 
						 | 
					@ -703,7 +703,8 @@
 | 
				
			||||||
                   ((define define-syntax core-macro begin macro
 | 
					                   ((define define-syntax core-macro begin macro
 | 
				
			||||||
                      macro! local-macro local-macro! global-macro
 | 
					                      macro! local-macro local-macro! global-macro
 | 
				
			||||||
                      global-macro! module library set! let-syntax 
 | 
					                      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))
 | 
					                    (values type (binding-value b) id))
 | 
				
			||||||
                   (else
 | 
					                   (else
 | 
				
			||||||
                    (values 'call #f #f))))
 | 
					                    (values 'call #f #f))))
 | 
				
			||||||
| 
						 | 
					@ -727,6 +728,7 @@
 | 
				
			||||||
  ;;; the output to one of:
 | 
					  ;;; the output to one of:
 | 
				
			||||||
  ;;;   (lacal-macro . procedure)
 | 
					  ;;;   (lacal-macro . procedure)
 | 
				
			||||||
  ;;;   (local-macro! . procedure)
 | 
					  ;;;   (local-macro! . procedure)
 | 
				
			||||||
 | 
					  ;;;   (local-ctv . compile-time-value)
 | 
				
			||||||
  ;;;   ($rtd . $rtd)
 | 
					  ;;;   ($rtd . $rtd)
 | 
				
			||||||
  ;;; and signals an assertion-violation otherwise.
 | 
					  ;;; and signals an assertion-violation otherwise.
 | 
				
			||||||
  (define sanitize-binding
 | 
					  (define sanitize-binding
 | 
				
			||||||
| 
						 | 
					@ -737,6 +739,8 @@
 | 
				
			||||||
        ((and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x)))
 | 
					        ((and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x)))
 | 
				
			||||||
         (cons* 'local-macro! (cdr x) src))
 | 
					         (cons* 'local-macro! (cdr x) src))
 | 
				
			||||||
        ((and (pair? x) (eq? (car x) '$rtd)) x)
 | 
					        ((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)))))
 | 
					        (else (assertion-violation 'expand "invalid transformer" x)))))
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  ;;; r6rs's make-variable-transformer:
 | 
					  ;;; r6rs's make-variable-transformer:
 | 
				
			||||||
| 
						 | 
					@ -747,6 +751,10 @@
 | 
				
			||||||
          (assertion-violation 'make-variable-transformer
 | 
					          (assertion-violation 'make-variable-transformer
 | 
				
			||||||
                 "not a procedure" x))))
 | 
					                 "not a procedure" x))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define make-compile-time-value
 | 
				
			||||||
 | 
					    (lambda (x)
 | 
				
			||||||
 | 
					      (cons 'ctv x)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (variable-transformer? x)
 | 
					  (define (variable-transformer? x)
 | 
				
			||||||
    (and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x))))
 | 
					    (and (pair? x) (eq? (car x) 'macro!) (procedure? (cdr x))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2648,9 +2656,9 @@
 | 
				
			||||||
  (define (local-macro-transformer x)
 | 
					  (define (local-macro-transformer x)
 | 
				
			||||||
    (car x))
 | 
					    (car x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (do-macro-call transformer expr)
 | 
					  (define (do-macro-call transformer expr r)
 | 
				
			||||||
    (let ((out (transformer (add-mark anti-mark expr #f))))
 | 
					    (define (return x)
 | 
				
			||||||
      (let f ((x out))
 | 
					      (let f ((x x))
 | 
				
			||||||
        ;;; don't feed me cycles.
 | 
					        ;;; don't feed me cycles.
 | 
				
			||||||
        (unless (stx? x)
 | 
					        (unless (stx? x)
 | 
				
			||||||
          (cond
 | 
					          (cond
 | 
				
			||||||
| 
						 | 
					@ -2660,16 +2668,33 @@
 | 
				
			||||||
             (syntax-violation #f 
 | 
					             (syntax-violation #f 
 | 
				
			||||||
               "raw symbol encountered in output of macro"
 | 
					               "raw symbol encountered in output of macro"
 | 
				
			||||||
               expr x)))))
 | 
					               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
 | 
					  ;;; chi procedures
 | 
				
			||||||
  (define chi-macro
 | 
					  (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
 | 
					  (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!?
 | 
					    ;;; FIXME: does not handle macro!?
 | 
				
			||||||
    (let ((lib (car p))
 | 
					    (let ((lib (car p))
 | 
				
			||||||
          (loc (cdr p)))
 | 
					          (loc (cdr p)))
 | 
				
			||||||
| 
						 | 
					@ -2680,7 +2705,7 @@
 | 
				
			||||||
                 ((procedure? x) x)
 | 
					                 ((procedure? x) x)
 | 
				
			||||||
                 (else (assertion-violation 'chi-global-macro
 | 
					                 (else (assertion-violation 'chi-global-macro
 | 
				
			||||||
                          "BUG: not a procedure" x)))))
 | 
					                          "BUG: not a procedure" x)))))
 | 
				
			||||||
          (do-macro-call transformer e)))))
 | 
					          (do-macro-call transformer e r)))))
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  (define chi-expr*
 | 
					  (define chi-expr*
 | 
				
			||||||
    (lambda (e* r mr)
 | 
					    (lambda (e* r mr)
 | 
				
			||||||
| 
						 | 
					@ -2720,9 +2745,9 @@
 | 
				
			||||||
           (let ((lex (lexical-var value)))
 | 
					           (let ((lex (lexical-var value)))
 | 
				
			||||||
             (build-lexical-reference no-source lex)))
 | 
					             (build-lexical-reference no-source lex)))
 | 
				
			||||||
          ((global-macro global-macro!)
 | 
					          ((global-macro global-macro!)
 | 
				
			||||||
           (chi-expr (chi-global-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 mr))
 | 
					          ((local-macro local-macro!) (chi-expr (chi-local-macro value e r) r mr))
 | 
				
			||||||
          ((macro macro!) (chi-expr (chi-macro value e) r mr))
 | 
					          ((macro macro!) (chi-expr (chi-macro value e r) r mr))
 | 
				
			||||||
          ((constant)
 | 
					          ((constant)
 | 
				
			||||||
           (let ((datum value))
 | 
					           (let ((datum value))
 | 
				
			||||||
             (build-data no-source datum)))
 | 
					             (build-data no-source datum)))
 | 
				
			||||||
| 
						 | 
					@ -2790,9 +2815,9 @@
 | 
				
			||||||
             ((global)
 | 
					             ((global)
 | 
				
			||||||
              (stx-error e "attempt to modify imported binding"))
 | 
					              (stx-error e "attempt to modify imported binding"))
 | 
				
			||||||
             ((global-macro!)
 | 
					             ((global-macro!)
 | 
				
			||||||
              (chi-expr (chi-global-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 mr))
 | 
					              (chi-expr (chi-local-macro value e r) r mr))
 | 
				
			||||||
             ((mutable) 
 | 
					             ((mutable) 
 | 
				
			||||||
              (stx-error e 
 | 
					              (stx-error e 
 | 
				
			||||||
                "attempt to assign to an unexportable variable"))
 | 
					                "attempt to assign to an unexportable variable"))
 | 
				
			||||||
| 
						 | 
					@ -3062,19 +3087,19 @@
 | 
				
			||||||
                        mix? sd?))))
 | 
					                        mix? sd?))))
 | 
				
			||||||
                 ((global-macro global-macro!)
 | 
					                 ((global-macro global-macro!)
 | 
				
			||||||
                  (chi-body*
 | 
					                  (chi-body*
 | 
				
			||||||
                     (cons (add-subst rib (chi-global-macro value e)) 
 | 
					                     (cons (add-subst rib (chi-global-macro value e r))
 | 
				
			||||||
                           (cdr e*))
 | 
					                           (cdr e*))
 | 
				
			||||||
                     r mr lex* rhs* mod** kwd* exp* rib 
 | 
					                     r mr lex* rhs* mod** kwd* exp* rib 
 | 
				
			||||||
                     mix? sd?))
 | 
					                     mix? sd?))
 | 
				
			||||||
                 ((local-macro local-macro!)
 | 
					                 ((local-macro local-macro!)
 | 
				
			||||||
                  (chi-body*
 | 
					                  (chi-body*
 | 
				
			||||||
                     (cons (add-subst rib (chi-local-macro value e))
 | 
					                     (cons (add-subst rib (chi-local-macro value e r))
 | 
				
			||||||
                           (cdr e*))
 | 
					                           (cdr e*))
 | 
				
			||||||
                     r mr lex* rhs* mod** kwd* exp* rib 
 | 
					                     r mr lex* rhs* mod** kwd* exp* rib 
 | 
				
			||||||
                     mix? sd?))
 | 
					                     mix? sd?))
 | 
				
			||||||
                 ((macro macro!)
 | 
					                 ((macro macro!)
 | 
				
			||||||
                  (chi-body*
 | 
					                  (chi-body*
 | 
				
			||||||
                     (cons (add-subst rib (chi-macro value e))
 | 
					                     (cons (add-subst rib (chi-macro value e r))
 | 
				
			||||||
                           (cdr e*))
 | 
					                           (cdr e*))
 | 
				
			||||||
                     r mr lex* rhs* mod** kwd* exp* rib mix?
 | 
					                     r mr lex* rhs* mod** kwd* exp* rib mix?
 | 
				
			||||||
                     sd?))
 | 
					                     sd?))
 | 
				
			||||||
| 
						 | 
					@ -3798,6 +3823,12 @@
 | 
				
			||||||
                     (cons (cons* label 'global-macro! loc) env)
 | 
					                     (cons (cons* label 'global-macro! loc) env)
 | 
				
			||||||
                     global*
 | 
					                     global*
 | 
				
			||||||
                     (cons (cons loc (binding-value b)) macro*))))
 | 
					                     (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*))
 | 
					               (($rtd $module) (f (cdr r) (cons x env) global* macro*))
 | 
				
			||||||
               (else
 | 
					               (else
 | 
				
			||||||
                (assertion-violation 'expander "BUG: do not know how to export"
 | 
					                (assertion-violation 'expander "BUG: do not know how to export"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -285,7 +285,8 @@
 | 
				
			||||||
           (lambda (x) 
 | 
					           (lambda (x) 
 | 
				
			||||||
             (let ((label (car x)) (binding (cdr x)))
 | 
					             (let ((label (car x)) (binding (cdr x)))
 | 
				
			||||||
               (remove-location label)
 | 
					               (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)))))
 | 
					                  (remove-location (cdr binding)))))
 | 
				
			||||||
           (library-env lib)))]
 | 
					           (library-env lib)))]
 | 
				
			||||||
      [(name) (uninstall-library name #t)]))
 | 
					      [(name) (uninstall-library name #t)]))
 | 
				
			||||||
| 
						 | 
					@ -316,6 +317,8 @@
 | 
				
			||||||
                      (cons 'global-macro (cons lib (cdr binding))))
 | 
					                      (cons 'global-macro (cons lib (cdr binding))))
 | 
				
			||||||
                     ((global-macro!)
 | 
					                     ((global-macro!)
 | 
				
			||||||
                      (cons 'global-macro! (cons lib (cdr binding))))
 | 
					                      (cons 'global-macro! (cons lib (cdr binding))))
 | 
				
			||||||
 | 
					                     ((global-ctv)
 | 
				
			||||||
 | 
					                      (cons 'global-ctv (cons lib (cdr binding))))
 | 
				
			||||||
                     (else binding))))
 | 
					                     (else binding))))
 | 
				
			||||||
              (set-label-binding! label binding))))
 | 
					              (set-label-binding! label binding))))
 | 
				
			||||||
        exp-env))
 | 
					        exp-env))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue