+Then set up emacs to include the file as a mail header - there were a
+couple of suggestions here---either something like:
+
+@lisp
+(setq mail-default-headers
+ "X-Face: @email{Ugly looking text string here}")
+@end lisp
+
+Or, alternatively, as:
+
+@lisp
+(defun mail-insert-x-face ()
+ (save-excursion
+ (goto-char (point-min))
+ (search-forward mail-header-separator)
+ (beginning-of-line)
+ (insert "X-Face:")
+ (insert-file-contents "~/.face")))
+
+(add-hook 'mail-setup-hook 'mail-insert-x-face)
+@end lisp
+@end enumerate
+
+However, 2 things might be wrong:
+
+Some versions of pbmtoicon produces some header lines that is not
+expected by the version of compface that I grabbed. So I found I had to
+include a @code{tail +3} in the pipeline like this:
+
+@example
+cat file.xbm | xbm2ikon | tail +3 |compface > file.face
+@end example
+
+Some people have also found that if one uses the @code{(insert-file)}
+method, one should NOT quote the face string using the sed script .
+
+It might also be helpful to use @email{stig@@hackvan.com, Stig's} script
+xbm2face (included in the compface distribution at XEmacs.org) to do the
+conversion.
+
+Contributors for this item:
+
+Paul Emsley,
+Ricardo Marek,
+Amir J. Katz,
+Glen McCort,
+Heinz Uphoff,
+Peter Arius,
+Paul Harrison, and
+Vegard Vesterheim
+
+@unnumberedsec 6.1: Reading Mail with VM
+
+@node Q6.1.1, Q6.1.2, Q6.0.11, Internet
+@unnumberedsubsec Q6.1.1: How do I set up VM to retrieve mail from a remote site using POP?
+
+Use @code{vm-spool-files}, like this for example:
+
+@lisp
+(setq vm-spool-files '("/var/spool/mail/wing"
+ "netcom23.netcom.com:110:pass:wing:MYPASS"))
+@end lisp
+
+Of course substitute your actual password for MYPASS.
+
+@node Q6.1.2, Q6.1.3, Q6.1.1, Internet
+@unnumberedsubsec Q6.1.2: How can I get VM to automatically check for new mail?
+
+@email{turner@@lanl.gov, John Turner} writes:
+
+@quotation
+Use the following:
+
+@lisp
+(setq vm-auto-get-new-mail 60)
+@end lisp
+@end quotation
+
+@node Q6.1.3, Q6.1.4, Q6.1.2, Internet
+@unnumberedsubsec Q6.1.3: I have various addresses at which I receive mail. How can I tell VM to ignore them when doing a "reply-all"?
+
+Set @code{vm-reply-ignored-addresses} to a list, like
+
+@lisp
+(setq vm-reply-ignored-addresses
+ '("wing@@nuspl@@nvwls.cc.purdue.edu,netcom[0-9]*.netcom.com"
+ "wing@@netcom.com" "wing@@xemacs.org"))
+@end lisp
+
+Note that each string is a regular expression.
+
+@node Q6.1.4, Q6.1.5, Q6.1.3, Internet
+@unnumberedsubsec Q6.1.4: Is there a mailing list or FAQ for VM?
+
+A FAQ for VM exists at @uref{http://www.wonderworks.com/vm/FAQ.html}.
+
+VM has its own newsgroups gnu.emacs.vm.info and gnu.emacs.vm.bug.
+
+@node Q6.1.5, Q6.1.6, Q6.1.4, Internet
+@unnumberedsubsec Q6.1.5: How do I make VM stay in a single frame?
+
+John.@email{Cooper@@Eng.Sun.COM, John S Cooper} writes:
+
+@quotation
+@lisp
+ ; Don't use multiple frames
+(setq vm-frame-per-composition nil)
+(setq vm-frame-per-folder nil)
+(setq vm-frame-per-edit nil)
+(setq vm-frame-per-summary nil)
+@end lisp
+@end quotation
+
+@node Q6.1.6, Q6.2.1, Q6.1.5, Internet
+@unnumberedsubsec Q6.1.6: Customization of VM not covered in the manual, or here.
+
+@email{boffi@@hp735.stru.polimi.it, giacomo boffi} writes:
+
+@quotation
+The meta-answer is to look into the file @file{vm-vars.el}, in the vm
+directory of the lisp library.
+
+@file{vm-vars.el} contains, initializes and carefully describes, with
+examples of usage, the plethora of user options that @emph{fully}
+control VM's behavior.
+
+Enter vm-vars, @code{forward-search} for toolbar, find the variables
+that control the toolbar placement, appearance, existence, copy to your
+@file{init.el} or @file{.vm} and modify according to the
+detailed instructions.
+
+The above also applies to all the various features of VM: search for
+some keywords, maybe the first you conjure isn't appropriate, find the
+appropriate variables, copy and experiment.
+@end quotation
+
+@unnumberedsec 6.2: Reading Netnews and Mail with Gnus
+
+@node Q6.2.1, Q6.2.2, Q6.1.6, Internet
+@unnumberedsubsec Q6.2.1: GNUS, (ding) Gnus, Gnus 5, September Gnus, Red Gnus, Quassia Gnus, argh!
+
+The Gnus numbering issues are not meant for mere mortals to know them.
+If you feel you @emph{must} enter the muddy waters of Gnus, visit the
+excellent FAQ, maintained by Justin Sheehy, at:
+
+@example
+@uref{http://my.gnus.org/FAQ/}
+@end example
+
+See also Gnus home page
+@example
+@uref{http://www.gnus.org/}
+@end example
+
+@node Q6.2.2, Q6.3.1, Q6.2.1, Internet
+@unnumberedsubsec Q6.2.2: How do I make Gnus stay within a single frame?
+
+The toolbar code to start Gnus opens the new frame---and it's a feature
+rather than a bug. If you don't like it, but would still like to click
+on the seemly icon, use the following code:
+
+@lisp
+(defun toolbar-news ()
+ (gnus))
+@end lisp
+
+It will redefine the callback function of the icon to just call
+@code{gnus}, without all the fancy frame stuff.
+
+@unnumberedsec 6.3: FTP Access
+
+@node Q6.3.1, Q6.3.2, Q6.2.2, Internet
+@unnumberedsubsec Q6.3.1: Can I edit files on other hosts?
+
+Yes. Of course XEmacs can use any network file system (such as NFS or
+Windows file sharing) you have available, and includes some
+optimizations and safety features appropriate to those environments.
+
+It is also possible to transparently edit files via FTP, ssh, or rsh. That
+is, XEmacs makes a local copy using the transport in the background, and
+automatically refreshes the remote original from that copy when you save
+it. XEmacs also is capable of doing file system manipulations like
+creating and removing directories and files. The FTP interface is
+provided by the standard @samp{efs} package @ref{Top, EFS, , efs}. The
+ssh/rsh interface is provided by the optional @samp{tramp} package
+@ref{Top, TRAMP, , tramp}.
+
+@node Q6.3.2, Q6.4.1, Q6.3.1, Internet
+@unnumberedsubsec Q6.3.2: What is EFS?
+
+#### Write me.
+
+@unnumberedsec 6.4: Web Browsing with W3
+
+@node Q6.4.1, Q6.4.2, Q6.3.2, Internet
+@unnumberedsubsec Q6.4.1: What is W3?
+
+W3 is an advanced graphical browser written in Emacs lisp that runs on
+XEmacs. It has full support for cascaded style sheets, and more...
+
+It has a home web page at
+@uref{http://www.cs.indiana.edu/elisp/w3/docs.html}.
+
+@node Q6.4.2, Q6.4.3, Q6.4.1, Internet
+@unnumberedsubsec Q6.4.2: How do I run W3 from behind a firewall?
+
+There is a long, well-written, detailed section in the W3 manual that
+describes how to do this. Look in the section entitled "Firewalls".
+
+@node Q6.4.3, , Q6.4.2, Internet
+@unnumberedsubsec Q6.4.3: Is it true that W3 supports style sheets and tables?
+
+Yes, and much more. W3, as distributed with the latest XEmacs is a
+full-featured web browser.
+
+@node Advanced, Other Packages, Internet, Top
+@unnumbered 7 Advanced Customization Using XEmacs Lisp
+
+This is part 7 of the XEmacs Frequently Asked Questions list. This
+section is devoted to advanced customization using XEmacs Lisp.
+
+@menu
+7.0: Emacs Lisp and @file{init.el}
+* Q7.0.1:: What version of Emacs am I running?
+* Q7.0.2:: How can I evaluate Emacs-Lisp expressions?
+* Q7.0.3:: @code{(setq tab-width 6)} behaves oddly.
+* Q7.0.4:: How can I add directories to the @code{load-path}?
+* Q7.0.5:: How to check if a lisp function is defined?
+* Q7.0.6:: Can I force the output of @code{(face-list)} to a buffer?
+
+7.1: Emacs Lisp Programming Techniques
+* Q7.1.1:: What is the difference in key sequences between XEmacs and GNU Emacs?
+* Q7.1.2:: Can I generate "fake" keyboard events?
+* Q7.1.3:: Could you explain @code{read-kbd-macro} in more detail?
+* Q7.1.4:: What is the performance hit of @code{let}?
+* Q7.1.5:: What is the recommended use of @code{setq}?
+* Q7.1.6:: What is the typical misuse of @code{setq}?
+* Q7.1.7:: I like the @code{do} form of cl, does it slow things down?
+* Q7.1.8:: I like recursion, does it slow things down?
+* Q7.1.9:: How do I put a glyph as annotation in a buffer?
+* Q7.1.10:: @code{map-extents} won't traverse all of my extents!
+* Q7.1.11:: My elisp program is horribly slow. Is there an easy way to find out where it spends time?
+
+7.2: Mathematics
+* Q7.2.1:: What are bignums, ratios, and bigfloats in Lisp?
+* Q7.2.2:: XEmacs segfaults when I use very big numbers!
+* Q7.2.3:: Bignums are really slow!
+* Q7.2.4:: Equal bignums don't compare as equal! What gives?
+@end menu
+
+@unnumberedsec 7.0: Emacs Lisp and @file{init.el}
+
+@node Q7.0.1, Q7.0.2, Advanced, Advanced
+@unnumberedsubsec Q7.0.1: What version of Emacs am I running?
+
+How can @file{init.el} determine which of the family of
+Emacsen I am using?
+
+To determine if you are currently running GNU Emacs 18, GNU Emacs 19,
+XEmacs 19, XEmacs 20, or Epoch, and use appropriate code, check out the
+example given in @file{etc/sample.init.el} (@file{etc/sample.emacs} in
+XEmacs versions prior to 21.4). There are other nifty things in there
+as well!
+
+For all new code, all you really need to do is:
+
+@lisp
+(defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version))
+@end lisp
+
+@node Q7.0.2, Q7.0.3, Q7.0.1, Advanced
+@unnumberedsubsec Q7.0.2: How can I evaluate Emacs-Lisp expressions?
+
+I know I can evaluate Elisp expressions from @code{*scratch*} buffer
+with @kbd{C-j} after the expression. How do I do it from another
+buffer?
+
+Press @kbd{M-:} (the default binding of @code{eval-expression}), and
+enter the expression to the minibuffer.
+
+@node Q7.0.3, Q7.0.4, Q7.0.2, Advanced
+@unnumberedsubsec Q7.0.3: @code{(setq tab-width 6)} behaves oddly.
+
+If you put @code{(setq tab-width 6)} in your
+@file{init.el} file it does not work! Is there a reason
+for this? If you do it at the EVAL prompt it works fine!! How strange.
+
+Use @code{setq-default} instead, since @code{tab-width} is
+all-buffer-local.
+
+@node Q7.0.4, Q7.0.5, Q7.0.3, Advanced
+@unnumberedsubsec Q7.0.4: How can I add directories to the @code{load-path}?
+
+Here are two ways to do that, one that puts your directories at the
+front of the load-path, the other at the end:
+
+@lisp
+;;; Add things at the beginning of the load-path, do not add
+;;; duplicate directories:
+(pushnew "bar" load-path :test 'equal)
+
+(pushnew "foo" load-path :test 'equal)
+
+;;; Add things at the end, unconditionally
+(setq load-path (nconc load-path '("foo" "bar")))
+@end lisp
+
+@email{keithh@@nortel.ca, keith (k.p.) hanlan} writes:
+
+@quotation
+To add directories using Unix shell metacharacters use
+@file{expand-file-name} like this:
+
+@lisp
+(push (expand-file-name "~keithh/.emacsdir") load-path)
+@end lisp
+@end quotation
+
+@node Q7.0.5, Q7.0.6, Q7.0.4, Advanced
+@unnumberedsubsec Q7.0.5: How to check if a lisp function is defined?
+
+Use the following elisp:
+
+@lisp
+(fboundp 'foo)
+@end lisp
+
+It's almost always a mistake to test @code{emacs-version} or any similar
+variables.
+
+Instead, use feature-tests, such as @code{featurep}, @code{boundp},
+@code{fboundp}, or even simple behavioral tests, eg.:
+
+@lisp
+(defvar foo-old-losing-code-p
+ (condition-case nil (progn (losing-code t) nil)
+ (wrong-number-of-arguments t)))
+@end lisp
+
+There is an incredible amount of broken code out there which could work
+much better more often in more places if it did the above instead of
+trying to divine its environment from the value of one variable.
+
+@node Q7.0.6, Q7.1.1, Q7.0.5, Advanced
+@unnumberedsubsec Q7.0.6: Can I force the output of @code{(face-list)} to a buffer?
+
+It would be good having it in a buffer, as the output of
+@code{(face-list)} is too wide to fit to a minibuffer.
+
+Evaluate the expression in the @samp{*scratch*} buffer with point after
+the rightmost paren and typing @kbd{C-j}.
+
+If the minibuffer smallness is the only problem you encounter, you can
+simply press @kbd{C-h l} to get the former minibuffer contents in a
+buffer.
+
+@unnumberedsec 7.1: Emacs Lisp Programming Techniques
+
+@node Q7.1.1, Q7.1.2, Q7.0.6, Advanced
+@unnumberedsubsec Q7.1.1: What is the difference in key sequences between XEmacs and GNU Emacs?
+
+@email{clerik@@naggum.no, Erik Naggum} writes;
+
+@quotation
+Emacs has a legacy of keyboards that produced characters with modifier
+bits, and therefore map a variety of input systems into this scheme even
+today. XEmacs is instead optimized for X events. This causes an
+incompatibility in the way key sequences are specified, but both Emacs
+and XEmacs will accept a key sequence as a vector of lists of modifiers
+that ends with a key, e.g., to bind @kbd{M-C-a}, you would say
+@code{[(meta control a)]} in both Emacsen. XEmacs has an abbreviated
+form for a single key, just (meta control a). Emacs has an abbreviated
+form for the Control and the Meta modifiers to string-characters (the
+ASCII characters), as in @samp{\M-\C-a}. XEmacs users need to be aware
+that the abbreviated form works only for one-character key sequences,
+while Emacs users need to be aware that the string-character is rather
+limited. Specifically, the string-character can accommodate only 256
+different values, 128 of which have the Meta modifier and 128 of which
+have not. In each of these blocks, only 32 characters have the Control
+modifier. Whereas @code{[(meta control A)]} differs from @code{[(meta
+control a)]} because the case differs, @samp{\M-\C-a} and @samp{\M-\C-A}
+do not. Programmers are advised to use the full common form, both
+because it is more readable and less error-prone, and because it is
+supported by both Emacsen.
+@end quotation
+
+Another (even safer) way to be sure of the key-sequences is to use the
+@code{read-kbd-macro} function, which takes a string like @samp{C-c
+<up>}, and converts it to the internal key representation of the Emacs
+you use. The function is available both on XEmacs and GNU Emacs.
+
+@node Q7.1.2, Q7.1.3, Q7.1.1, Advanced
+@unnumberedsubsec Q7.1.2: Can I generate "fake" keyboard events?
+
+I wonder if there is an interactive function that can generate
+@dfn{fake} keyboard events. This way, I could simply map them inside
+XEmacs.
+
+This seems to work:
+
+@lisp
+(defun cg--generate-char-event (ch)
+ "Generate an event, as if ch has been typed"
+ (dispatch-event (character-to-event ch)))
+
+;; Backspace and Delete stuff
+(global-set-key [backspace]
+ (lambda () (interactive) (cg--generate-char-event 127)))
+(global-set-key [unknown_keysym_0x4]
+ (lambda () (interactive) (cg--generate-char-event 4)))
+@end lisp
+
+@node Q7.1.3, Q7.1.4, Q7.1.2, Advanced
+@unnumberedsubsec Q7.1.3: Could you explain @code{read-kbd-macro} in more detail?
+
+The @code{read-kbd-macro} function returns the internal Emacs
+representation of a human-readable string (which is its argument).
+Thus:
+
+@lisp
+(read-kbd-macro "C-c C-a")
+@result{} [(control ?c) (control ?a)]
+
+(read-kbd-macro "C-c C-. <up>")
+@result{} [(control ?c) (control ?.) up]
+@end lisp
+
+In GNU Emacs the same forms will be evaluated to what GNU Emacs
+understands internally---the sequences @code{"\C-x\C-c"} and @code{[3
+67108910 up]}, respectively.
+
+The exact @dfn{human-readable} syntax is defined in the docstring of
+@code{edmacro-mode}. I'll repeat it here, for completeness.
+
+@quotation
+Format of keyboard macros during editing:
+
+Text is divided into @dfn{words} separated by whitespace. Except for
+the words described below, the characters of each word go directly as
+characters of the macro. The whitespace that separates words is
+ignored. Whitespace in the macro must be written explicitly, as in
+@kbd{foo @key{SPC} bar @key{RET}}.
+
+@itemize @bullet
+@item
+The special words @kbd{RET}, @kbd{SPC}, @kbd{TAB}, @kbd{DEL}, @kbd{LFD},
+@kbd{ESC}, and @kbd{NUL} represent special control characters. The
+words must be written in uppercase.
+
+@item
+A word in angle brackets, e.g., @code{<return>}, @code{<down>}, or
+@code{<f1>}, represents a function key. (Note that in the standard
+configuration, the function key @code{<return>} and the control key
+@key{RET} are synonymous.) You can use angle brackets on the words
+@key{RET}, @key{SPC}, etc., but they are not required there.
+
+@item
+Keys can be written by their @sc{ascii} code, using a backslash followed
+by up to six octal digits. This is the only way to represent keys with
+codes above \377.
+
+@item
+One or more prefixes @kbd{M-} (meta), @kbd{C-} (control), @kbd{S-}
+(shift), @kbd{A-} (alt), @kbd{H-} (hyper), and @kbd{s-} (super) may
+precede a character or key notation. For function keys, the prefixes
+may go inside or outside of the brackets: @code{C-<down>} @equiv{}
+@code{<C-down>}. The prefixes may be written in any order: @kbd{M-C-x}
+@equiv{} @kbd{C-M-x}.
+
+Prefixes are not allowed on multi-key words, e.g., @kbd{C-abc}, except
+that the Meta prefix is allowed on a sequence of digits and optional
+minus sign: @kbd{M--123} @equiv{} @kbd{M-- M-1 M-2 M-3}.
+
+@item
+The @code{^} notation for control characters also works: @kbd{^M}
+@equiv{} @kbd{C-m}.
+
+@item
+Double angle brackets enclose command names: @code{<<next-line>>} is
+shorthand for @kbd{M-x next-line @key{RET}}.
+
+@item
+Finally, @code{REM} or @code{;;} causes the rest of the line to be
+ignored as a comment.
+@end itemize
+
+Any word may be prefixed by a multiplier in the form of a decimal number
+and @code{*}: @code{3*<right>} @equiv{} @code{<right> <right> <right>},
+and @code{10*foo} @equiv{}
+@iftex
+@*
+@end iftex
+@code{foofoofoofoofoofoofoofoofoofoo}.
+
+Multiple text keys can normally be strung together to form a word, but
+you may need to add whitespace if the word would look like one of the
+above notations: @code{; ; ;} is a keyboard macro with three semicolons,
+but @code{;;;} is a comment. Likewise, @code{\ 1 2 3} is four keys but
+@code{\123} is a single key written in octal, and @code{< right >} is
+seven keys but @code{<right>} is a single function key. When in doubt,
+use whitespace.
+@end quotation
+
+@node Q7.1.4, Q7.1.5, Q7.1.3, Advanced
+@unnumberedsubsec Q7.1.4: What is the performance hit of @code{let}?
+
+In most cases, not noticeable. Besides, there's no avoiding
+@code{let}---you have to bind your local variables, after all. Some
+pose a question whether to nest @code{let}s, or use one @code{let} per
+function. I think because of clarity and maintenance (and possible
+future implementation), @code{let}-s should be used (nested) in a way to
+provide the clearest code.
+
+@node Q7.1.5, Q7.1.6, Q7.1.4, Advanced
+@unnumberedsubsec Q7.1.5: What is the recommended use of @code{setq}?
+
+@itemize @bullet
+@item Global variables
+
+You will typically @code{defvar} your global variable to a default
+value, and use @code{setq} to set it later.
+
+It is never a good practice to @code{setq} user variables (like
+@code{case-fold-search}, etc.), as it ignores the user's choice
+unconditionally. Note that @code{defvar} doesn't change the value of a
+variable if it was bound previously. If you wish to change a
+user-variable temporarily, use @code{let}:
+
+@lisp
+(let ((case-fold-search nil))
+ ... ; code with searches that must be case-sensitive
+ ...)
+@end lisp
+
+You will notice the user-variables by their docstrings beginning with an
+asterisk (a convention).
+
+@item Local variables
+
+Bind them with @code{let}, which will unbind them (or restore their
+previous value, if they were bound) after exiting from the @code{let}
+form. Change the value of local variables with @code{setq} or whatever
+you like (e.g. @code{incf}, @code{setf} and such). The @code{let} form
+can even return one of its local variables.
+
+Typical usage:
+
+@lisp
+;; iterate through the elements of the list returned by
+;; `hairy-function-that-returns-list'
+(let ((l (hairy-function-that-returns-list)))
+ (while l
+ ... do something with (car l) ...
+ (setq l (cdr l))))
+@end lisp
+
+Another typical usage includes building a value simply to work with it.
+
+@lisp
+;; Build the mode keymap out of the key-translation-alist
+(let ((inbox (file-truename (expand-file-name box)))
+ (i 0))
+ ... code dealing with inbox ...
+ inbox)
+@end lisp
+
+This piece of code uses the local variable @code{inbox}, which becomes
+unbound (or regains old value) after exiting the form. The form also
+returns the value of @code{inbox}, which can be reused, for instance:
+
+@lisp
+(setq foo-processed-inbox
+ (let .....))
+@end lisp
+@end itemize
+
+@node Q7.1.6, Q7.1.7, Q7.1.5, Advanced
+@unnumberedsubsec Q7.1.6: What is the typical misuse of @code{setq}?
+
+A typical misuse is probably @code{setq}ing a variable that was meant to
+be local. Such a variable will remain bound forever, never to be
+garbage-collected. For example, the code doing:
+
+@lisp
+(defun my-function (whatever)
+ (setq a nil)
+ ... build a large list ...
+ ... and exit ...)
+@end lisp
+
+does a bad thing, as @code{a} will keep consuming memory, never to be
+unbound. The correct thing is to do it like this:
+
+@lisp
+(defun my-function (whatever)
+ (let (a) ; default initialization is to nil
+ ... build a large list ...
+ ... and exit, unbinding `a' in the process ...)
+@end lisp
+
+Not only is this prettier syntactically, but it makes it possible for
+Emacs to garbage-collect the objects which @code{a} used to reference.
+
+Note that even global variables should not be @code{setq}ed without
+@code{defvar}ing them first, because the byte-compiler issues warnings.
+The reason for the warning is the following:
+
+@lisp
+(defun flurgoze nil) ; ok, global internal variable
+...
+
+(setq flurghoze t) ; ops! a typo, but semantically correct.
+ ; however, the byte-compiler warns.
+
+While compiling toplevel forms:
+** assignment to free variable flurghoze
+@end lisp
+
+@node Q7.1.7, Q7.1.8, Q7.1.6, Advanced
+@unnumberedsubsec Q7.1.7: I like the @code{do} form of cl, does it slow things down?
+
+It shouldn't. Here is what Dave Gillespie has to say about cl.el
+performance:
+
+@quotation
+Many of the advanced features of this package, such as @code{defun*},
+@code{loop}, and @code{setf}, are implemented as Lisp macros. In
+byte-compiled code, these complex notations will be expanded into
+equivalent Lisp code which is simple and efficient. For example, the
+forms
+
+@lisp
+(incf i n)
+(push x (car p))
+@end lisp
+
+are expanded at compile-time to the Lisp forms
+
+@lisp
+(setq i (+ i n))
+(setcar p (cons x (car p)))
+@end lisp
+
+which are the most efficient ways of doing these respective operations
+in Lisp. Thus, there is no performance penalty for using the more
+readable @code{incf} and @code{push} forms in your compiled code.
+
+@emph{Interpreted} code, on the other hand, must expand these macros
+every time they are executed. For this reason it is strongly
+recommended that code making heavy use of macros be compiled. (The
+features labelled @dfn{Special Form} instead of @dfn{Function} in this
+manual are macros.) A loop using @code{incf} a hundred times will
+execute considerably faster if compiled, and will also garbage-collect
+less because the macro expansion will not have to be generated, used,
+and thrown away a hundred times.