I'm not sure whether this is a request to add back in a destructuring-bind. If it is, please say so.

I'll note that a general problem of using macro lambda lists an an explicit way to provide the user-visible documentation, at least in our current implementation - is that it reveals internal details that make no sense.
A user attempting to learn the signature of whatever this macro below is doesn't need to know that its binds &whole and &aux vars and calls a function G to obtain a value for something not even in the signature.

* (destructuring-bind (&whole foo a b (&whole x c d) &aux (z (g x))) '(baz) (bork))

=> invalid number of elements in (BAZ) to satisfy lambda list

      (&WHOLE FOO A B (&WHOLE X C D) &AUX (Z (G X)))



On Fri, May 23, 2014 at 8:28 PM, Stas Boukarev <stassats@gmail.com> wrote:
"Douglas Katzman" <snuglas@users.sourceforge.net> writes:

> The branch "master" has been updated in SBCL:
>        via  500983b648feaac4b5c7d94ba7058d9528c34cd7 (commit)
>       from  257e43c6dcaf5b8a9ca12c78cb895f7345e9e4d7 (commit)
>
> - Log -----------------------------------------------------------------
> commit 500983b648feaac4b5c7d94ba7058d9528c34cd7
> Author: Douglas Katzman <dougk@google.com>
> Date:   Fri May 2 21:40:23 2014 -0400
>
>     Address style issues in DEF-IR1-TRANSLATOR
>
>     - It's not particularly useful from a user perspective to
>       see that SETQ's signature is (&WHOLE SOURCE &REST THINGS).
>     - Don't DEFUN the guard, muck with it, then fmakunbound it.
>       Just set the special operators's SYMBOL-FUNCTION in one go.
>     - Building the cross-compiler warned about unused variables.

>             ;; the cross-compilation host Lisp, which owns the
>             ;; SYMBOL-FUNCTION of its COMMON-LISP symbols. These guard
>             ;; functions also provide the documentation for special forms.
> -           (progn
> -             (defun ,guard-name (&rest args)
> -               ,@(when doc (list doc))
> -               (declare (ignore args))
> -               (error 'special-form-function :name ',name))
> -             (let ((fun #',guard-name))
> -               (setf (%simple-fun-arglist fun) ',lambda-list
> -                     (%simple-fun-name fun) '(sb!impl::special-operator ,name)
> -                     (symbol-function ',name) fun)
> -               (fmakunbound ',guard-name)))
> +           ;; FIXME: should be disallowed after bootstrap. Package-lock
> +           ;; prevents it, but the protection could be stronger than that.
> +           (setf (symbol-function ',name)
> +                 ,(let ((ll (substitute '&rest '&body lambda-list))
> +                        (crud sb!xc:lambda-list-keywords))
> +                   (when (eq (first ll) '&whole) (setq ll (cddr ll)))
> +                   ;; The lambda name has significance to COERCE-SYMBOL-TO-FUN.
> +                   ;; Don't change it haphazardly - a unit test will fail.
> +                   `(named-lambda (sb!impl::special-operator ,name) ,ll
> +                     ,@(when doc (list doc))
> +                     (declare (ignore ,@(remove-if (lambda (x) (memq x crud))
> +                                                   ll))
> +                              (optimize (verify-arg-count 0)))
> +                     (error 'special-form-function :name ',name))))
>             ;; FIXME: Evidently "there can only be one!" -- we overwrite any
>             ;; other :IR1-CONVERT value. This deserves a warning, I think.
>             (setf (info :function :ir1-convert ',name) #',fn-name)
That change made def-ir1-translator with macro lambda lists impossible,
since the lambda list is used for named-lambda, and this only accepts
ordinary lambda lists.

--
With best regards, Stas.