Previous: Function Bindings, Up: Variable Bindings [Contents][Index]
These forms create local macros and “symbol macros”.
This form is analogous to cl-flet
, but for macros instead of
functions. Each binding is a list of the same form as the
arguments to cl-defmacro
(i.e., a macro name, argument list,
and macro-expander forms). The macro is defined accordingly for
use within the body of the cl-macrolet
.
Because of the nature of macros, cl-macrolet
is always lexically
scoped. The cl-macrolet
binding will
affect only calls that appear physically within the body
forms, possibly after expansion of other macros in the
body. Calls of cl-macrolet
bound macros are expanded in the
global environment.
This form creates symbol macros, which are macros that look like variable references rather than function calls. Each binding is a list ‘(var expansion)’; any reference to var within the body forms is replaced by expansion.
(setq bar '(5 . 9)) (cl-symbol-macrolet ((foo (car bar))) (cl-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)
. A let
(or let*
, lambda
, ...) binding of
the same symbol will locally shadow the symbol macro as is the case in
Common Lisp.
There is no analogue of defmacro
for symbol macros; all symbol
macros are local. A typical use of cl-symbol-macrolet
is in the
expansion of another macro:
(cl-defmacro my-dolist ((x list) &rest body) (let ((var (cl-gensym))) (list 'cl-loop 'for var 'on list 'do (cl-list* 'cl-symbol-macrolet (list (list x (list 'car var))) body)))) (setq mylist '(1 2 3 4)) (my-dolist (x mylist) (cl-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
(cl-loop for G1234 on mylist do (cl-symbol-macrolet ((x (car G1234))) (cl-incf x)))
which in turn expands to
(cl-loop for G1234 on mylist do (cl-incf (car G1234)))
See Loop Facility, for a description of the cl-loop
macro.
This package defines a nonstandard in-ref
loop clause that
works much like my-dolist
.
Previous: Function Bindings, Up: Variable Bindings [Contents][Index]