Summary

define-values is overly restrictive

Metadata

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