fluid.scm 870 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ; Fluid variables
  3. (define (make-fluid val)
  4. (vector '<fluid> val))
  5. (define (fluid f) (vector-ref f 1))
  6. (define (set-fluid! f val)
  7. (vector-set! f 1 val))
  8. (define (let-fluid f val thunk)
  9. (let ((swap (lambda () (let ((temp (fluid f)))
  10. (set-fluid! f val)
  11. (set! val temp)))))
  12. (dynamic-wind swap thunk swap)))
  13. (define (let-fluids . args) ;Kind of gross
  14. (let loop ((args args)
  15. (swap (lambda () #f)))
  16. (if (null? (cdr args))
  17. (dynamic-wind swap (car args) swap)
  18. (loop (cddr args)
  19. (let ((f (car args))
  20. (val (cadr args)))
  21. (lambda ()
  22. (swap)
  23. (let ((temp (fluid f)))
  24. (set-fluid! f val)
  25. (set! val temp))))))))
  26. (define (fluid-cell-ref f)
  27. (cell-ref (fluid f)))
  28. (define (fluid-cell-set! f val)
  29. (cell-set! (fluid f) val))