define-values.scm 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!r6rs
  2. ;;; define-values.sls --- define-values syntax.
  3. ;; Copyright (C) 2009, 2010 Andreas Rottmann <a.rottmann@gmx.at>
  4. ;; This program is free software, you can redistribute it and/or
  5. ;; modify it under the terms of the MIT/X11 license.
  6. ;; You should have received a copy of the MIT/X11 license along with
  7. ;; this program. If not, see
  8. ;; <http://www.opensource.org/licenses/mit-license.php>.
  9. ;;; Commentary:
  10. ;;; Code:
  11. (library (arguile lib private define-values)
  12. (export define-values)
  13. (import (for (rnrs base) run expand)
  14. (for (rnrs syntax-case) run expand))
  15. ;;@args names body ...
  16. ;;@defspec define-values (name ...) body ...
  17. ;;
  18. ;; Defines the identifiers given by @var{name} @dots{} by using the
  19. ;; values returned by @var{body}.
  20. ;;
  21. ;;@end defspec
  22. (define-syntax define-values
  23. (lambda (form)
  24. ;; The temporaries generated for `dummy' are just a workaround
  25. ;; for a psyntax bug in Guile.
  26. (syntax-case form ()
  27. ((_ () exp ...)
  28. (with-syntax (((dummy) (generate-temporaries '(dummy))))
  29. (syntax
  30. (define dummy (begin exp ... 'dummy)))))
  31. ((_ (id ...) exp0 exp ...)
  32. ;; Mutable-ids are needed so that ids defined by
  33. ;; define-values can be exported from a library (mutated
  34. ;; variables cannot be exported). This fix is due to Andre
  35. ;; van Tonder.
  36. (with-syntax (((mutable-id ...) (generate-temporaries (syntax (id ...))))
  37. ((result ...) (generate-temporaries (syntax (id ...))))
  38. ((dummy) (generate-temporaries '(dummy))))
  39. (syntax
  40. (begin
  41. (define mutable-id) ...
  42. (define dummy
  43. (call-with-values
  44. (lambda () exp0 exp ...)
  45. (lambda (result ...)
  46. (set! mutable-id result) ...
  47. 'dummy)))
  48. (define id mutable-id) ...))))))))