A Scheme interpretation pairs up a formal parameter specification with the actual arguments supplied in a function call, thus doing a sort of restricted pattern matching, with the formal parameter specification serving as kind of a pattern.
When it is a proper list of length n, this is like saying, will bind each of the n supplied argument values to each of the variables in the spec. Scheme demands exactly n arguments be supplied in such situation, although some dialects could be imagined to allow more, or less, than n arguments in such function call, without causing an error:
(define mylist (lambda (x y) ; (define (mylist x y) ; exactly two
(list x y))) ; (list x y)) ; arguments required
When it's an improper list with n variables and one tail variable, this is like saying if given more than n arguments, will bind the rest of them, as a list, to that tail variable. If there were no more arguments, naturally an empty list will be bound to the tail variable:
(define mylist (lambda (x . y) ; (define (mylist x . y) ; at least one
(cons x y))) ; (cons x y)) ; argument required
The sole variable as a formal parameter specifiction is identified as a tail variable of an improper list, serving as a particular variant of the previous case. It will be thus bound to all the argument values supplied in a function call, as a list:
(define mylist (lambda x ; (define (mylist . x) ; any number of
x)) ; x) ; arguments can be used
x is already a list holding all the supplied arguments.
As is readily seen, all three cases can be handled by the same code transformation,
(define (translate-define-to-lambda code)
(list (car code) ; "define"
(caadr code) ; name
(cons 'lambda
(cons (cdadr code) ; parameters
(cddr code)))))
(because (cdr '(<a> . <b>)) == <b>).