Function Bindings
Variable Bindings
These forms create local macros and ``symbol macros.''
flet
, but for macros instead of
functions. Each binding is a list of the same form as the
arguments to defmacro*
(i.e., a macro name, argument list,
and macro-expander forms). The macro is defined accordingly for
use within the body of the macrolet
.
Because of the nature of macros, macrolet
is lexically
scoped even in Emacs Lisp: The macrolet
binding will
affect only calls that appear physically within the body
forms, possibly after expansion of other macros in the
body.
(var expansion)
';
any reference to var within the body forms is
replaced by expansion.
(setq bar '(5 . 9)) (symbol-macrolet ((foo (car bar))) (incf foo)) bar => (6 . 9)
A setq
of a symbol macro is treated the same as a setf
.
I.e., (setq foo 4)
in the above would be equivalent to
(setf foo 4)
, which in turn expands to (setf (car bar) 4)
.
Likewise, a let
or let*
binding a symbol macro is
treated like a letf
or letf*
. This differs from true
Common Lisp, where the rules of lexical scoping cause a let
binding to shadow a symbol-macrolet
binding. In this package,
only lexical-let
and lexical-let*
will shadow a symbol
macro.
There is no analogue of defmacro
for symbol macros; all symbol
macros are local. A typical use of symbol-macrolet
is in the
expansion of another macro:
(defmacro* my-dolist ((x list) &rest body) (let ((var (gensym))) (list 'loop 'for var 'on list 'do (list* 'symbol-macrolet (list (list x (list 'car var))) body)))) (setq mylist '(1 2 3 4)) (my-dolist (x mylist) (incf x)) mylist => (2 3 4 5)
In this example, the my-dolist
macro is similar to dolist
(see Iteration) except that the variable x
becomes a true
reference onto the elements of the list. The my-dolist
call
shown here expands to
(loop for G1234 on mylist do (symbol-macrolet ((x (car G1234))) (incf x)))
which in turn expands to
(loop for G1234 on mylist do (incf (car G1234)))
See Loop Facility, for a description of the loop
macro.
This package defines a nonstandard in-ref
loop clause that
works much like my-dolist
.