This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: fluid-let


Marius-

Is this closer?


(defmacro fluid-let (binding-ls . body)
  (let* ((expanded-binding-ls 
	  (map (lambda (binding) 
		 (append binding (list (gensym)))) 
	       binding-ls))
	 (tmp-var (gensym))
	 (environment-ls
	  (map (lambda (binding) 
		 `(,(caddr binding) ,(cadr binding))) 
	       expanded-binding-ls))
	 (swap-ls
	  (map (lambda (binding) 
		 `(begin
		    (set! ,tmp-var ,(car binding))
		    (set! ,(car binding) ,(caddr binding))
		    (set! ,(caddr binding) ,tmp-var)))
	       expanded-binding-ls)))
    `(let ,environment-ls
       (let ((,tmp-var #f))
	 (dynamic-wind
	  (lambda () ,@swap-ls)
	  (lambda () ,@body)
	  (lambda () ,@swap-ls))))))


Now on to with-fluids...

-russ


--
Don't try to teach a pig to sing: it's useless, and annoys the pig.