Subject: Re: multiple-value binding let and let*
From: Erik Naggum <>
Date: 1999/08/18
Newsgroups: comp.lang.lisp
Message-ID: <>

* Dave Bakhash <>
| (let* ((x 3)
|        (y 4)
|        ((q r) (truncate x y)))
|   <body>)

  I prefer

(let ((x 3) (y 4) q r)
  (setf (values q r) (truncate x y)))

  although I can see the value of these binding forms, we should not forget
  that DESTRUCTURING-BIND and MULTIPLE-VALUE-BIND go through a lot more
  work than they appear to be and that it's a lot harder to specify exactly
  how these things are supposed to interact with missing values than one
  might believe from watching the trivial cases.

  I note in passing that the generated machine code for the following two
  forms are identical in Allegro CL 5.0.1 for all the machines I have
  tested it on.  (Duane?)

(let (a b) (setf (values a b) (truncate pi 3)) (list a b))
(multiple-value-bind (a b) (truncate pi 3) (list a b))

| Personally, I'd like LET handle both MVs and destructuring.

  I think MULTIPLE-VALUE-BIND and DESTRUCTURING-BIND abuse indentation and
  clutter up the binding/setting distinction, and I see no reason why we
  should now fix that non-problem by cluttering up the meaning of binding
  so much we don't know what we're getting, anymore.

  when I use MULTIPLE-VALUE-BIND and DESTRUCTURING-BIND, it is around short
  pieces of code because I frequently need to rearrange the returned values
  before using them as arguments for another function call, or even to
  avoid the overhead of MULTIPLE-VALUE-CALL, which I would much prefer to
  be implemented at least as efficiently as APPLY (and perhaps with the
  same underlying machinery, even possibly exposed as an argument sequence).

  (defun pringles (chips)
    (loop (pop chips)))