1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

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.
This commit is contained in:
Mark H Weaver 2014-02-02 21:13:47 -05:00
parent 48eb902119
commit 866af5da3d

View file

@ -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)))