mes: Nyacc support: with-fluids.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 20 Nov 2017 22:21:25 +0000 (23:21 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 20 Nov 2017 22:21:25 +0000 (23:21 +0100)
* module/mes/fluids.mes (with-fluids): New macro.
* tests/fluids.test ("with-fluids"): Test it.

module/mes/fluids.mes
tests/fluids.test

index 07bf80985c6ea87dad7a0ca7dab60f0186b8a148..b9f88c457213ea9e96f5f1788b04dd35e58f2ec7 100644 (file)
 ;; (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)
index 1fedb16a2d72ec9634a90edf797ece29c2aeb43e..7e77cb086cea2365426b5d933ff0094e1629a0d9 100755 (executable)
@@ -50,20 +50,19 @@ exit $?
 ;;     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))