﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	difficulty
1491	##sys#expand-multiple-values-assignment works for some reason	megane		"Replace the original with this. I have only added the `print` and the `import`.
  {{{
  (import chicken.type)
  (define (##sys#expand-multiple-values-assignment formals expr)
    (##sys#decompose-lambda-list
     formals
     (lambda (vars argc rest)
       (let ((aliases    (if (symbol? formals) '() (map gensym formals)))
             (rest-alias (if (not rest) '() (gensym rest))))
         (print ""formals: "" formals
                "" list?: ""(list? (the * formals))
                "" aliases: "" aliases
                "" rest "" rest-alias)
         `(##sys#call-with-values
           (##core#lambda () ,expr)
           (##core#lambda
            ,(append aliases rest-alias)
            ,@(map (lambda (v a) `(##core#set! ,v ,a)) vars aliases)
            ,@(cond
                ((null? formals) '((##core#undefined)))
                ((null? rest-alias) '())
                (else `((##core#set! ,rest ,rest-alias))))))))))
  }}}

Now check the output of this. Pay attention to the `(d . e)` case. It's not a list, but somehow the `(map gensym formals)` expression runs without errors.
  {{{
  (let ([e '(0 1 2 3 (4) (5 6))]
        [r (letrec-values ((() (values))
                           ((a) (values 0))
                           ((b c) (values 1 2))
                           ((d . e) (values 3 4))
                           (f (values 5 6)))
                          (list a b c d e f))])
    (print e)
    (print r)
    (assert (equal? e r)))

  -->
  $ csc ../letrecvalues.scm && ../letrecvalues
  formals: () list?: #t aliases: () rest ()
  formals: (a) list?: #t aliases: (a11) rest ()
  formals: (b c) list?: #t aliases: (b12 c13) rest ()
  formals: (d . e) list?: #f aliases: (d14) rest e15
  formals: f list?: #f aliases: () rest f16
  (0 1 2 3 (4) (5 6))
  (0 1 2 3 (4) (5 6))
  }}}

I think the correct implementation is something more like this:
{{{
(define (##sys#expand-multiple-values-assignment formals expr)
  (##sys#decompose-lambda-list
   formals
   (lambda (vars argc rest)
     (let* ((aliases    (if (symbol? formals) '() (map gensym vars)))
	    (rest-alias (and rest (gensym rest))))
       `(##sys#call-with-values
	 (##core#lambda () ,expr)
	 (##core#lambda
	  ,(cond
	    [(symbol? formals) rest-alias]
	    [(and rest (null? (cdr vars))) rest-alias]
	    [(null? aliases) aliases]
	    [rest (let lp ([vs aliases])
		    (if (null? (cdr vs))
			(car vs)
			(cons (car vs) (lp (cdr vs)))))]
	    [else aliases])
	  ,@(map (lambda (v a) `(##core#set! ,v ,a)) vars aliases)
	  ,@(cond
	     [(symbol? formals) `((##core#set! ,rest ,rest-alias))]
	     [else '((begin))])))))))
}}}"	defect	new	minor	someday	expander	5.0.0				medium
