summaryrefslogtreecommitdiffstats
path: root/txr.1
diff options
context:
space:
mode:
Diffstat (limited to 'txr.1')
-rw-r--r--txr.138
1 files changed, 37 insertions, 1 deletions
diff --git a/txr.1 b/txr.1
index fc187aec..645c4e04 100644
--- a/txr.1
+++ b/txr.1
@@ -30165,13 +30165,34 @@ The return value of the macro is the macro expansion. It is substituted in
place of the entire macro call form. That form is then expanded again;
it may itself be another macro call, or contain more macro calls.
-.TP* "Dialect Note:"
+A global macro defined using
+.code defmacro
+may decline to expand a macro form. Declining to expand is achieved by
+returning the original unexpanded form, which may be captured using the
+.code :form
+parameter. When a global macro declines to expand a form, the form is
+taken as-is. At evaluation time, it will be treated as a function call.
+Note: when a local macro defined by
+.code macrolet
+declines, more complicated requirements apply; see the description of
+.codn macrolet .
+
+.TP* "Dialect Notes:"
A macro in the global namespace introduced by
.code defmacro
may co-exist with a function of the same name introduced by
.codn defun .
This is not permitted in ANSI Common Lisp.
+ANSI Common Lisp doesn't describe the concept of declining to expand, except in
+the area of compiler macros. Since TXR Lisp allows global macros and functions
+of the same name to co-exist, ordinary macros can be used to optimize functions
+in a manner similar to Common Lisp compiler macros. A macro can be written
+of the same name as a function, and can optimize certain cases of the function
+call by expanding them to some alternative syntax. Cases which it doesn't
+optimize are handled by declining to expand, in which case the form remains
+as the original function call.
+
.TP* Example:
.cblk
@@ -30248,6 +30269,21 @@ macros to have any visibility to any surrounding lexical variable bindings,
which are only instantiated in the evaluation phase, after expansion is done
and macros no longer exist.
+A local macro defined using
+.code defmacro
+may decline to expand a macro form. Declining to expand is achieved by returning the original
+unexpanded form, which may be captured using the
+.code :form
+parameter. When a local macro declines to expand a form, the macro definition
+is temporarily hidden, as if it didn't exist in the lexical scope. If another
+macro of the same name is thereby revealed (a global macro or another local macro
+at a shallower nesting level), then an expansion is tried with that macro. If
+no such macro is revealed, or if a lexical function binding of that name is
+revealed, then no expansion takes place; the original form is taken as-is.
+When another macro is tried, the process repeats, resulting in a search which
+proceeds as far as possible through outer lexical scopes and finally the
+global scope.
+
.coNP Function @ macro-form-p
.synb
.mets (macro-form-p < obj <> [ env ])