summaryrefslogtreecommitdiff
path: root/doc/misc/cl.texi
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2013-05-04 15:49:23 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2013-05-04 15:49:23 -0400
commit0a6313f7e3062a1c4ed2b32b68122484e847dc0f (patch)
tree015383336887c0c24595cd45085979cbf23f6bee /doc/misc/cl.texi
parent998768afd27ecfc8bea7549a84208e0fe204d33b (diff)
downloademacs-0a6313f7e3062a1c4ed2b32b68122484e847dc0f.tar.gz
* doc/misc/cl.texi (Obsolete Macros): Describe replacements for `flet'.
Fixes: debbugs:14293
Diffstat (limited to 'doc/misc/cl.texi')
-rw-r--r--doc/misc/cl.texi23
1 files changed, 20 insertions, 3 deletions
diff --git a/doc/misc/cl.texi b/doc/misc/cl.texi
index 83df411cb23..90f8a258d23 100644
--- a/doc/misc/cl.texi
+++ b/doc/misc/cl.texi
@@ -4850,10 +4850,27 @@ generated directly inside Emacs will not be caught since they make
direct C-language calls to the message routines rather than going
through the Lisp @code{message} function.
+For those cases where the dynamic scoping of @code{flet} is desired,
+@code{cl-flet} is clearly not a substitute. The most direct replacement would
+be instead to use @code{cl-letf} to temporarily rebind @code{(symbol-function
+'@var{fun})}. But in most cases, a better substitute is to use an advice, such
+as:
+
+@example
+(defvar my-fun-advice-enable nil)
+(add-advice '@var{fun} :around
+ (lambda (orig &rest args)
+ (if my-fun-advice-enable (do-something)
+ (apply orig args))))
+@end example
+
+so that you can then replace the @code{flet} with a simple dynamically scoped
+binding of @code{my-fun-advice-enable}.
+
@c Bug#411.
-Note that many primitives (e.g., @code{+}) have special byte-compile
-handling. Attempts to redefine such functions using @code{flet} will
-fail if byte-compiled.
+Note that many primitives (e.g., @code{+}) have special byte-compile handling.
+Attempts to redefine such functions using @code{flet}, @code{cl-letf}, or an
+advice will fail when byte-compiled.
@c Or cl-flet.
@c In such cases, use @code{labels} instead.
@end defmac