This package implements a macro named ##
, which provides a compact way
to write short lambda
expressions.
The signature of the macro is (## FN &rest BODY)
and it expands to a
lambda
expression, which calls the function FN
with the arguments BODY
and returns the value of that. The arguments of the lambda
expression
are derived from symbols found in BODY
.
Each symbol from %1
through %9
, which appears in an unquoted part
of BODY
, specifies a mandatory argument. Each symbol from &1
through
&9
, which appears in an unquoted part of BODY
, specifies an optional
argument. The symbol &*
specifies extra (&rest
) arguments.
The shorter symbol %
can be used instead of %1
, but using both in
the same expression is not allowed. Likewise &
can be used instead
of &1
. These shorthands are not recognized in function position.
To support binding forms that use a vector as VARLIST
(such as -let
from the dash
package), argument symbols are also detected inside of
vectors.
The space between ##
and FN
can be omitted because ##
is read-syntax
for the symbol whose name is the empty string. If you prefer you can
place a space there anyway, and if you prefer to not use this somewhat
magical symbol at all, you can instead use the alternative name llama
.
Instead of:
(lambda (a &optional _ c &rest d)
(foo a (bar c) d))
you can use this macro and write:
(##foo %1 (bar &3) &*)
which expands to:
(lambda (%1 &optional _&2 &3 &rest &*)
(foo %1 (bar &3) &*))
Unused trailing arguments and mandatory unused arguments at the border between mandatory and optional arguments are also supported:
(##list %1 _%3 &5 _&6)
becomes:
(lambda (%1 _%2 _%3 &optional _&4 &5 _&6)
(list %1 &5))
Note how _%3
and _&6
are removed from the body, because their names
begin with an underscore. Also note that _&4
is optional, unlike the
explicitly specified _%3
.