summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2014-02-02 21:13:47 -0500
committerMark H Weaver <mhw@netris.org>2014-02-02 21:43:35 -0500
commit866af5da3d11ac4a9df44ee8c5b1781a0073c288 (patch)
tree6b14dd32de8ebcefaf0a7f23a049eb53c84a0802
parent48eb9021190766577a79ec26fe0b2f3332254561 (diff)
downloadguile-866af5da3d11ac4a9df44ee8c5b1781a0073c288.tar.gz
define-values: Blackhole 'dummy'; work around lack of toplevel hygiene.
* module/ice-9/boot-9.scm (define-values): Use 'generate-temporaries' to generate a fresh name for 'dummy', to work around the lack of hygiene for macro-introduced toplevel identifiers. Blackhole 'dummy' to avoid keeping garbage alive. Add more comments.
-rw-r--r--module/ice-9/boot-9.scm76
1 files changed, 45 insertions, 31 deletions
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm
index c6cdcd365..42d7d7837 100644
--- a/module/ice-9/boot-9.scm
+++ b/module/ice-9/boot-9.scm
@@ -596,11 +596,13 @@ If there is no handler at all, Guile prints an error and then exits."
(lambda (orig-form)
(syntax-case orig-form ()
((_ () expr)
- #`(define dummy
- (call-with-values (lambda () expr)
- (case-lambda
- (() #f)
- (_ (%define-values-arity-error))))))
+ ;; XXX Work around the lack of hygienic top-level identifiers
+ (with-syntax (((dummy) (generate-temporaries '(dummy))))
+ #`(define dummy
+ (call-with-values (lambda () expr)
+ (case-lambda
+ (() #f)
+ (_ (%define-values-arity-error)))))))
((_ (var) expr)
(identifier? #'var)
#`(define var
@@ -610,19 +612,25 @@ If there is no handler at all, Guile prints an error and then exits."
(_ (%define-values-arity-error))))))
((_ (var0 ... varn) expr)
(and-map identifier? #'(var0 ... varn))
- #`(begin
- (define dummy
- (call-with-values (lambda () expr)
- (case-lambda
- ((var0 ... varn)
- (list var0 ... varn))
- (_ (%define-values-arity-error)))))
- (define var0
- (let ((v (car dummy)))
- (set! dummy (cdr dummy))
- v))
- ...
- (define varn (car dummy))))
+ ;; XXX Work around the lack of hygienic toplevel identifiers
+ (with-syntax (((dummy) (generate-temporaries '(dummy))))
+ #`(begin
+ ;; Avoid mutating the user-visible variables
+ (define dummy
+ (call-with-values (lambda () expr)
+ (case-lambda
+ ((var0 ... varn)
+ (list var0 ... varn))
+ (_ (%define-values-arity-error)))))
+ (define var0
+ (let ((v (car dummy)))
+ (set! dummy (cdr dummy))
+ v))
+ ...
+ (define varn
+ (let ((v (car dummy)))
+ (set! dummy #f) ; blackhole dummy
+ v)))))
((_ var expr)
(identifier? #'var)
#'(define var
@@ -630,19 +638,25 @@ If there is no handler at all, Guile prints an error and then exits."
list)))
((_ (var0 ... . varn) expr)
(and-map identifier? #'(var0 ... varn))
- #`(begin
- (define dummy
- (call-with-values (lambda () expr)
- (case-lambda
- ((var0 ... . varn)
- (list var0 ... varn))
- (_ (%define-values-arity-error)))))
- (define var0
- (let ((v (car dummy)))
- (set! dummy (cdr dummy))
- v))
- ...
- (define varn (car dummy)))))))
+ ;; XXX Work around the lack of hygienic toplevel identifiers
+ (with-syntax (((dummy) (generate-temporaries '(dummy))))
+ #`(begin
+ ;; Avoid mutating the user-visible variables
+ (define dummy
+ (call-with-values (lambda () expr)
+ (case-lambda
+ ((var0 ... . varn)
+ (list var0 ... varn))
+ (_ (%define-values-arity-error)))))
+ (define var0
+ (let ((v (car dummy)))
+ (set! dummy (cdr dummy))
+ v))
+ ...
+ (define varn
+ (let ((v (car dummy)))
+ (set! dummy #f) ; blackhole dummy
+ v))))))))
(define-syntax-rule (delay exp)
(make-promise (lambda () exp)))