;; (define (with-fluids* fluids values thunk)
;; (primitive-eval (with-fluids*-next fluids values thunk)))
-;; (define-macro (with-fluids bindings . bodies)
-;; `(let ()
-;; (define (expand bindings a)
-;; (if (null? bindings)
-;; (cons (car bindings) (expand (cdr bindings) a))))
-;; (eval (begin ,@bodies) (expand ',bindings (current-module)))))
+(define-macro (with-fluids bindings . bodies)
+ (let ((syms (map gensym bindings)))
+ `(let ,(map (lambda (b s) `(,s (,b))) (map car bindings) syms)
+ ,@(map (lambda (o) `(fluid-set! ,(car o) ,(cadr o))) bindings)
+ (let ((r (begin ,@bodies)))
+ `,@(map (lambda (b s) `(fluid-set! ,b ,s)) (map car bindings) syms)
+ r))))
(define (dynamic-wind in-guard thunk out-guard)
(in-guard)
;; 0 (with-fluids* (list a b) '(0 1)
;; (lambda () (fluid-ref a))))
-;; (pass-if-equal "with-fluids"
-;; 0 (with-fluids ((a 1)
-;; (a 2)
-;; (a 3))
-;; (begin (fluid-set! a 0))
-;; (begin (fluid-ref a))))
+(pass-if-equal "with-fluids"
+ 0 (with-fluids ((a 1)
+ (a 2)
+ (a 3))
+ (fluid-set! a 0)
+ (fluid-ref a)))
-;; (pass-if-equal "with-fluids"
-;; #f (begin
-;; (with-fluids ((a 1)
-;; (a 2)
-;; (a 3))
-;; (begin (fluid-set! a 0))
-;; (begin (display "X:") (display (fluid-ref a)) (newline)))
-;; (fluid-ref a)))
+(pass-if-equal "with-fluids" ; FIXME: fails with Mes
+ #f (begin
+ (with-fluids ((a 1)
+ (b 2))
+ (fluid-set! a 0)
+ (display "X:") (display (fluid-ref a)) (newline))
+ (fluid-ref a)))
-(result 'report)
+(result 'report (if mes? 1 0))