- 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]
|
||||
[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-ci<? i r uc se]
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
bound-identifier=? datum->syntax 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"
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue