fluid.scm 899 B

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