enhanced-multiple-value-bind provides an enhanced
multiple-value-bind macro that adds support for lambda list keywords by expanding to a
multiple-value-call when necessary. This makes catching multiple-value
&key much more lightweight and convenient. A
multiple-value-&bind alias is supported.
Some problems with writing out
multiple-value-call with an inline
lambda, especially with a big
lambda body and trivial form arguments to
multiple-value-call, compared to
- "unnatural" order of evaluation (skip over
lambda, evaluate values forms, then "come back" for
- significant extra indentation for the body.
&key are currently not being used a lot (as far as I know), but the awkwardness of using them up to now might have something to do with this state of affairs. Their usefulness and convenience should now be reassessed.
enhanced-mvb:multiple-value-bind is invoked without apparent lambda list keywords (symbols beginning with "&"), then it simply expands to
enhanced-mvb:multiple-value-bind(a b c) (values 1 2 3) ...) == (multiple-value-bind (a b c) (values 1 2 3) ...)
Else, it simply expands to a
multiple-value-call with inline
enhanced-mvb:multiple-value-bind(a b &rest rest) (values 1 2 3) ...) == (multiple-value-call (lambda (a b &rest rest) ...) (values 1 2 3))
An interesting consequence of this is that it's easy to accept an exact number of return values (though I'm not sure why you'd want to):
multiple-value-bind(a b c &optional) (values 1 2 3 4)) error → "Invalid number of arguments: 4"
This follows the same principle as
function type specifiers.
To use enhanced-multiple-value-bind, either refer to the provided
;; A bit long... (
enhanced-multiple-value-bind:multiple-value-bind(x y &rest others) (values 1 2 3 4) (values (* x y) others)) → 2, (3 4) ;; Much more managable package nickname. (
enhanced-mvb:multiple-value-bind(x y &rest others) (values 1 2 3 4) (values (* x y) others)) → 2, (3 4)
(:shadowing-import-from #:enhanced-multiple-value-bind #:multiple-value-bind) in your
defpackage (or with the package nickname, again). Don't
enhanced-multiple-value-bind also exports
multiple-value-&bind, with exactly the same functionality, so you can
(:import-from #:enhanced-multiple-value-bind #:multiple-value-&bind) in your
defpackage instead if you want.