diff options
author | Andy Wingo <wingo@pobox.com> | 2014-02-07 15:15:08 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-02-07 15:24:43 +0100 |
commit | b00c9b221401082449fd733a78bb1b4f88e41ebe (patch) | |
tree | f51128624515a1a3d8f3115b730a11d04d2c31ee /module/ice-9/boot-9.scm | |
parent | cd36c69619e406082100efb1e62998fc67bbc2a6 (diff) | |
parent | 866af5da3d11ac4a9df44ee8c5b1781a0073c288 (diff) | |
download | guile-b00c9b221401082449fd733a78bb1b4f88e41ebe.tar.gz |
Merge commit '866af5da3d11ac4a9df44ee8c5b1781a0073c288'
Removes the special arity handler, and instead relies on the procedure
returning the correct number of values.
Diffstat (limited to 'module/ice-9/boot-9.scm')
-rw-r--r-- | module/ice-9/boot-9.scm | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index bfcce0a59..b6ba03c4d 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -717,6 +717,64 @@ file with the given name already exists, the effect is unspecified." ((do "step" x y) y))) +(define-syntax define-values + (lambda (orig-form) + (syntax-case orig-form () + ((_ () expr) + ;; XXX Work around the lack of hygienic top-level identifiers + (with-syntax (((dummy) (generate-temporaries '(dummy)))) + #`(define dummy + (call-with-values (lambda () expr) + (lambda () #f))))) + ((_ (var) expr) + (identifier? #'var) + #`(define var + (call-with-values (lambda () expr) + (lambda (v) v)))) + ((_ (var0 ... varn) expr) + (and-map identifier? #'(var0 ... varn)) + ;; 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) + (lambda (var0 ... varn) + (list var0 ... varn)))) + (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 + (call-with-values (lambda () expr) + list))) + ((_ (var0 ... . varn) expr) + (and-map identifier? #'(var0 ... varn)) + ;; 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) + (lambda (var0 ... . varn) + (list var0 ... varn)))) + (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))) |