Summary
define-values is overly restrictive
Metadata
- Id: a874abfa0ac0605f289abe3ddb70bd3efaaa8d6e
- Trac id: 1002
- Type: enhancement
- Reporter: johnwcowan
- Owner:
- Cc:
- Status: closed
- Component: unknown
- Estimated difficulty:
- Resolution: fixed
- Priority: major
- Milestone: someday
- Version: 4.8.x
- Changetime: 2014-07-12 17:30:20 UTC
- Created: 2013-03-29 06:35:36 UTC
- Keywords:
Description
Currently, `define-values` requires that its lambda-list be a proper list of identifiers like `(a b)`, whereas it should allow `(a b . c)` and even `a`, which are both valid lambda-lists.
The following definition achieves this:
(define-syntax define-values
(syntax-rules ()
((define-values () exp)
(call-with-values (lambda () exp) (lambda () 'unspecified)))
((define-values (var . vars) exp)
(begin
(define var (call-with-values (lambda () exp) list))
(define-values vars (apply values (cdr var)))
(define var (car var))))
((define-values var exp)
(define var (call-with-values (lambda () exp) list)))))
Changes and comments
[2013-03-29 06:43:37 UTC] johnwcowan wrote:
Here's the definition from R7RS:
(define-syntax define-values
(syntax-rules ()
((define-values () expr)
(define dummy
(call-with-values (lambda () expr)
(lambda args \schfalse))))
((define-values (var) expr)
(define var expr))
((define-values (var0 var1 ... varn) expr)
(begin
(define var0
(call-with-values (lambda () expr)
list))
(define var1
(let ((v (cadr var0)))
(set-cdr! var0 (cddr var0))
v)) ...
(define varn
(let ((v (cadr var0)))
(set! var0 (car var0))
v))))
((define-values (var0 var1 ... . varn) expr)
(begin
(define var0
(call-with-values (lambda () expr)
list))
(define var1
(let ((v (cadr var0)))
(set-cdr! var0 (cddr var0))
v)) ...
(define varn
(let ((v (cdr var0)))
(set! var0 (car var0))
v))))
((define-values var expr)
(define var
(call-with-values (lambda () expr)
list)))))
[2013-04-02 23:04:18 UTC] sjamaan wrote:
Jeez, that's horrible!
A much simpler (I hope equally correct) version has been sent to chicken-hackers.
[2014-07-12 17:30:20 UTC] sjamaan changed status from new to closed
[2014-07-12 17:30:20 UTC] sjamaan set resolution to fixed
[2014-07-12 17:30:20 UTC] sjamaan wrote:
Fixed by 25a9b9932014f8ff84825658c054a91e6c0630f3..136e0b4292aec0cb8c5c8f6c9860d22bc2261a1e136e0b4292aec0cb8c5c8f6c9860d22bc2261a1e