psyntax support for with-fluids

* module/ice-9/psyntax.scm (build-dynlet, with-fluids): Use psyntax to
  recognize `with-fluids' as a core form, producing <dynlet> if we are
  compiling.
  (sc-expand): To spice up the mix, use with-fluids here in the
  implementation.

* module/ice-9/psyntax-pp.scm: Bootstrapped twice (!).

* module/ice-9/boot-9.scm: Remove with-fluids definition, it's in the
  core now.
This commit is contained in:
Andy Wingo 2010-02-18 22:11:57 +01:00
commit 6360c1d4c1
3 changed files with 6665 additions and 6556 deletions

View file

@ -358,6 +358,13 @@
`(if ,test-exp ,then-exp ,else-exp))
source)))))
(define build-dynlet
(lambda (source fluids vals body)
(case (fluid-ref *mode*)
((c) ((@ (language tree-il) make-dynlet) source fluids vals body))
(else (decorate-source `(with-fluids ,(map list fluids vals) ,body)
source)))))
(define build-lexical-reference
(lambda (type source name var)
(case (fluid-ref *mode*)
@ -2184,6 +2191,17 @@
(chi #'then r w mod)
(chi #'else r w mod))))))
(global-extend 'core 'with-fluids
(lambda (e r w s mod)
(syntax-case e ()
((_ ((fluid val) ...) b b* ...)
(build-dynlet
s
(map (lambda (x) (chi x r w mod)) #'(fluid ...))
(map (lambda (x) (chi x r w mod)) #'(val ...))
(chi-body #'(b b* ...)
(source-wrap e w s mod) r w mod))))))
(global-extend 'begin 'begin '())
(global-extend 'define 'define '())
@ -2372,10 +2390,9 @@
(esew (if (or (null? rest) (null? (cdr rest)))
'(eval)
(cadr rest))))
(with-fluid* *mode* m
(lambda ()
(chi-top x null-env top-wrap m esew
(cons 'hygiene (module-name (current-module))))))))))
(with-fluids ((*mode* m))
(chi-top x null-env top-wrap m esew
(cons 'hygiene (module-name (current-module)))))))))
(set! identifier?
(lambda (x)