-This is ../info/lispref.info, produced by makeinfo version 4.0 from
+This is ../info/lispref.info, produced by makeinfo version 4.6 from
lispref/lispref.texi.
INFO-DIR-SECTION XEmacs Editor
* Copying:: Conditions for copying and changing XEmacs.
* Introduction:: Introduction and conventions used.
+* Packaging:: Lisp library administrative infrastructure.
+
* Lisp Data Types:: Data types of objects in XEmacs Lisp.
* Numbers:: Numbers and arithmetic functions.
* Strings and Characters:: Strings, and functions that work on them.
* A Sample Function Description::
* A Sample Variable Description::
+Packaging
+
+* Package Overview:: Lisp Libraries and Packages.
+* Package Terminology:: Basic stuff.
+* Building Packages:: Turn packaged source into a tarball.
+* Local.rules File:: Tell the XEmacs Packaging System about your host.
+* Creating Packages:: Tell the XEmacs Packaging System about your package.
+* Issues::
+
+Package Overview
+
+* The User View::
+* The Library Maintainer View::
+* The Package Release Engineer View::
+
+The Library Maintainer's View
+
+* Infrastructure:: Global Makefiles and common rules.
+* Control Files:: Package-specific Makefiles and administrative files.
+* Obtaining:: Obtaining the XEmacs Packaging System and utilities.
+
+Creating Packages
+
+* package-info.in:: package-info.in
+* Makefile:: `Makefile'
+* Makefile Targets::
+
Lisp Data Types
* Printed Representation:: How Lisp objects are represented as text.
* Retrieving Specifications:: Querying a specifier's specifications.
* Specifier Instancing Functions::
Functions to instance a specifier.
-* Specifier Example:: Making all this stuff clearer.
+* Specifier Examples:: Making all this stuff clearer.
* Creating Specifiers:: Creating specifiers for your own use.
* Specifier Validation Functions::
Validating the components of a specifier.
* Redisplay Glyphs:: Glyphs controlling various redisplay functions.
* Subwindows:: Inserting an externally-controlled subwindow
into a buffer.
+* Glyph Examples:: Examples of how to work with glyphs.
Glyph Functions
* Pure Storage:: A kludge to make preloaded Lisp functions sharable.
* Garbage Collection:: Reclaiming space for Lisp objects no longer used.
+\1f
+File: lispref.info, Node: Copying, Next: Introduction, Prev: Top, Up: Top
+
+GNU GENERAL PUBLIC LICENSE
+**************************
+
+ Version 2, June 1991
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+=============================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
+ Copyright (C) 19YY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'. This is free software, and you are welcome
+ to redistribute it under certain conditions; type `show c'
+ for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright
+ interest in the program `Gnomovision'
+ (which makes passes at compilers) written
+ by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+\1f
+File: lispref.info, Node: Introduction, Next: Packaging, Prev: Copying, Up: Top
+
+Introduction
+************
+
+Most of the XEmacs text editor is written in the programming language
+called XEmacs Lisp. You can write new code in XEmacs Lisp and install
+it as an extension to the editor. However, XEmacs Lisp is more than a
+mere "extension language"; it is a full computer programming language
+in its own right. You can use it as you would any other programming
+language.
+
+ Because XEmacs Lisp is designed for use in an editor, it has special
+features for scanning and parsing text as well as features for handling
+files, buffers, displays, subprocesses, and so on. XEmacs Lisp is
+closely integrated with the editing facilities; thus, editing commands
+are functions that can also conveniently be called from Lisp programs,
+and parameters for customization are ordinary Lisp variables.
+
+ This manual describes XEmacs Lisp, presuming considerable familiarity
+with the use of XEmacs for editing. (See `The XEmacs Reference
+Manual', for this basic information.) Generally speaking, the earlier
+chapters describe features of XEmacs Lisp that have counterparts in many
+programming languages, and later chapters describe features that are
+peculiar to XEmacs Lisp or relate specifically to editing.
+
+ This is edition 3.3.
+
+* Menu:
+
+* Caveats:: Flaws and a request for help.
+* Lisp History:: XEmacs Lisp is descended from Maclisp.
+* Conventions:: How the manual is formatted.
+* Acknowledgements:: The authors, editors, and sponsors of this manual.
+
+\1f
+File: lispref.info, Node: Caveats, Next: Lisp History, Up: Introduction
+
+Caveats
+=======
+
+This manual has gone through numerous drafts. It is nearly complete
+but not flawless. There are a few topics that are not covered, either
+because we consider them secondary (such as most of the individual
+modes) or because they are yet to be written. Because we are not able
+to deal with them completely, we have left out several parts
+intentionally.
+
+ The manual should be fully correct in what it does cover, and it is
+therefore open to criticism on anything it says--from specific examples
+and descriptive text, to the ordering of chapters and sections. If
+something is confusing, or you find that you have to look at the sources
+or experiment to learn something not covered in the manual, then perhaps
+the manual should be fixed. Please let us know.
+
+ As you use this manual, we ask that you send corrections as soon as
+you find them. If you think of a simple, real life example for a
+function or group of functions, please make an effort to write it up
+and send it in. Please reference any comments to the node name and
+function or variable name, as appropriate. Also state the number of
+the edition which you are criticizing.
+
+ This manual was originally written for FSF Emacs 19 and was updated
+by Ben Wing (ben@xemacs.org) for Lucid Emacs 19.10 and later for XEmacs
+19.12, 19.13, 19.14, and 20.0. It was further updated by the XEmacs
+Development Team for 19.15 and 20.1. Please send comments and
+corrections relating to XEmacs-specific portions of this manual to
+ xemacs@xemacs.org
+
+ or post to the newsgroup
+ comp.emacs.xemacs
+
+ --Ben Wing
+
+\1f
+File: lispref.info, Node: Lisp History, Next: Conventions, Prev: Caveats, Up: Introduction
+
+Lisp History
+============
+
+Lisp (LISt Processing language) was first developed in the late 1950's
+at the Massachusetts Institute of Technology for research in artificial
+intelligence. The great power of the Lisp language makes it superior
+for other purposes as well, such as writing editing commands.
+
+ Dozens of Lisp implementations have been built over the years, each
+with its own idiosyncrasies. Many of them were inspired by Maclisp,
+which was written in the 1960's at MIT's Project MAC. Eventually the
+implementors of the descendants of Maclisp came together and developed a
+standard for Lisp systems, called Common Lisp.
+
+ XEmacs Lisp is largely inspired by Maclisp, and a little by Common
+Lisp. If you know Common Lisp, you will notice many similarities.
+However, many of the features of Common Lisp have been omitted or
+simplified in order to reduce the memory requirements of XEmacs.
+Sometimes the simplifications are so drastic that a Common Lisp user
+might be very confused. We will occasionally point out how XEmacs Lisp
+differs from Common Lisp. If you don't know Common Lisp, don't worry
+about it; this manual is self-contained.
+
+\1f
+File: lispref.info, Node: Conventions, Next: Acknowledgements, Prev: Lisp History, Up: Introduction
+
+Conventions
+===========
+
+This section explains the notational conventions that are used in this
+manual. You may want to skip this section and refer back to it later.
+
+* Menu:
+
+* Some Terms:: Explanation of terms we use in this manual.
+* nil and t:: How the symbols `nil' and `t' are used.
+* Evaluation Notation:: The format we use for examples of evaluation.
+* Printing Notation:: The format we use for examples that print output.
+* Error Messages:: The format we use for examples of errors.
+* Buffer Text Notation:: The format we use for buffer contents in examples.
+* Format of Descriptions:: Notation for describing functions, variables, etc.
+
+\1f
+File: lispref.info, Node: Some Terms, Next: nil and t, Up: Conventions
+
+Some Terms
+----------
+
+Throughout this manual, the phrases "the Lisp reader" and "the Lisp
+printer" are used to refer to those routines in Lisp that convert
+textual representations of Lisp objects into actual Lisp objects, and
+vice versa. *Note Printed Representation::, for more details. You, the
+person reading this manual, are thought of as "the programmer" and are
+addressed as "you". "The user" is the person who uses Lisp programs,
+including those you write.
+
+ Examples of Lisp code appear in this font or form: `(list 1 2 3)'.
+Names that represent arguments or metasyntactic variables appear in
+this font or form: FIRST-NUMBER.
+
+\1f
+File: lispref.info, Node: nil and t, Next: Evaluation Notation, Prev: Some Terms, Up: Conventions
+
+`nil' and `t'
+-------------
+
+In Lisp, the symbol `nil' has three separate meanings: it is a symbol
+with the name `nil'; it is the logical truth value FALSE; and it is the
+empty list--the list of zero elements. When used as a variable, `nil'
+always has the value `nil'.
+
+ As far as the Lisp reader is concerned, `()' and `nil' are
+identical: they stand for the same object, the symbol `nil'. The
+different ways of writing the symbol are intended entirely for human
+readers. After the Lisp reader has read either `()' or `nil', there is
+no way to determine which representation was actually written by the
+programmer.
+
+ In this manual, we use `()' when we wish to emphasize that it means
+the empty list, and we use `nil' when we wish to emphasize that it
+means the truth value FALSE. That is a good convention to use in Lisp
+programs also.
+
+ (cons 'foo ()) ; Emphasize the empty list
+ (not nil) ; Emphasize the truth value FALSE
+
+ In contexts where a truth value is expected, any non-`nil' value is
+considered to be TRUE. However, `t' is the preferred way to represent
+the truth value TRUE. When you need to choose a value which represents
+TRUE, and there is no other basis for choosing, use `t'. The symbol
+`t' always has value `t'.
+
+ In XEmacs Lisp, `nil' and `t' are special symbols that always
+evaluate to themselves. This is so that you do not need to quote them
+to use them as constants in a program. An attempt to change their
+values results in a `setting-constant' error. *Note Accessing
+Variables::.
+
+\1f
+File: lispref.info, Node: Evaluation Notation, Next: Printing Notation, Prev: nil and t, Up: Conventions
+
+Evaluation Notation
+-------------------
+
+A Lisp expression that you can evaluate is called a "form". Evaluating
+a form always produces a result, which is a Lisp object. In the
+examples in this manual, this is indicated with `=>':
+
+ (car '(1 2))
+ => 1
+
+You can read this as "`(car '(1 2))' evaluates to 1".
+
+ When a form is a macro call, it expands into a new form for Lisp to
+evaluate. We show the result of the expansion with `==>'. We may or
+may not show the actual result of the evaluation of the expanded form.
+
+ (news-cadr '(a b c))
+ ==> (car (cdr '(a b c)))
+ => b
+
+ Sometimes to help describe one form we show another form that
+produces identical results. The exact equivalence of two forms is
+indicated with `=='.
+
+ (cons 'a nil) == (list 'a)
+
+\1f
+File: lispref.info, Node: Printing Notation, Next: Error Messages, Prev: Evaluation Notation, Up: Conventions
+
+Printing Notation
+-----------------
+
+Many of the examples in this manual print text when they are evaluated.
+If you execute example code in a Lisp Interaction buffer (such as the
+buffer `*scratch*'), the printed text is inserted into the buffer. If
+you execute the example by other means (such as by evaluating the
+function `eval-region'), the printed text is displayed in the echo
+area. You should be aware that text displayed in the echo area is
+truncated to a single line.
+
+ Examples in this manual indicate printed text with `-|',
+irrespective of where that text goes. The value returned by evaluating
+the form (here `bar') follows on a separate line.
+
+ (progn (print 'foo) (print 'bar))
+ -| foo
+ -| bar
+ => bar
+
+\1f
+File: lispref.info, Node: Error Messages, Next: Buffer Text Notation, Prev: Printing Notation, Up: Conventions
+
+Error Messages
+--------------
+
+Some examples signal errors. This normally displays an error message
+in the echo area. We show the error message on a line starting with
+`error-->'. Note that `error-->' itself does not appear in the echo
+area.
+
+ (+ 23 'x)
+ error--> Wrong type argument: integer-or-marker-p, x
+
+\1f
+File: lispref.info, Node: Buffer Text Notation, Next: Format of Descriptions, Prev: Error Messages, Up: Conventions
+
+Buffer Text Notation
+--------------------
+
+Some examples show modifications to text in a buffer, with "before" and
+"after" versions of the text. These examples show the contents of the
+buffer in question between two lines of dashes containing the buffer
+name. In addition, `-!-' indicates the location of point. (The symbol
+for point, of course, is not part of the text in the buffer; it
+indicates the place _between_ two characters where point is located.)
+
+ ---------- Buffer: foo ----------
+ This is the -!-contents of foo.
+ ---------- Buffer: foo ----------
+
+ (insert "changed ")
+ => nil
+ ---------- Buffer: foo ----------
+ This is the changed -!-contents of foo.
+ ---------- Buffer: foo ----------
+
+\1f
+File: lispref.info, Node: Format of Descriptions, Prev: Buffer Text Notation, Up: Conventions
+
+Format of Descriptions
+----------------------
+
+Functions, variables, macros, commands, user options, and special forms
+are described in this manual in a uniform format. The first line of a
+description contains the name of the item followed by its arguments, if
+any. The category--function, variable, or whatever--appears at the
+beginning of the line. The description follows on succeeding lines,
+sometimes with examples.
+
+* Menu:
+
+* A Sample Function Description:: A description of an imaginary
+ function, `foo'.
+* A Sample Variable Description:: A description of an imaginary
+ variable,
+ `electric-future-map'.
+
+\1f
+File: lispref.info, Node: A Sample Function Description, Next: A Sample Variable Description, Up: Format of Descriptions
+
+A Sample Function Description
+.............................
+
+In a function description, the name of the function being described
+appears first. It is followed on the same line by a list of parameters.
+The names used for the parameters are also used in the body of the
+description.
+
+ The appearance of the keyword `&optional' in the parameter list
+indicates that the arguments for subsequent parameters may be omitted
+(omitted parameters default to `nil'). Do not write `&optional' when
+you call the function.
+
+ The keyword `&rest' (which will always be followed by a single
+parameter) indicates that any number of arguments can follow. The value
+of the single following parameter will be a list of all these arguments.
+Do not write `&rest' when you call the function.
+
+ Here is a description of an imaginary function `foo':
+
+ - Function: foo integer1 &optional integer2 &rest integers
+ The function `foo' subtracts INTEGER1 from INTEGER2, then adds all
+ the rest of the arguments to the result. If INTEGER2 is not
+ supplied, then the number 19 is used by default.
+
+ (foo 1 5 3 9)
+ => 16
+ (foo 5)
+ => 14
+
+ More generally,
+
+ (foo W X Y...)
+ ==
+ (+ (- X W) Y...)
+
+ Any parameter whose name contains the name of a type (e.g., INTEGER,
+INTEGER1 or BUFFER) is expected to be of that type. A plural of a type
+(such as BUFFERS) often means a list of objects of that type.
+Parameters named OBJECT may be of any type. (*Note Lisp Data Types::,
+for a list of XEmacs object types.) Parameters with other sorts of
+names (e.g., NEW-FILE) are discussed specifically in the description of
+the function. In some sections, features common to parameters of
+several functions are described at the beginning.
+
+ *Note Lambda Expressions::, for a more complete description of
+optional and rest arguments.
+
+ Command, macro, and special form descriptions have the same format,
+but the word `Function' is replaced by `Command', `Macro', or `Special
+Form', respectively. Commands are simply functions that may be called
+interactively; macros process their arguments differently from functions
+(the arguments are not evaluated), but are presented the same way.
+
+ Special form descriptions use a more complex notation to specify
+optional and repeated parameters because they can break the argument
+list down into separate arguments in more complicated ways.
+``[OPTIONAL-ARG]'' means that OPTIONAL-ARG is optional and
+`REPEATED-ARGS...' stands for zero or more arguments. Parentheses are
+used when several arguments are grouped into additional levels of list
+structure. Here is an example:
+
+ - Special Form: count-loop (VAR [FROM TO [INC]]) BODY...
+ This imaginary special form implements a loop that executes the
+ BODY forms and then increments the variable VAR on each iteration.
+ On the first iteration, the variable has the value FROM; on
+ subsequent iterations, it is incremented by 1 (or by INC if that
+ is given). The loop exits before executing BODY if VAR equals TO.
+ Here is an example:
+
+ (count-loop (i 0 10)
+ (prin1 i) (princ " ")
+ (prin1 (aref vector i)) (terpri))
+
+ If FROM and TO are omitted, then VAR is bound to `nil' before the
+ loop begins, and the loop exits if VAR is non-`nil' at the
+ beginning of an iteration. Here is an example:
+
+ (count-loop (done)
+ (if (pending)
+ (fixit)
+ (setq done t)))
+
+ In this special form, the arguments FROM and TO are optional, but
+ must both be present or both absent. If they are present, INC may
+ optionally be specified as well. These arguments are grouped with
+ the argument VAR into a list, to distinguish them from BODY, which
+ includes all remaining elements of the form.
+
+\1f
+File: lispref.info, Node: A Sample Variable Description, Prev: A Sample Function Description, Up: Format of Descriptions
+
+A Sample Variable Description
+.............................
+
+A "variable" is a name that can hold a value. Although any variable
+can be set by the user, certain variables that exist specifically so
+that users can change them are called "user options". Ordinary
+variables and user options are described using a format like that for
+functions except that there are no arguments.
+
+ Here is a description of the imaginary `electric-future-map'
+variable.
+
+ - Variable: electric-future-map
+ The value of this variable is a full keymap used by Electric
+ Command Future mode. The functions in this map allow you to edit
+ commands you have not yet thought about executing.
+
+ User option descriptions have the same format, but `Variable' is
+replaced by `User Option'.
+
+\1f
+File: lispref.info, Node: Acknowledgements, Prev: Conventions, Up: Introduction
+
+Acknowledgements
+================
+
+This manual was based on the GNU Emacs Lisp Reference Manual, version
+2.4, written by Robert Krawitz, Bil Lewis, Dan LaLiberte, Richard M.
+Stallman and Chris Welty, the volunteers of the GNU manual group, in an
+effort extending over several years. Robert J. Chassell helped to
+review and edit the manual, with the support of the Defense Advanced
+Research Projects Agency, ARPA Order 6082, arranged by Warren A. Hunt,
+Jr. of Computational Logic, Inc.
+
+ Ben Wing adapted this manual for XEmacs 19.14 and 20.0, and earlier
+for Lucid Emacs 19.10, XEmacs 19.12, and XEmacs 19.13. He is the sole
+author of many of the manual sections, in particular the XEmacs-specific
+sections: events, faces, extents, glyphs, specifiers, toolbar, menubars,
+scrollbars, dialog boxes, devices, consoles, hash tables, range tables,
+char tables, databases, and others. The section on annotations was
+originally written by Chuck Thompson. Corrections to v3.1 and later
+were done by Martin Buchholz, Steve Baur, and Hrvoje Niksic.
+
+ Corrections to the original GNU Emacs Lisp Reference Manual were
+supplied by Karl Berry, Jim Blandy, Bard Bloom, Stephane Boucher, David
+Boyes, Alan Carroll, Richard Davis, Lawrence R. Dodd, Peter Doornbosch,
+David A. Duff, Chris Eich, Beverly Erlebacher, David Eckelkamp, Ralf
+Fassel, Eirik Fuller, Stephen Gildea, Bob Glickstein, Eric Hanchrow,
+George Hartzell, Nathan Hess, Masayuki Ida, Dan Jacobson, Jak Kirman,
+Bob Knighten, Frederick M. Korz, Joe Lammens, Glenn M. Lewis, K. Richard
+Magill, Brian Marick, Roland McGrath, Skip Montanaro, John Gardiner
+Myers, Thomas A. Peterson, Francesco Potorti, Friedrich Pukelsheim,
+Arnold D. Robbins, Raul Rockwell, Per Starback, Shinichirou Sugou, Kimmo
+Suominen, Edward Tharp, Bill Trost, Rickard Westman, Jean White, Matthew
+Wilding, Carl Witty, Dale Worley, Rusty Wright, and David D. Zuhn.
+
+\1f
+File: lispref.info, Node: Packaging, Next: Lisp Data Types, Prev: Introduction, Up: Top
+
+The XEmacs Packaging System
+***************************
+
+The XEmacs distribution, starting with version 21, comes only with a
+very basic set of built-in modes and libraries. Most of the libraries
+that were part of the distribution of earlier versions of XEmacs are now
+available separately. The user as well as the system administrator can
+choose which packages to install; the actual installation process is
+easy. This gives an installer the ability to tailor an XEmacs
+installation for local needs with safe removal of unnecessary code.
+
+ This chapter describes how to package Lisp libraries for use with the
+XEmacs Packaging System.
+
+ _Please note carefully_ that the term "package" as used in XEmacs
+refers to an aggregation of Lisp code and/or data distributed as a
+unit. It does not, as it does in many Lisps, refer to a way of
+creating separate name spaces. XEmacs has no facility for providing
+separate name spaces. (If we ever do get separate name spaces, we'll
+probably regret overloading the nomenclature in this way, but it's
+become established.)
+
+* Menu:
+
+Introduction:
+* Package Overview:: Lisp Libraries and Packages.
+
+Packaging Lisp Libraries:
+* Package Terminology:: Basic stuff.
+* Building Packages:: Turn packaged source into a tarball.
+* Makefile Targets:: Package `Makefile' targets
+* Local.rules File:: Tell the XEmacs Packaging System about your host.
+* Creating Packages:: Tell the XEmacs Packaging System about your package.
+* Documenting Packages:: Explain your package to users and hackers.
+
+Internals and Package Release Engineering:
+* Issues::
+
+\1f
+File: lispref.info, Node: Package Overview, Next: Package Terminology, Up: Packaging
+
+An overview of the XEmacs Packaging System
+******************************************
+
+The XEmacs Packaging System is a system for administering the
+installation, upgrade, and removal of Lisp libraries. For the end
+user, it provides facilities for determining availability of packages
+and which versions at remote sites. It will download and automatically
+install a package, ensuring that any old files from previous versions
+of the package are removed first. By providing a standard set of
+hierarchies for installation, it makes configuration of XEmacs simpler.
+Furthermore, packages normally provide ancillary auto-autoloads and
+custom-loads libraries, which are automatically detected and loaded by
+XEmacs upon startup. This means that once installed, all facilities of
+package, including autoloading the library upon invocation of a command
+provided by the library and convenient configuration and customization,
+are automatically available to the user. There is no need to add
+autoloads or keybindings to in the init file, and structured
+configuration of the package is available through the Customize system
+even before the libraries are loaded.
+
+ All of this convenience comes at a cost. The cost of administration
+at the package level is negligible compared to the benefits, of course.
+However, the requirement that XEmacs find and load auto-autoloads and
+custom-loads libraries comes at a fairly large cost in startup time. In
+order to reduce this cost, XEmacs imposes fairly strict conditions on
+the structure of an installed package.
+
+ Meeting these requirements, as well as simply providing the
+auto-autoloads and the information about availability and so on does
+impose some costs on the library maintainer. The XEmacs Packaging
+System also provides structure and utilities to the library maintainer
+to make these tasks easier. This manual documents the requirements and
+the tools that the XEmacs Packaging System provides to ensure that a
+package satisfies them.
+
+* Menu:
+
+* The User View::
+* The Library Maintainer View::
+* The Package Release Engineer View::
+
+\1f
+File: lispref.info, Node: The User View, Next: The Library Maintainer View, Up: Package Overview
+
+The User View
+=============
+
+*N.B.* Much of the discussion in this section undoubtedly belongs
+elsewhere, *Note Packages: (xemacs)Packages.
+
+ From the user's point of view, an XEmacs binary package is simply a
+standard tarball (usually gzipped) containing Lisp sources, compiled
+Lisp, documentation, and possibly data files or supporting executables.
+The tarball is unpacked using standard tools such as GNU tar and gzip.
+The package system does impose certain requirements for automatic
+configuration to work.
+
+ Here the main consideration is that the tarball "expects" to be
+unpacked from the top of a package hierarchy. A "package hierarchy" is
+basically an image of a classic Emacs "run-in-place" tree, with `lisp',
+`etc', `info', `man', `lib-src', and `pkginfo' subdirectories of the
+top. The `pkginfo' subdirectory is for use by the XEmacs Packaging
+System administration tools, and currently contains a
+`MANIFEST.PACKAGE-NAME' file for each package to ensure that no cruft
+remains when a package is removed or updated. The `lisp', `etc', and
+`lib-src' subdirectories are further subdivided, with a subdirectory
+for each package. The `info' directory obeys the usual conventions.
+_I.e._, the `info' directory is flat with a(n) (optional) `dir' file
+and one (set of) info file(s) per package. The `man' subdirectory
+typically contains documentation sources, separated by package. (It
+does not contain `man(1)' pages, as Emacs provides very few of them.)
+
+ There are several standard package hierarchies, and administrators
+can configure others at build time, while users can configure others at
+run time. The standard system hierarchies are all subdirectories of an
+XEmacs installation root, typically `/usr/local/lib/xemacs/'. These
+are the `xemacs-packages', `mule-packages', `infodock-packages', and
+`site-packages' hierarchies. Each has the structure described above,
+but the purposes differ. The `xemacs-packages' is the normal place for
+installing "official" packages and many third-party libraries.
+Unfortunately, it is not yet quite possible to read libraries
+containing international characters with a non-Mule XEmacs, so such
+libraries are sequestered in the `mule-packages' hierarchy. Some
+packages are compatible only with the Infodock development environment,
+and they will be installed in the `infodock-packages' hierarchy. The
+`site-packages' hierarchy is for packages not distributed by
+XEmacs.org, typically locally developed.
+
+ Packages are in principle supposed to be XEmacs version-independent,
+but if such dependencies are unavoidable, additional standard package
+hierarchies may be installed under version directories, _e.g._
+`/usr/local/lib/xemacs-21.4.6/'.
+
+ Users who do not have sufficient privilege to install packages in the
+system hierarchies may install package hierarchies under `~/.xemacs'.
+At present only the `xemacs-packages', `mule-packages', and
+`site-packages' hierarchies are supported, but it might make sense to
+extend this to support `infodock-packages' hierarchies in the future.
+
+ The package hierarchies are not searched directly for libraries to be
+loaded; this would be very costly. Instead, the hierarchies are ordered
+according to certain rules, and searched for package lisp directories at
+invocation. These directories are added to the general `load-path'.
+As usual, it is `load-path' that is searched at run-time. This
+approach is somewhat costly at initialization, but results in a very
+"clean" `load-path'.
+
+ The order of search can be changed at build time by specifying the
+`--package-path' option to `configure', or at run-time by specifying
+the `EMACSPACKAGEPATH' environment variable. *Note Packages:
+(xemacs)Packages.
+
+ The default order of search is hierarchically determined. First, the
+roots are ordered. The "early" roots are the user-specific roots,
+typically `~/.xemacs'. The "late" roots are the system roots,
+typically `/usr/local/lib/xemacs-21.4.6' and `/usr/local/lib/xemacs',
+in that order. All hierarchies for a given root are searched for
+package Lisp directories, which are appended to `load-path' in the
+order found. Then the search proceeds to the next root, whose results
+will be appended to the `load-path' generated by previous roots.
+
+ Second, the hierarchies below each root are searched in the order
+`site-packages', `infodock-packages', `mule-packages', then
+`xemacs-packages'.
+
+ In each hierarchy there should be a `lisp' subdirectory, containing
+directories named for the packages. Each package's Lisp libraries thus
+are contained in a directory of the form ROOT/HIERARCHY/lisp/PACKAGE/.
+
+ With such a complex search algorithm, the possibility of libraries
+being shadowed by another library with the same name is quite real.
+There are two considerations here. First, every XEmacs package
+contains certain libraries with constant names. These are
+
+`_pkg.el'
+ Lisp code to inform the package administration system about the
+ package
+
+`auto-autoloads.el'
+ Lisp code to set up autoloaded functions and variables that may be
+ needed at load time
+
+`custom-load.el'
+ definitions of configuration variables for use with the Customize
+ system.
+
+ They are special-cased, because the way they are used prevents
+shadowing from being an issue.
+
+ Second, it is possible that multiple copies of some library, or
+different libraries with the same name, are installed in various places
+in the hierarchies. To detect such shadows, use
+`list-load-path-shadows'.
+
+ Finally, note that most basic Emacs functionality, including most of
+the Lisp API, is implemented in Lisp libraries. Because they use
+internal reserved APIs that are subject to change according the needs
+of the developers, these libraries are distributed with the XEmacs
+binary, and are called "core Lisp libraries". Most core Lisp libraries
+are "preloaded" into the Emacs binary and in normal usage are never
+explicitly loaded. However, they can be explicitly loaded, and if so
+they are searched on `load-path'. Furthermore, functions such as
+`locate-library' will also search on the `load-path'. The searching
+takes place under somewhat different rules from those used for packaged
+Lisp. It is probably easiest to think of the package hierarchy
+searching algorithm as receiving a `load-path' initialized to the core
+Lisp directories.
+
+\1f
+File: lispref.info, Node: The Library Maintainer View, Next: The Package Release Engineer View, Prev: The User View, Up: Package Overview
+
+The Library Maintainer View
+===========================
+
+From the library maintainer's viewpoint, the advantages to the XEmacs
+Packaging System stem from the convenience to the user of installation
+and upgrade. Since an installed package automatically registers its
+entry points via autoload and its configuration variables with the
+Customize system, configuration FAQs are reduced. When it's easy to
+upgrade, users learn to try `Tools | Packages | Update Installed
+Packages' before posting a FAQ whose answer is "long since fixed,
+please upgrade."
+
+ This comes at some cost, as the library maintainer needs to arrange
+that the package be installed in a directory structure that satisfies
+the requirements of the XEmacs Packaging System. Autoload cookies and
+defcustoms must also be added to existing libraries. The XEmacs
+Packaging System provides infrastructure to assure that all of these
+annoyances need only be dealt with once. The autoload cookies and
+defcustoms are beyond the scope of this chapter, but most maintainers
+of modern packages are already familiar with these mechanisms.
+
+ The XEmacs Packaging System may be divided into the "infrastructure"
+common to all packages, and the package-specific "control files". The
+infrastructure supports global builds, installation, and generation of
+the "sumo" bundles of packages, as well as generation of individual
+packages. The package control files describe the structure of the
+package's source tree and provide administrative information.
+
+* Menu:
+
+* Infrastructure:: Global Makefiles and common rules.
+* Control Files:: Package-specific Makefiles and administrative files.
+* Obtaining:: Obtaining the XEmacs Packaging System and required utilities.
+
+\1f
+File: lispref.info, Node: Infrastructure, Next: Control Files, Up: The Library Maintainer View
+
+Infrastructure
+--------------
+
+In order to get the greatest benefit from the XEmacs Packaging System,
+a library maintainer should place the package sources in an appropriate
+place in the XEmacs source package hierarchy, and arrange to have the
+source package imported into the XEmacs CVS repository. (We realize
+that the latter requirement can be quite burdensome. We are working on
+ways to remove this requirement, but for the present it remains
+necessary.) The library maintainer must also keep sources for any
+packages his/her package requires. This requirement is somewhat
+burdensome, but unlikely to be relaxed because of the implementation of
+compilation of macros in Emacs Lisp. Macros cannot be called by
+compiled Lisp (the macro expansion, which is always known at compile
+time, is inlined), so the source of the macro must be loaded before
+compiling the called function.
+
+ The source package hierarchy may be rooted anywhere. The CVS module
+is called "packages," so we will refer to the top directory of the
+source package hierarchy as "the `packages' directory." The `packages'
+directory contains two source subdirectories, `xemacs-packages' and
+`mule-packages' (for convenience in segregating the packages which
+depend on Mule, as they will cause load-time errors in a non-Mule
+XEmacs). Each subdirectory contains many package source directories,
+whose internal structure is not specified. That structure is left up
+to the convenience of the library maintainers. The requirements on the
+top directory of an individual package source tree are given below,
+*Note Control Files::.
+
+ The `packages' directory contains some auxiliary Lisp libraries used
+in the compilation and packaging process. The content of these
+libraries is of interest primarily to the packaging engineers, *Note
+The Package Release Engineer View::.
+
+ Finally, the `packages', `packages/xemacs-packages', and
+`packages/mule-packages' directories contain `Makefile's and include
+files to control the package creation process. The `Makefile's in
+`packages/xemacs-packages' and `packages/mule-packages' simply define
+the default sets of known packages and include `../iterate.rules',
+which implements recursive building of all target packages.
+
+ The `make' infrastructure in `packages' includes
+
+`Makefile'
+ controls building of individual packages, local installation, and
+ bundling of "sumo" tarballs
+
+`iterate.rules'
+ controls recursive builds of multiple packages
+
+`meta-iterate.rules'
+ This is used by higher-level subdirectories that do not directly
+ contain packages. Subdirectories directly containing packages
+ should use iterate.rules instead.
+
+`XEmacs.rules'
+ provides the rules for building and packaging. Included by all
+ package `Makefile's.
+
+`Local.rules'
+ provides local configuration, such as installation targets and
+ staging directories, as well as a number of kludges (many now
+ obsolete) required for building packages on the Windows platform.
+
+`Local.rules.template'
+ a template for Local.rules, liberally commented
+
+`Local.rules.mk'
+ consistency checking for `Local.rules', included by both the
+ top-level `Makefile' and by `XEmacs.rules'.
+
+`Local.rules.inc'
+ a file to `include' in package `Makefile's to be able to get at
+ variables in `Local.rules' _before_ including `XEmacs.rules'.
+
+`package-compile.el'
+ compile environment (_e.g._, load-path) setup.
+
+ Of these, only `Local.rules' and `package-compile.el' need to be
+modified by the library maintainer. The changes to Local.rules affect
+only your environment. This should need to be done only once when
+first preparing the source environment. The necessary modifications to
+`package-compile.el' need to be done for each package and are discussed
+in the next section, *Note Control Files::.
+
+\1f
+File: lispref.info, Node: Control Files, Next: Obtaining, Prev: Infrastructure, Up: The Library Maintainer View
+
+Control Files
+-------------
+
+Each package source must contain a number of control files in the
+top-level directory. These files in general can be created and then
+ignored, except for a few variables that need to be updated when new
+versions are released. In most cases even adding, renaming, and
+removing library source files can be handled by generic rules.
+
+ The package control files include
+
+`Makefile'
+ Must set a few `make' variables used by the administrative
+ utilities, and defines a couple of package-building targets to
+ depend on appropriate targets defined generically in
+ `XEmacs.rules'. It may also provide various variables and rules
+ to transform the source tree structure into that expected by the
+ run-time system.
+
+`package-info.in'
+ Provides a template for package information to be provided to the
+ administrative utilities. Static variables that are rarely changed
+ (such as the package's name) are entered as literals. Some
+ variables are generated by the build process (build dates and MD5
+ checksums) and are automatically filled in. Finally, some
+ variables that change irregularly (dependences and even version
+ numbers) are set as `make' variables in the `Makefile'.
+
+`ChangeLog'
+ Not strictly required, but normally a ChangeLog will be added by
+ the XEmacs package maintainer if different from the upstream
+ maintainer.
+
+`_pkg.el'
+ Generated. Simply does a `package-provide' for the package.
+
+`auto-autoloads.el'
+ Generated. Read when XEmacs is initialized, and provides
+ autoloads for defuns and other forms in the sources that are
+ marked with an "autoload cookie" (`;;;###autoload'.
+
+`custom-loads.el'
+ Generated. Read when XEmacs is initialized, and informs the
+ Customize subsystem how to find the defcustom forms needed to
+ create Customization forms for the usre configuration variables of
+ the package.
+
+\1f
+File: lispref.info, Node: Obtaining, Prev: Control Files, Up: The Library Maintainer View
+
+Obtaining the XEmacs Packaging System and Required Utilities
+------------------------------------------------------------
+
+Currently both the infrastructure for creating XEmacs packages and the
+package sources themselves are available only by CVS. See
+`http://www.xemacs.org/Develop/cvsaccess.html' for more intformation.
+
+ The XEmacs Packaging System currently requires GNU `make', and
+XEmacs, to build packages.
+
+\1f
+File: lispref.info, Node: The Package Release Engineer View, Prev: The Library Maintainer View, Up: Package Overview
+
+The Package Release Engineer View
+---------------------------------
+
+The XEmacs Package Release Engineer is responsible for keeping the
+system coherent. The changes to `packages/package-compile.el' and
+`packages/xemacs-packages/Makefile' required to make the package
+available to others, and for building SUMO tarballs, _etc_, are done by
+the Package Release Engineer, not individual library maintainers.
+
+ The Package Release Engineer also maintains assorted infrastructure
+for actually making releases. These are generally available for
+inspection in the `xemacs-builds' module in the CVS repository.
+
+\1f
+File: lispref.info, Node: Package Terminology, Next: Building Packages, Prev: Package Overview, Up: Packaging
+
+Package Terminology:
+====================
+
+Libraries and Packages
+----------------------
+
+A Lisp "library" is a single loadable file containing Lisp code. It
+may be in source or byte-compiled form. A Lisp "package" is a set of
+one or more libraries, usually related to each other in some way,
+bundled with administrative information for convenient distribution.
+
+Package Flavors
+---------------
+
+There are two main flavors of packages.
+
+*Regular Packages*
+ A regular package is a set of Lisp libraries design to cooperate
+ with one another. A very complex example is Gnus. One may not in
+ general safely remove any of the component libraries.
+
+*Single-File Packages*
+ A single-file package is a collection of thematically related but
+ otherwise independent Lisp libraries. These libraries are bundled
+ together for convenience of the maintainers. Usually individual
+ libraries may be deleted at will without any loss of functionality
+ of other libraries in the package. However, we would recommend
+ that you follow this rule of thumb: "When in doubt, don't delete".
+ If it's really that big a deal, request that the maintainers
+ split the package into smaller aggregations.
+
+Package Distributions
+---------------------
+
+XEmacs Lisp packages are distributed in two ways. "Binary packages"
+are used by system administrators and end users. They are packaged in a
+form convenient for direct installation into an XEmacs package
+hierarchy. "Source packages" are for developers and include all files
+necessary for rebuilding byte-compiled lisp and creating tarballs for
+distribution or installation. This is all of the package author's
+source code plus all of the files necessary to build distribution
+tarballs (Unix Tar format files, gzipped for space savings).
+(Occasionally sources that are not relevant to XEmacs are usually
+renamed to `file.upstream'.)
+
+ Currently, source packages are only available via CVS. See
+<http://www.xemacs.org/Develop/cvsaccess.html> for details.
+
+ The package distributions are also split according to major features
+required in XEmacs to support them. At present there are "generic"
+packages, which can be loaded by _any_ XEmacs, and "Mule" packages,
+which _require_ Mule support or they will cause errors when loaded.
+Note that there is no guarantee that a generic package will have any
+useful functionality in a minimally configured XEmacs. As long as any
+XEmacs can successfully load the package's libraries (perhaps given
+other required Lisp libraries), it will be classified as generic. At
+the present time only Mule packages need be treated specially, and even
+those only if they contain multibyte characters.
+
+\1f
+File: lispref.info, Node: Building Packages, Next: Makefile Targets, Prev: Package Terminology, Up: Packaging
+
+Building Packages:
+==================
+
+Currently, source packages are only available via anonymous CVS. See
+<http://www.xemacs.org/Develop/cvsaccess.html> for details of checking
+out the `packages' module.
+
+Prerequisites for Building Source Packages
+------------------------------------------
+
+`GNU cp'
+
+`GNU install'
+ (or a BSD compatible install program).
+
+`GNU make'
+ (3.79 or later preferred).
+
+`makeinfo'
+ (4.2 from texinfo-4.2)
+
+`GNU tar'
+ (or equivalent).
+
+`GNU gzip'
+ (or equivalent).
+
+`A properly configured `Local.rules' file.'
+ *Note Local.rules File::.
+
+ And of course, XEmacs, 21.0 or higher.
+
+What You Can Do With Source Packages
+====================================
+
+The packages CVS sources are most useful for creating XEmacs package
+tarballs for installation into your own XEmacs installations or for
+distributing to others.
+
+ It should be noted that most of the package `Makefile's do _not_
+need to contain _any_ target rules. Everything is handled from the
+`XEmacs.rules' file, located in the toplevel directory of the packages
+source tree.
+
+\1f
+File: lispref.info, Node: Makefile Targets, Next: Local.rules File, Prev: Building Packages, Up: Packaging
+
+`Makefile' targets
+******************
+
+The following targets can be used when running `make' to build the
+packages:
+
+`mostlyclean'
+ Removes any documentation files that have been processed by TeX.
+
+`clean'
+ Does a `mostlyclean', plus removes generated postscript and dvi
+ files. Also removes any generated .elc files, along with the
+ normal .elc files in the package and HTML and .info files.
+
+`distclean'
+ Use this when preparing a distribution. It kills anything that
+ can be rebuilt.
+
+`extraclean'
+ Does a `distclean' and also removes any backup files (`*~') and
+ `core' files.
+
+`package-info'
+ Creates the `package-info' file from the `package-info.in' and
+ writes an entry in the `package-index' file.
+
+`bindist'
+ Builds the package, including any Texinfo documentation (info
+ format), writes an entry into the `package-index' file and builds
+ a tarball of the package. Also writes an entry into
+ `setup-packages.ini' which is later used in the creation of
+ netinstaller's `setup.ini'.
+
+`install'
+ Builds and installs a package
+
+`install-only'
+ Doesn't build anything, just installs it.
+
+`autoloads'
+ Generate the package's `auto-autoloads.el' file.
+
+`binkit'
+ Creates the directories needed for installation and copies the
+ files there. Basically this is an alias for `install-only'.
+
+`html'
+ Builds the HTML versions of the documentation.
+
+`compile'
+ Does most of the work. Builds the elcs, infos at a minimum.
+
+The targets that most people would be interested in would be:
+-------------------------------------------------------------
+
+ * `all'
+
+ * `bindist'
+
+ * `html'
+
+ * `install'
+
+ * `install-only'
+
+ * `clean'
+
+ * `distclean'
+
+\1f
+File: lispref.info, Node: Local.rules File, Next: Creating Packages, Prev: Makefile Targets, Up: Packaging
+
+The Local.rules File:
+=====================
+
+This file in `packages' provides the XEmacs Packaging System with
+information about the local configuration and environment. To create
+`Local.rules', simply copy `Local.rules.template' from that directory to
+`Local.rules' and edit it to suit your needs.
+
+ These are the variables in `Local.rules' that you may need to
+provide values for:
+
+`XEMACS'
+ The name (and path if needed) of the XEmacs binary to use for
+ building the packages. The default is `xemacs'.
+
+`XEMACS_21_5'
+ This will enable some, as yet, unimplemented features in XEmacs
+ 21.5 and above. For now leave this blank (the default) regardless
+ of the XEmacs version you are using.
+
+`BUILD_WITHOUT_MULE'
+ Set this to `t' if you are using a non-Mule XEmacs. The default is
+ that this variable is not set (blank) which means to build _with_
+ Mule.
+
+`XEMACS_NATIVE_NT'
+ Set this to `t' if you are using a native Microsoft Windows build
+ of XEmacs (not a Cygwin build) to build the packages. *N.B.* To
+ Windows users, you still need the Cygwin environment to actually
+ build the packages.
+
+`XEMACS_INSTALLED_PACKAGES_ROOT'
+ Set this to the root of where you want the packages to be
+ installed. Under this directory will hang `xemacs-packages' and
+ `mule-packages'. See NONMULE_INSTALLED_PACKAGES_ROOT and
+ MULE_INSTALLED_PACKAGES_ROOT. The default for this is
+ `/usr/local/lib/xemacs'. Which may not be what you want if you are
+ developing XEmacs. To quote the comments in
+ `Local.rules.template':
+
+ If you are developing XEmacs, you probably don't want to
+ install the packages under /usr/local, which is where the
+ stable, released version of XEmacs goes. Instead, we suggest
+ a layout as described in the base README file of recent
+ versions of XEmacs. In a nutshell, we suggest you put your
+ source under /src/xemacs, and under this put the package
+ sources in package-src/, and the installed packages in
+ xemacs-packages/ and mule-packages/. If you do everything
+ this way, you might want to set things as follows:
+
+ XEMACS_INSTALLED_PACKAGES_ROOT = ${XEMACS_PACKAGES_BASE}/..
+
+ which puts the xemacs-packages/ and mule-packages/
+ directories as sisters of the package-src/ directory, and you
+ have to tell configure the location of the installed packages
+ using `-package-path', something like
+
+ configure
+ -package-path=/src/xemacs/xemacs-packages;/src/xemacs/mule-packages
+
+`symlink'
+ The default is unset (blank). If you set this to `t' then `make
+ install' will create a "symlink farm" of the installed packages
+ under XEMACS_INSTALLED_PACKAGES_ROOT. Obviously, for this to
+ work, your system has to support symbolic links. This is as close
+ as you can get to "running in place" for the packages.
+
+`NONMULE_INSTALLED_PACKAGES_ROOT'
+ This is where the non-Mule packages get installed to. The default
+ is `${XEMACS_INSTALLED_PACKAGES_ROOT}/xemacs-packages'.
+
+`MULE_INSTALLED_PACKAGES_ROOT'
+ This is where the Mule packages get installed to. The default is
+ `${XEMACS_INSTALLED_PACKAGES_ROOT}/mule-packages'.
+
+`NONMULE_PACKAGES'
+ A whitespace separated list of non-Mule packages to build/install.
+
+ NONMULE_PACKAGES = bbdb gnus xemacs-base prog-modes
+
+ The value for this variable can also be the symbol
+ `xemacs-packages', which means to build/install _all_ of the
+ non-Mule packages. The default is `xemacs-packages'.
+
+`MULE_PACKAGES'
+ A whitespace separated list of Mule packages to build/install.
+
+ MULE_PACKAGES = mule-base leim locale
+
+ The value for this variable can also be the symbol
+ `mule-packages', which means to build/install _all_ of the Mule
+ packages. The default is `mule-packages'.
+
+`PACKAGE_INDEX'
+ The name of the package-index file. The default is `package-index'
+ and you probably don't need to worry about changing it.
+
+`INSTALL'
+ The path to a BSD compatible install program. The default is
+ `install -c'.
+
+`TAR'
+ The path to GNU/tar. The default is `tar'.
+
+`BZIP2'
+ The path to the bzip2 compression program. The default is unset
+ (blank). If this is set `.tar.bz2' archives will be built _in
+ addition to_ the `.tar.gz' archives.
+
+`EXCLUDES'
+ For things that you _don't_ want to go into the package tarballs.
+ It takes the same format as GNU/tar's `--exclude' option. The
+ default is:
+
+ EXCLUDES = \
+ --exclude 'CVS' \
+ --exclude 'RCS' \
+ --exclude 'SCCS' \
+ --exclude '*~' \
+ --exclude '*.orig' \
+ --exclude '*.rej' \
+ --exclude '.\#*'
+
+`VANILLA'
+ Set to the XEmacs command line option that forces running in
+ "vanilla" mode. The default is `-vanilla'. You wouldn't ever
+ need to alter this.
+
+`BATCH'
+ How to put XEmacs into "batch" mode. It also sets a couple of
+ other things and in the normal course of events you wouldn't need
+ to alter this from the default which is:
+
+ BATCH = $(VANILLA) -batch -eval \
+ '(setq stack-trace-on-error t \
+ load-always-display-messages t \
+ load-ignore-out-of-date-elc-files t \
+ load-show-full-path-in-messages t)'
+
+`MAKEINFO'
+ The path to `makeinfo'. The default is `makeinfo'
+
+`INSTALL_HTML'
+ Set this to `t' if you want to install HTML versions of the Texinfo
+ documentation. The default is unset (blank).
+
+`TEXI2HTML'
+ The path to the program that can convert Texinfo source to HTML.
+ The default is `texi2html'.
+
+`TEXI2DVI'
+ The path to the program that can convert Texinfo source to DVI.
+ The default is `texi2dvi'
+
+`DVIPS'
+ The path to the program that can convert DVI to Postscript. The
+ default is `dvips'
+
+`TEXI2PDF'
+ The path to the program that can convert Texinfo source to PDF
+ format. The default is `texi2pdf'.
+
+`TEX'
+ The path to TeX. The default is `tex'
+
+`MSGFMT'
+ The path to msgfmt. The default is `msgfmt'
+
+`RCOPY'
+ The path to your copy command (GNU cp). The default is dependent
+ on whether or not SYMLINK is set (`t').
+
+ If SYMLINK is unset (blank), RCOPY's default is `cp -af'. If
+ SYMLINK is set (`t'), RCOPY's default is `cp --force --recursive
+ --symbolic-link'.
+
+ It should be noted that in most cases the defaults should be fine.
+Most people will probably only need to alter:
+
+ * XEMACS_INSTALLED_PACKAGES_ROOT
+
+ * NONMULE_INSTALLED_PACKAGES_ROOT
+
+ * MULE_INSTALLED_PACKAGES_ROOT
+
+ * NONMULE_PACKAGES
+
+ * MULE_PACKAGES
+
+\1f
+File: lispref.info, Node: Creating Packages, Next: Documenting Packages, Prev: Local.rules File, Up: Packaging
+
+Creating Packages:
+******************
+
+Creating a package from an existing Lisp library is not very difficult.
+
+ In addition to the Lisp libraries themselves, you need a *Note
+package-info.in:: file and a simple *Note Makefile::. The rest is done
+by `XEmacs.rules', part of the packaging system infrastructure.
+
+* Menu:
+
+* package-info.in:: package-info.in
+* Makefile:: `Makefile'
+
+\1f
+File: lispref.info, Node: package-info.in, Next: Makefile, Up: Creating Packages
+
+package-info.in
+***************
+
+`package-info.in' contains information that gets injected into the
+`package-index' file when `make bindist' is run. Here is a real world
+example from the xemacs-base package (a description of each field
+follows the example):
+
+ (xemacs-base
+ (standards-version 1.1
+ version VERSION
+ author-version AUTHOR_VERSION
+ date DATE
+ build-date BUILD_DATE
+ maintainer MAINTAINER
+ distribution xemacs
+ priority high
+ category CATEGORY
+ dump nil
+ description "Fundamental XEmacs support, you almost certainly need this."
+ filename FILENAME
+ md5sum MD5SUM
+ size SIZE
+ provides (add-log advice-preload advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline passwd pp regexp-opt regi ring shell skeleton sort thing time-stamp timezone tq xbm-button xpm-button)
+ requires (REQUIRES)
+ type regular
+ ))
+
+Description of the Fields in `package-info.in':
+-----------------------------------------------
+
+`NAME'
+ The name of the package. In the case of the example it is
+ `xemacs-base'.
+
+`standards-version'
+ Part of the internal package infrastructure, its value should
+ always be `1.1'. Do not change this.
+
+`version'
+ This is the XEmacs package version number of the package. It is
+ set from the `Makefile' variable VERSION. This is something that
+ the XEmacs Package Release Engineer deals with so there is no need
+ for a package maintainer to touch it. In `package-info.in' just
+ put the place-marker, `VERSION' here.
+
+`author-version'
+ This is the package's internal, or `upstream' version number if it
+ has one. It is set from the `Makefile' variable AUTHOR_VERSION.
+
+`date'
+ This is the date of the last change made to the package. It is
+ auto-generated at build time, taken from the package's toplevel
+ `ChangeLog'.
+
+`build-date'
+ The date the package was built. It is auto-generated.
+
+`maintainer'
+ This is the name and email address of the package's maintainer.
+ It is taken from the `Makefile' variable MAINTAINER.
+
+`distribution'
+ An unused field, leave as `xemacs'
+
+`priority'
+ An unused field, can be any of `high', `medium', or `low'.
+
+`category'
+ The `category' of the package. It is taken from the `Makefile'
+ variable CATEGORY and can be either `standard' for non-Mule
+ packages, or `mule' for Mule packages. The is also provision for
+ `unsupported' in this field which would be for packages that
+ XEmacs.org do not distribute.
+
+ *N.B.* As yet, the XEmacs Packaging System does _not_ support this
+ type of package. It will in the future.
+
+`dump'
+ Unused. Always `nil'
+
+`description'
+ A free form short description of the package.
+
+`filename'
+ The file name of the package's binary tarball. It is generated at
+ build time by `make bindist'.
+
+`md5sum'
+ The MD5 message digest of the package's binary tarball. Generated
+ at build time by `make bindist'.
+
+`size'
+ The size in bytes of the package's binary tarball. Generated at
+ build time.
+
+`provides'
+ A whitespace separated list of _all_ the features the package
+ provides. Surround the list with parens.
+
+`requires'
+ Taken from the `Makefile' variable REQUIRES. It is a list of all
+ the package's dependencies, including any macros and defstructs
+ that need to be inlined.
+
+ `REQUIRES' cannot be correctly computed from the calls to
+ `require' in the package's library sources. `REQUIRES' is used to
+ ensure that all macro and defstruct definitions used by the
+ package are available at build time. This is not merely a matter
+ of efficiency, to get the expansions inlined. In fact, it is
+ _impossible_ to call a macro by name in byte-compiled Emacs Lisp
+ code. Thus, if the macro expansion is not inlined, the call will
+ result in an error at run-time! Thus, packages providing
+ libraries that would be loaded because of autoload definitions
+ must also be included.
+
+`type'
+ Can either be `regular' for a regular package, or `single-file'
+ for a single file package.
+
+ *N.B.* This doesn't refer to the number of lisp files in a
+ package. A single-file package can have multiple lisp files in it.
+ *Note Package Terminology::.
+
+ The fields in `package-info.in' that need to be changed directly are:
+
+ * NAME
+
+ * description
+
+ * provides
+
+ * type
+
+ Everything else is either set from the appropriate `Makefile'
+variable, is auto-generated at build time, or is static.
+
+\1f
+File: lispref.info, Node: Makefile, Prev: package-info.in, Up: Creating Packages
+
+`Makefile'
+**********
+
+The `Makefile' is quite stylized. The idea is similar to an
+`Imakefile' or an `automake' file: the complexity is hidden in generic
+rules files, in this case the `XEmacs.rules' include file in the top
+directory of the packages hierarchy.
+
+ It is important to note that the XEmacs used to compile packages is
+the bare minimum: it is called with the `-no-autoloads'. This means
+that anything not dumped into XEmacs by default needs to be specified
+in the `REQUIRES' variable (for packaged Lisp) or in some cases the
+`PRELOADS' (autoloads used in libraries mentioned in `PRELOADS').
+
+ There isn't much to an XEmacs Packaging System `Makefile', basically
+it just contains a few `Makefile' variables and that's it. See the
+example.
+
+ Here is a real world example, from the `build' package:
+
+ # Makefile for build lisp code
+
+ # This file is part of XEmacs.
+
+ # XEmacs is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by the
+ # Free Software Foundation; either version 2, or (at your option) any
+ # later version.
+
+ # XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ # for more details.
+
+ # You should have received a copy of the GNU General Public License
+ # along with XEmacs; see the file COPYING. If not, write to
+ # the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ # Boston, MA 02111-1307, USA.
+
+ # For the time being, remove MULE_ELCS from the all dependencies if
+ # building without Mule.
+
+ VERSION = 1.10
+ AUTHOR_VERSION = 2.02
+ MAINTAINER = Adrian Aichner <adrian@xemacs.org>
+ PACKAGE = build
+ PKG_TYPE = regular
+ REQUIRES = xemacs-base pcl-cvs dired w3 prog-modes
+ CATEGORY = standard
+
+ ELCS = build.elc build-report.elc
+
+ STANDARD_DOCS = t
+
+ include ../../XEmacs.rules
+
+ Most packages don't need any more than what you see above. It is
+usually _not_ necessary to specify any special `Makefile' rules.
+Everything is handled from the `*.rules' files in the toplevel of the
+package source hierarchy.
+
+ Of course, with that said, there are always exceptions to the rule.
+If you think that your package will need some special `Makefile'
+hackery contact the XEmacs developers <xemacs-beta@xemacs.org>. We
+distribute over 100 packages so the chances are good that you won't be
+the first to need such hackery and it is probably already catered for.
+
+`Makefile' Variables Explained:
+-------------------------------
+
+A number of `make' variables are defined by the XEmacs Packaging
+System. Some are required, others are optional. Of course your
+`Makefile' may define other variables for private use, but you should
+be careful not to choose names that conflict with variables defined and
+used by the XEmacs Packaging System.
+
+ The required variables are described in the table below. The
+corresponding field names for `package-info.in', where relevant, are
+given in parentheses.
+
+`VERSION'
+ (version) The version of the XEmacs package, a numeric literal (a
+ decimal fixed-point number with two-places of precision). The
+ only person who ever needs to touch this is the XEmacs Packages
+ Release Engineer.
+
+`AUTHOR_VERSION'
+ (author-version) The upstream author's version, an uninterpreted
+ literal.
+
+`MAINTAINER'
+ (maintainer) A literal containing the XEmacs package's maintainer
+ and his/her email address.
+
+`PACKAGE'
+ The name of the package, a literal
+
+`PKG_TYPE'
+ The type of package, a literal containing either `regular' for
+ regular packages, or `single-file' for single-file packages. This
+ should feed the `type' field in `package-info.in', but currently
+ it doesn't.
+
+ *N.B.* `single-file' here does _not_ refer to the number of lisp
+ files in a package. *Note Package Terminology::.
+
+`CATEGORY'
+ (category) A literal, either `standard' or `mule'. The non-Mule
+ packages are `standard' and the Mule packages are, you guessed it,
+ `mule'. This field is used at package installation time as part of
+ the process of determining where a package should be installed to.
+
+`REQUIRES'
+ (requires) A list of packages required to correctly build this
+ package.
+
+ Note that the usual form in `package-info.in' already has the
+ parentheses, so the `make' variable should be set to a
+ space-separated list of package names _not_ enclosed in
+ parentheses.
+
+ The list is of _packages_, not _libraries_, as would ordinarily be
+ provided to the Lisp `require' function.
+
+ `REQUIRES' cannot be correctly computed from the calls to
+ `require' in the package's library sources. `REQUIRES' is used to
+ ensure that all macro and defstruct definitions used by the
+ package are available at build time. This is not merely a matter
+ of efficiency, to get the expansions inlined. In fact, it is
+ _impossible_ to call a macro by name in byte-compiled Emacs Lisp
+ code. Thus, if the macro expansion is not inlined, the call will
+ result in an error at run-time! Thus, packages providing
+ libraries that would be loaded because of autoload definitions
+ must also be included.
+
+`ELCS'
+ The list of the byte-compiled Lisp files used by the package.
+ These files and their `.el' versions will be included in the binary
+ package. This variable determines which libraries will be
+ byte-compiled. These libraries are also deleted by `make clean'.
+
+ Note there is no sanity-checking done on this variable. If you put
+ `.el' files in here, they will not be compiled and they _will_ be
+ deleted by `make clean'. You would surely be very distressed if
+ that happened, so be very careful. If this variable is left
+ empty, none of your Lisp code will be compiled or packaged. This
+ would be a less than amusing surprise, too.
+
+ We don't consider this a feature, of course. Please do submit
+ code to do sanity checking to <xemacs-patches@xemacs.org>.
+
+ Optional, but commonly used variables are explained below.
+
+`ELCS_1'
+ A list of extra byte-compiled Lisp files used by the package to be
+ installed in a subdirectory of the package's lisp directory. The
+ same care should be taken with this as with ELCS in regard to
+ `make clean'.
+
+`ELCS_1_DEST'
+ The name of the subdirectory for the ELCS_1 files to be installed
+ to. Be sure to include `$(PACKAGE)/' as part of the name.
+
+ ELCS_1_DEST = $(PACKAGE)/extra
+
+ Would put the ELCS_1 files for the package, `foo' into
+ `xemacs-packages/lisp/foo/extra/'.
+
+`EARLY_GENERATED_LISP'
+ For additional `.el' files that will be generated before any
+ byte-compiling happens. Use this for `autoload-type' files. You
+ must write `Makefile' rules to build these files.
+
+`GENERATED_LISP'
+ For additional `.el' files that will be generated at
+ byte-compilation time. You must write `Makefile' rules to build
+ these files.
+
+`PRELOADS'
+ This is used if you need to pass extra command line arguments to
+ XEmacs to build the package. For instance, a specification for
+ loading libraries containing macros before compiling the Lisp in
+ the package. This is spliced directly into the invocation of
+ XEmacs for byte-compilation, so it must contain the `-l' flag for
+ XEmacs:
+
+ PRELOADS=-l ./apackage-macros.el -l ../bpackage/lisp/bpackage-macros.el
+
+ Preloads are loaded before `package-compile.el', so the LOAD-PATH
+ is minimal. Therefore `PRELOADS' must specify a full path to
+ packaged Lisp. The base LOAD-PATH does include the core Lisp
+ directory, so core libraries are found.
+
+`AUTOLOAD_PATH'
+ The subdirectory in the package's source tree where the `.el' files
+ reside. This is where the `auto-autoloads.el' file will be placed.
+
+ *N.B.* There is no need to use this variable if the `.el' files
+ are in the package's toplevel directory. AUTOLOAD_PATH defaults
+ to `.'.
+
+`PACKAGE_SUPPRESS'
+ Place calls to `package-suppress' here to indicate Lisp libraries
+ that should only be available to particular versions of XEmacs.
+ For example:
+
+ PACKAGE_SUPPRESS = \
+ (package-suppress 'xemacs-base \"regexp-opt\" '(emacs-version>= 21 5 11)) \
+ (package-suppress 'xemacs-base \"easy-mmode\" '(emacs-version>= 21 5 11))
+
+ *N.B.* This feature has not yet been implemented in XEmacs yet.
+ It will appear in an upcoming version of XEmacs 21.5.
+
+`STANDARD_DOCS'
+ Set this to `t' if your package's Texinfo source file is located in
+ the package's toplevel directory _and_ is named `$(PACKAGE).texi'.
+
+`EXPLICIT_DOCS'
+ Use this to explicitly list Texinfo sources that _aren't_ in the
+ package's toplevel directory. For example:
+
+ EXPLICIT_DOCS = texi/$(PACKAGE).texi
+
+ See DOCS_TXI_EXTENSION and DOCS_TEXINFO_EXTENSION if you don't use
+ the `.texi' file extension on your Texinfo sources.
+
+`EXTRA_TEXI_FILES'
+ List here extra Texinfo source files needed to build your
+ documentation. Whatever is listed here is passed on to `makeinfo'
+ as a dependency.
+
+`EXTRA_HTML_FILES'
+ Use this to specify extra `.html' files to output.
+
+`DOCS_TEXINFO_EXTENSION'
+ Set this to `t' if your Texinfo source files have a `.texinfo'
+ extension.
+
+`DOCS_TXI_EXTENSION'
+ Set this to `t' if your Texinfo source files have a `.txi'
+ extension.
+
+`EXTRA_DOC_FILES'
+ Files listed here will be installed to `.../man/$(PACKAGE)/'. For
+ example, you might want to list TeX files or `.eps' files here.
+
+`EXTRA_SOURCES'
+ Other files (such as extra Lisp sources or an upstream `Makefile')
+ that are normally placed in the installed Lisp directory, but not
+ byte-compiled. These files are _preserved_ by the `clean' targets.
+
+`LIBSRC_FILES'
+ For files that need to be installed to `lib-src/$(PACKAGE)/'. If
+ the files listed here need to be built you will have to write
+ `Makefile' rules to do so.
+
+`DATA_FILES'
+ Any data files, such as pixmaps, READMEs, and ChangeLogs. These
+ must be paths relative to the root of the package's source tree.
+ These files will be copied to `$(DATA_DEST)' for installation.
+ Any directory component of the path for a file will be stripped,
+ so that the file ends up in `$(DATA_DEST)', not in a subdiredtory.
+
+`DATA_DEST'
+ The directory where the files in DATA_FILES are installed to. It
+ is a subdirectory of the installed `etc/' directory. Be sure to
+ prefix this value with `$(PACKAGE)', for example:
+
+ DATA_DEST = $(PACKAGE)/foo
+
+ Would put files into `.../etc/$(PACKAGE)/foo/'.
+
+`DATA_1_FILES ... DATA_35_FILES'
+ For data files that need to go into a different directory from
+ DATA_DEST.
+
+`DATA_1_DEST ... DATA_35_DEST'
+ The name of the subdirectory for files specified in DATA_N_FILES.
+ And like DATA_DEST, be sure to prefix `$(PACKAGE)' to the value of
+ these variables.
+
+`EXTRA_DEPENDENCIES'
+ For additional files to build that aren't appropriate to place in
+ any other `Makefile' variable. You will need to write `Makefile'
+ rules to build these files.
+
+`package-compile.el'
+====================
+
+The XEmacs Packaging System does not automatically become aware of your
+package simply because there is a new subtree. If any package,
+including your own, requires any of your files, it must be explicitly
+added to the compile environment or loads/requires that search
+load-path will fail. The changes that need to be made are
+
+*an entry in `package-directory-map'*
+ This tells the XEmacs Packaging System which distribution
+ (currently `xemacs-packages' or `mule-packages') your package is
+ found in. It then looks in the distribution subdirectory whose
+ name is the same as the package's.
+
+*an entry in the `cond' in `package-name-to-directory'*
+ This is optional; it is necessary only if you keep your Lisp code
+ somewhere other than the top-level directory of the package's
+ source tree, eg, in `packages/xemacs-packages/PACKAGE/lisp'.
+
+ This only needs to be done once, when the package is first added to
+the XEmacs Packaging System. (Well, when you randomly change the
+subdirectory layout, too.) Your changes to `package-compile.el' must
+be cleared and checked in by the XEmacs Package Release Engineer before
+your package will build correctly from a fresh checkout.
+
+ This is unfortunate; it works pretty well once set up, but can cause
+confusion when first building a package in the XEmacs Packaging System
+context. In particular, if the `package-directory-map' entry for a
+required package, including the package itself, is not found, the
+necessary requires will not be executed by `package-compile.el'. If
+required functions are executed (under `eval-when-compile'), they won't
+be found and the compile will fail. If required function is actually a
+macro, the byte compiler will not recognize that, compile a function
+call to the macro. This will cause a run-time error because the
+byte-code interpreter does not know how to execute macros. (Macros can
+always be expanded at compile-time, and this is more efficient.)
+
+ If your package keeps some or all Lisp code somewhere other than the
+top directory, then an entry in `package-name-to-directory' is also
+necessary, or requires will fail, leading to the problems just
+described.
+
+\1f
+File: lispref.info, Node: Documenting Packages, Next: Issues, Prev: Creating Packages, Up: Packaging
+
+Documenting Packages:
+=====================
+
+Some random notes on documenting your package.
+
+ Do write a Texinfo file. It's not that hard to do basically, and
+even using the more advanced features of Texinfo soon become natural.
+For a start, just grab the template `Samples/package.texi' from the
+XEmacs Packaging System source tree, and drop your current README into
+the Top node. At least this way your documentation will be accessible
+from the standard Info readers. Next, try to add lots of
+cross-referencing and logical markup, and then node structure.
+
+ Address both end users and developer issues. You may not be the
+maintainer forever.
+
+ If you are maintaining a package that is part of the GNU Emacs
+distribution, you'll likely find that you occasionally synchronize your
+package with the GNU Emacs sources. When you synch a file,
+conventionally you should place a comment just above the standard `;;;
+Code' comment that looks like this:
+
+ ;; Synched with:
+ ;; GNU Emacs 21.1, 2002-02-08, Stephen Turnbull <stephen@xemacs.org>
+
+ This comment is a status flag; the ChangeLog doesn't really give the
+same information.
+
+ Do maintain a detailed ChangeLog.
+
+\1f
+File: lispref.info, Node: Issues, Prev: Documenting Packages, Up: Packaging
+
+Issues
+======
+
+To be completed.
+
+\1f
+File: lispref.info, Node: Lisp Data Types, Next: Numbers, Prev: Packaging, Up: Top
+
+Lisp Data Types
+***************
+
+A Lisp "object" is a piece of data used and manipulated by Lisp
+programs. For our purposes, a "type" or "data type" is a set of
+possible objects.
+
+ Every object belongs to at least one type. Objects of the same type
+have similar structures and may usually be used in the same contexts.
+Types can overlap, and objects can belong to two or more types.
+Consequently, we can ask whether an object belongs to a particular type,
+but not for "the" type of an object.
+
+ A few fundamental object types are built into XEmacs. These, from
+which all other types are constructed, are called "primitive types".
+Each object belongs to one and only one primitive type. These types
+include "integer", "character" (starting with XEmacs 20.0), "float",
+"cons", "symbol", "string", "vector", "bit-vector", "subr",
+"compiled-function", "hash-table", "range-table", "char-table",
+"weak-list", and several special types, such as "buffer", that are
+related to editing. (*Note Editing Types::.)
+
+ Each primitive type has a corresponding Lisp function that checks
+whether an object is a member of that type.
+
+ Note that Lisp is unlike many other languages in that Lisp objects
+are "self-typing": the primitive type of the object is implicit in the
+object itself. For example, if an object is a vector, nothing can treat
+it as a number; Lisp knows it is a vector, not a number.
+
+ In most languages, the programmer must declare the data type of each
+variable, and the type is known by the compiler but not represented in
+the data. Such type declarations do not exist in XEmacs Lisp. A Lisp
+variable can have any type of value, and it remembers whatever value
+you store in it, type and all.
+
+ This chapter describes the purpose, printed representation, and read
+syntax of each of the standard types in Emacs Lisp. Details on how to
+use these types can be found in later chapters.
+
+* Menu:
+
+* Printed Representation:: How Lisp objects are represented as text.
+* Comments:: Comments and their formatting conventions.
+* Primitive Types:: List of all primitive types in XEmacs.
+* Programming Types:: Types found in all Lisp systems.
+* Editing Types:: Types specific to XEmacs.
+* Window-System Types:: Types specific to windowing systems.
+* Type Predicates:: Tests related to types.
+* Equality Predicates:: Tests of equality between any two objects.
+
+\1f
+File: lispref.info, Node: Printed Representation, Next: Comments, Up: Lisp Data Types
+
+Printed Representation and Read Syntax
+======================================
+
+The "printed representation" of an object is the format of the output
+generated by the Lisp printer (the function `prin1') for that object.
+The "read syntax" of an object is the format of the input accepted by
+the Lisp reader (the function `read') for that object. Most objects
+have more than one possible read syntax. Some types of object have no
+read syntax; except for these cases, the printed representation of an
+object is also a read syntax for it.
+
+ In other languages, an expression is text; it has no other form. In
+Lisp, an expression is primarily a Lisp object and only secondarily the
+text that is the object's read syntax. Often there is no need to
+emphasize this distinction, but you must keep it in the back of your
+mind, or you will occasionally be very confused.
+
+ Every type has a printed representation. Some types have no read
+syntax, since it may not make sense to enter objects of these types
+directly in a Lisp program. For example, the buffer type does not have
+a read syntax. Objects of these types are printed in "hash notation":
+the characters `#<' followed by a descriptive string (typically the
+type name followed by the name of the object), and closed with a
+matching `>'. Hash notation cannot be read at all, so the Lisp reader
+signals the error `invalid-read-syntax' whenever it encounters `#<'.
+
+ (current-buffer)
+ => #<buffer "objects.texi">
+
+ When you evaluate an expression interactively, the Lisp interpreter
+first reads the textual representation of it, producing a Lisp object,
+and then evaluates that object (*note Evaluation::). However,
+evaluation and reading are separate activities. Reading returns the
+Lisp object represented by the text that is read; the object may or may
+not be evaluated later. *Note Input Functions::, for a description of
+`read', the basic function for reading objects.
+
+\1f
+File: lispref.info, Node: Comments, Next: Primitive Types, Prev: Printed Representation, Up: Lisp Data Types
+
+Comments
+========
+
+A "comment" is text that is written in a program only for the sake of
+humans that read the program, and that has no effect on the meaning of
+the program. In Lisp, a semicolon (`;') starts a comment if it is not
+within a string or character constant. The comment continues to the
+end of line. The Lisp reader discards comments; they do not become
+part of the Lisp objects which represent the program within the Lisp
+system.
+
+ The `#@COUNT' construct, which skips the next COUNT characters, is
+useful for program-generated comments containing binary data. The
+XEmacs Lisp byte compiler uses this in its output files (*note Byte
+Compilation::). It isn't meant for source files, however.
+
+ *Note Comment Tips::, for conventions for formatting comments.
+
+\1f
+File: lispref.info, Node: Primitive Types, Next: Programming Types, Prev: Comments, Up: Lisp Data Types
+
+Primitive Types
+===============
+
+For reference, here is a list of all the primitive types that may exist
+in XEmacs. Note that some of these types may not exist in some XEmacs
+executables; that depends on the options that XEmacs was configured
+with.
+
+ * bit-vector
+
+ * buffer
+
+ * char-table
+
+ * character
+
+ * charset
+
+ * coding-system
+
+ * cons
+
+ * color-instance
+
+ * compiled-function
+
+ * console
+
+ * database
+
+ * device
+
+ * event
+
+ * extent
+
+ * face
+
+ * float
+
+ * font-instance
+
+ * frame
+
+ * glyph
+
+ * hash-table
+
+ * image-instance
+
+ * integer
+
+ * keymap
+
+ * marker
+
+ * process
+
+ * range-table
+
+ * specifier
+
+ * string
+
+ * subr
+
+ * subwindow
+
+ * symbol
+
+ * toolbar-button
+
+ * tooltalk-message
+
+ * tooltalk-pattern
+
+ * vector
+
+ * weak-list
+
+ * window
+
+ * window-configuration
+
+ * x-resource
+
+ In addition, the following special types are created internally but
+will never be seen by Lisp code. You may encounter them, however, if
+you are debugging XEmacs. The printed representation of these objects
+begins `#<INTERNAL EMACS BUG', which indicates to the Lisp programmer
+that he has found an internal bug in XEmacs if he ever encounters any
+of these objects.
+
+ * char-table-entry
+
+ * command-builder
+
+ * extent-auxiliary
+
+ * extent-info
+
+ * lcrecord-list
+
+ * lstream
+
+ * opaque
+
+ * opaque-list
+
+ * popup-data
+
+ * symbol-value-buffer-local
+
+ * symbol-value-forward
+
+ * symbol-value-lisp-magic
+
+ * symbol-value-varalias
+
+ * toolbar-data
+
+\1f
+File: lispref.info, Node: Programming Types, Next: Editing Types, Prev: Primitive Types, Up: Lisp Data Types
+
+Programming Types
+=================
+
+There are two general categories of types in XEmacs Lisp: those having
+to do with Lisp programming, and those having to do with editing. The
+former exist in many Lisp implementations, in one form or another. The
+latter are unique to XEmacs Lisp.
+
+* Menu:
+
+* Integer Type:: Numbers without fractional parts.
+* Floating Point Type:: Numbers with fractional parts and with a large range.
+* Character Type:: The representation of letters, numbers and
+ control characters.
+* Symbol Type:: A multi-use object that refers to a function,
+ variable, or property list, and has a unique identity.
+* Sequence Type:: Both lists and arrays are classified as sequences.
+* Cons Cell Type:: Cons cells, and lists (which are made from cons cells).
+* Array Type:: Arrays include strings and vectors.
+* String Type:: An (efficient) array of characters.
+* Vector Type:: One-dimensional arrays.
+* Bit Vector Type:: An (efficient) array of bits.
+* Function Type:: A piece of executable code you can call from elsewhere.
+* Macro Type:: A method of expanding an expression into another
+ expression, more fundamental but less pretty.
+* Primitive Function Type:: A function written in C, callable from Lisp.
+* Compiled-Function Type:: A function written in Lisp, then compiled.
+* Autoload Type:: A type used for automatically loading seldom-used
+ functions.
+* Char Table Type:: A mapping from characters to Lisp objects.
+* Hash Table Type:: A fast mapping between Lisp objects.
+* Range Table Type:: A mapping from ranges of integers to Lisp objects.
+* Weak List Type:: A list with special garbage-collection properties.
+
+\1f
+File: lispref.info, Node: Integer Type, Next: Floating Point Type, Up: Programming Types
+
+Integer Type
+------------
+
+The range of values for integers in XEmacs Lisp is -134217728 to
+134217727 (28 bits; i.e., -2**27 to 2**27 - 1) on most machines. (Some
+machines, in particular 64-bit machines such as the DEC Alpha, may
+provide a wider range.) It is important to note that the XEmacs Lisp
+arithmetic functions do not check for overflow. Thus `(1+ 134217727)'
+is -134217728 on most machines. (However, you _will_ get an error if
+you attempt to read an out-of-range number using the Lisp reader.)
+
+ The read syntax for integers is a sequence of (base ten) digits with
+an optional sign at the beginning. (The printed representation produced
+by the Lisp interpreter never has a leading `+'.)
+
+ -1 ; The integer -1.
+ 1 ; The integer 1.
+ +1 ; Also the integer 1.
+ 268435457 ; Causes an error on a 28-bit implementation.
+
+ *Note Numbers::, for more information.
+
+\1f
+File: lispref.info, Node: Floating Point Type, Next: Character Type, Prev: Integer Type, Up: Programming Types
+
+Floating Point Type
+-------------------
+
+XEmacs supports floating point numbers. The precise range of floating
+point numbers is machine-specific.
+
+ The printed representation for floating point numbers requires either
+a decimal point (with at least one digit following), an exponent, or
+both. For example, `1500.0', `15e2', `15.0e2', `1.5e3', and `.15e4'
+are five ways of writing a floating point number whose value is 1500.
+They are all equivalent.
+
+ *Note Numbers::, for more information.
+
+\1f
+File: lispref.info, Node: Character Type, Next: Symbol Type, Prev: Floating Point Type, Up: Programming Types
+
+Character Type
+--------------
+
+In XEmacs version 19, and in all versions of FSF GNU Emacs, a
+"character" in XEmacs Lisp is nothing more than an integer. This is
+yet another holdover from XEmacs Lisp's derivation from vintage-1980
+Lisps; modern versions of Lisp consider this equivalence a bad idea,
+and have separate character types. In XEmacs version 20, the modern
+convention is followed, and characters are their own primitive types.
+(This change was necessary in order for MULE, i.e. Asian-language,
+support to be correctly implemented.)
+
+ Even in XEmacs version 20, remnants of the equivalence between
+characters and integers still exist; this is termed the "char-int
+confoundance disease". In particular, many functions such as `eq',
+`equal', and `memq' have equivalent functions (`old-eq', `old-equal',
+`old-memq', etc.) that pretend like characters are integers are the
+same. Byte code compiled under any version 19 Emacs will have all such
+functions mapped to their `old-' equivalents when the byte code is read
+into XEmacs 20. This is to preserve compatibility--Emacs 19 converts
+all constant characters to the equivalent integer during
+byte-compilation, and thus there is no other way to preserve byte-code
+compatibility even if the code has specifically been written with the
+distinction between characters and integers in mind.
+
+ Every character has an equivalent integer, called the "character
+code". For example, the character `A' is represented as the
+integer 65, following the standard ASCII representation of characters.
+If XEmacs was not compiled with MULE support, the range of this integer
+will always be 0 to 255--eight bits, or one byte. (Integers outside
+this range are accepted but silently truncated; however, you should
+most decidedly _not_ rely on this, because it will not work under
+XEmacs with MULE support.) When MULE support is present, the range of
+character codes is much larger. (Currently, 19 bits are used.)
+
+ FSF GNU Emacs uses kludgy character codes above 255 to represent
+keyboard input of ASCII characters in combination with certain
+modifiers. XEmacs does not use this (a more general mechanism is used
+that does not distinguish between ASCII keys and other keys), so you
+will never find character codes above 255 in a non-MULE XEmacs.
+
+ Individual characters are not often used in programs. It is far more
+common to work with _strings_, which are sequences composed of
+characters. *Note String Type::.
+
+ The read syntax for characters begins with a question mark, followed
+by the character (if it's printable) or some symbolic representation of
+it. In XEmacs 20, where characters are their own type, this is also the
+print representation. In XEmacs 19, however, where characters are
+really integers, the printed representation of a character is a decimal
+number. This is also a possible read syntax for a character, but
+writing characters that way in Lisp programs is a very bad idea. You
+should _always_ use the special read syntax formats that XEmacs Lisp
+provides for characters.
+
+ The usual read syntax for alphanumeric characters is a question mark
+followed by the character; thus, `?A' for the character `A', `?B' for
+the character `B', and `?a' for the character `a'.
+
+ For example:
+
+ ;; Under XEmacs 20:
+ ?Q => ?Q ?q => ?q
+ (char-int ?Q) => 81
+ ;; Under XEmacs 19:
+ ?Q => 81 ?q => 113
+
+ You can use the same syntax for punctuation characters, but it is
+often a good idea to add a `\' so that the Emacs commands for editing
+Lisp code don't get confused. For example, `?\ ' is the way to write
+the space character. If the character is `\', you _must_ use a second
+`\' to quote it: `?\\'. XEmacs 20 always prints punctuation characters
+with a `\' in front of them, to avoid confusion.
+
+ You can express the characters Control-g, backspace, tab, newline,
+vertical tab, formfeed, return, and escape as `?\a', `?\b', `?\t',
+`?\n', `?\v', `?\f', `?\r', `?\e', respectively. Their character codes
+are 7, 8, 9, 10, 11, 12, 13, and 27 in decimal. Thus,
+
+ ;; Under XEmacs 20:
+ ?\a => ?\^G ; `C-g'
+ (char-int ?\a) => 7
+ ?\b => ?\^H ; backspace, <BS>, `C-h'
+ (char-int ?\b) => 8
+ ?\t => ?\t ; tab, <TAB>, `C-i'
+ (char-int ?\t) => 9
+ ?\n => ?\n ; newline, <LFD>, `C-j'
+ ?\v => ?\^K ; vertical tab, `C-k'
+ ?\f => ?\^L ; formfeed character, `C-l'
+ ?\r => ?\r ; carriage return, <RET>, `C-m'
+ ?\e => ?\^[ ; escape character, <ESC>, `C-['
+ ?\\ => ?\\ ; backslash character, `\'
+ ;; Under XEmacs 19:
+ ?\a => 7 ; `C-g'
+ ?\b => 8 ; backspace, <BS>, `C-h'
+ ?\t => 9 ; tab, <TAB>, `C-i'
+ ?\n => 10 ; newline, <LFD>, `C-j'
+ ?\v => 11 ; vertical tab, `C-k'
+ ?\f => 12 ; formfeed character, `C-l'
+ ?\r => 13 ; carriage return, <RET>, `C-m'
+ ?\e => 27 ; escape character, <ESC>, `C-['
+ ?\\ => 92 ; backslash character, `\'
+
+ These sequences which start with backslash are also known as "escape
+sequences", because backslash plays the role of an escape character;
+this usage has nothing to do with the character <ESC>.
+
+ Control characters may be represented using yet another read syntax.
+This consists of a question mark followed by a backslash, caret, and the
+corresponding non-control character, in either upper or lower case. For
+example, both `?\^I' and `?\^i' are valid read syntax for the character
+`C-i', the character whose value is 9.
+
+ Instead of the `^', you can use `C-'; thus, `?\C-i' is equivalent to
+`?\^I' and to `?\^i':
+
+ ;; Under XEmacs 20:
+ ?\^I => ?\t ?\C-I => ?\t
+ (char-int ?\^I) => 9
+ ;; Under XEmacs 19:
+ ?\^I => 9 ?\C-I => 9
+
+ There is also a character read syntax beginning with `\M-'. This
+sets the high bit of the character code (same as adding 128 to the
+character code). For example, `?\M-A' stands for the character with
+character code 193, or 128 plus 65. You should _not_ use this syntax
+in your programs. It is a holdover of yet another confoundance disease
+from earlier Emacsen. (This was used to represent keyboard input with
+the <META> key set, thus the `M'; however, it conflicts with the
+legitimate ISO-8859-1 interpretation of the character code. For
+example, character code 193 is a lowercase `a' with an acute accent, in
+ISO-8859-1.)
+
+ Finally, the most general read syntax consists of a question mark
+followed by a backslash and the character code in octal (up to three
+octal digits); thus, `?\101' for the character `A', `?\001' for the
+character `C-a', and `?\002' for the character `C-b'. Although this
+syntax can represent any ASCII character, it is preferred only when the
+precise octal value is more important than the ASCII representation.
+
+ ;; Under XEmacs 20:
+ ?\012 => ?\n ?\n => ?\n ?\C-j => ?\n
+ ?\101 => ?A ?A => ?A
+ ;; Under XEmacs 19:
+ ?\012 => 10 ?\n => 10 ?\C-j => 10
+ ?\101 => 65 ?A => 65
+
+ A backslash is allowed, and harmless, preceding any character without
+a special escape meaning; thus, `?\+' is equivalent to `?+'. There is
+no reason to add a backslash before most characters. However, you
+should add a backslash before any of the characters `()\|;'`"#.,' to
+avoid confusing the Emacs commands for editing Lisp code. Also add a
+backslash before whitespace characters such as space, tab, newline and
+formfeed. However, it is cleaner to use one of the easily readable
+escape sequences, such as `\t', instead of an actual whitespace
+character such as a tab.
+
+\1f
+File: lispref.info, Node: Symbol Type, Next: Sequence Type, Prev: Character Type, Up: Programming Types
+
+Symbol Type
+-----------
+
+A "symbol" in XEmacs Lisp is an object with a name. The symbol name
+serves as the printed representation of the symbol. In ordinary use,
+the name is unique--no two symbols have the same name.
+
+ A symbol can serve as a variable, as a function name, or to hold a
+property list. Or it may serve only to be distinct from all other Lisp
+objects, so that its presence in a data structure may be recognized
+reliably. In a given context, usually only one of these uses is
+intended. But you can use one symbol in all of these ways,
+independently.
+
+ A symbol name can contain any characters whatever. Most symbol names
+are written with letters, digits, and the punctuation characters
+`-+=*/'. Such names require no special punctuation; the characters of
+the name suffice as long as the name does not look like a number. (If
+it does, write a `\' at the beginning of the name to force
+interpretation as a symbol.) The characters `_~!@$%^&:<>{}' are less
+often used but also require no special punctuation. Any other
+characters may be included in a symbol's name by escaping them with a
+backslash. In contrast to its use in strings, however, a backslash in
+the name of a symbol simply quotes the single character that follows the
+backslash. For example, in a string, `\t' represents a tab character;
+in the name of a symbol, however, `\t' merely quotes the letter `t'.
+To have a symbol with a tab character in its name, you must actually
+use a tab (preceded with a backslash). But it's rare to do such a
+thing.
+
+ Common Lisp note: In Common Lisp, lower case letters are always
+ "folded" to upper case, unless they are explicitly escaped. In
+ Emacs Lisp, upper case and lower case letters are distinct.
+
+ Here are several examples of symbol names. Note that the `+' in the
+fifth example is escaped to prevent it from being read as a number.
+This is not necessary in the sixth example because the rest of the name
+makes it invalid as a number.
+
+ foo ; A symbol named `foo'.
+ FOO ; A symbol named `FOO', different from `foo'.
+ char-to-string ; A symbol named `char-to-string'.
+ 1+ ; A symbol named `1+'
+ ; (not `+1', which is an integer).
+ \+1 ; A symbol named `+1'
+ ; (not a very readable name).
+ \(*\ 1\ 2\) ; A symbol named `(* 1 2)' (a worse name).
+ +-*/_~!@$%^&=:<>{} ; A symbol named `+-*/_~!@$%^&=:<>{}'.
+ ; These characters need not be escaped.
+
+\1f
+File: lispref.info, Node: Sequence Type, Next: Cons Cell Type, Prev: Symbol Type, Up: Programming Types
+
+Sequence Types
+--------------
+
+A "sequence" is a Lisp object that represents an ordered set of
+elements. There are two kinds of sequence in XEmacs Lisp, lists and
+arrays. Thus, an object of type list or of type array is also
+considered a sequence.
+
+ Arrays are further subdivided into strings, vectors, and bit vectors.
+Vectors can hold elements of any type, but string elements must be
+characters, and bit vector elements must be either 0 or 1. However, the
+characters in a string can have extents (*note Extents::) and text
+properties (*note Text Properties::) like characters in a buffer;
+vectors do not support extents or text properties even when their
+elements happen to be characters.
+
+ Lists, strings, vectors, and bit vectors are different, but they have
+important similarities. For example, all have a length L, and all have
+elements which can be indexed from zero to L minus one. Also, several
+functions, called sequence functions, accept any kind of sequence. For
+example, the function `elt' can be used to extract an element of a
+sequence, given its index. *Note Sequences Arrays Vectors::.
+
+ It is impossible to read the same sequence twice, since sequences are
+always created anew upon reading. If you read the read syntax for a
+sequence twice, you get two sequences with equal contents. There is one
+exception: the empty list `()' always stands for the same object, `nil'.
+
+\1f
+File: lispref.info, Node: Cons Cell Type, Next: Array Type, Prev: Sequence Type, Up: Programming Types
+
+Cons Cell and List Types
+------------------------
+
+A "cons cell" is an object comprising two pointers named the CAR and
+the CDR. Each of them can point to any Lisp object.
+
+ A "list" is a series of cons cells, linked together so that the CDR
+of each cons cell points either to another cons cell or to the empty
+list. *Note Lists::, for functions that work on lists. Because most
+cons cells are used as part of lists, the phrase "list structure" has
+come to refer to any structure made out of cons cells.
+
+ The names CAR and CDR have only historical meaning now. The
+original Lisp implementation ran on an IBM 704 computer which divided
+words into two parts, called the "address" part and the "decrement";
+CAR was an instruction to extract the contents of the address part of a
+register, and CDR an instruction to extract the contents of the
+decrement. By contrast, "cons cells" are named for the function `cons'
+that creates them, which in turn is named for its purpose, the
+construction of cells.
+
+ Because cons cells are so central to Lisp, we also have a word for
+"an object which is not a cons cell". These objects are called "atoms".
+
+ The read syntax and printed representation for lists are identical,
+and consist of a left parenthesis, an arbitrary number of elements, and
+a right parenthesis.
+
+ Upon reading, each object inside the parentheses becomes an element
+of the list. That is, a cons cell is made for each element. The CAR
+of the cons cell points to the element, and its CDR points to the next
+cons cell of the list, which holds the next element in the list. The
+CDR of the last cons cell is set to point to `nil'.
+
+ A list can be illustrated by a diagram in which the cons cells are
+shown as pairs of boxes. (The Lisp reader cannot read such an
+illustration; unlike the textual notation, which can be understood by
+both humans and computers, the box illustrations can be understood only
+by humans.) The following represents the three-element list `(rose
+violet buttercup)':
+
+ ___ ___ ___ ___ ___ ___
+ |___|___|--> |___|___|--> |___|___|--> nil
+ | | |
+ | | |
+ --> rose --> violet --> buttercup
+
+ In this diagram, each box represents a slot that can refer to any
+Lisp object. Each pair of boxes represents a cons cell. Each arrow is
+a reference to a Lisp object, either an atom or another cons cell.
+
+ In this example, the first box, the CAR of the first cons cell,
+refers to or "contains" `rose' (a symbol). The second box, the CDR of
+the first cons cell, refers to the next pair of boxes, the second cons
+cell. The CAR of the second cons cell refers to `violet' and the CDR
+refers to the third cons cell. The CDR of the third (and last) cons
+cell refers to `nil'.
+
+ Here is another diagram of the same list, `(rose violet buttercup)',
+sketched in a different manner:
+
+ --------------- ---------------- -------------------
+ | car | cdr | | car | cdr | | car | cdr |
+ | rose | o-------->| violet | o-------->| buttercup | nil |
+ | | | | | | | | |
+ --------------- ---------------- -------------------
+
+ A list with no elements in it is the "empty list"; it is identical
+to the symbol `nil'. In other words, `nil' is both a symbol and a list.
+
+ Here are examples of lists written in Lisp syntax:
+
+ (A 2 "A") ; A list of three elements.
+ () ; A list of no elements (the empty list).
+ nil ; A list of no elements (the empty list).
+ ("A ()") ; A list of one element: the string `"A ()"'.
+ (A ()) ; A list of two elements: `A' and the empty list.
+ (A nil) ; Equivalent to the previous.
+ ((A B C)) ; A list of one element
+ ; (which is a list of three elements).
+
+ Here is the list `(A ())', or equivalently `(A nil)', depicted with
+boxes and arrows:
+
+ ___ ___ ___ ___
+ |___|___|--> |___|___|--> nil
+ | |
+ | |
+ --> A --> nil
+
+* Menu:
+
+* Dotted Pair Notation:: An alternative syntax for lists.
+* Association List Type:: A specially constructed list.
+
+\1f
+File: lispref.info, Node: Dotted Pair Notation, Next: Association List Type, Up: Cons Cell Type
+
+Dotted Pair Notation
+....................
+
+"Dotted pair notation" is an alternative syntax for cons cells that
+represents the CAR and CDR explicitly. In this syntax, `(A . B)'
+stands for a cons cell whose CAR is the object A, and whose CDR is the
+object B. Dotted pair notation is therefore more general than list
+syntax. In the dotted pair notation, the list `(1 2 3)' is written as
+`(1 . (2 . (3 . nil)))'. For `nil'-terminated lists, the two
+notations produce the same result, but list notation is usually clearer
+and more convenient when it is applicable. When printing a list, the
+dotted pair notation is only used if the CDR of a cell is not a list.
+
+ Here's how box notation can illustrate dotted pairs. This example
+shows the pair `(rose . violet)':
+
+ ___ ___
+ |___|___|--> violet
+ |
+ |
+ --> rose
+
+ Dotted pair notation can be combined with list notation to represent
+a chain of cons cells with a non-`nil' final CDR. For example, `(rose
+violet . buttercup)' is equivalent to `(rose . (violet . buttercup))'.
+The object looks like this:
+
+ ___ ___ ___ ___
+ |___|___|--> |___|___|--> buttercup
+ | |
+ | |
+ --> rose --> violet
+
+ These diagrams make it evident why `(rose . violet . buttercup)' is
+invalid syntax; it would require a cons cell that has three parts
+rather than two.
+
+ The list `(rose violet)' is equivalent to `(rose . (violet))' and
+looks like this:
+
+ ___ ___ ___ ___
+ |___|___|--> |___|___|--> nil
+ | |
+ | |
+ --> rose --> violet
+
+ Similarly, the three-element list `(rose violet buttercup)' is
+equivalent to `(rose . (violet . (buttercup)))'. It looks like this:
+
+ ___ ___ ___ ___ ___ ___
+ |___|___|--> |___|___|--> |___|___|--> nil
+ | | |
+ | | |
+ --> rose --> violet --> buttercup
+
+\1f
+File: lispref.info, Node: Association List Type, Prev: Dotted Pair Notation, Up: Cons Cell Type
+
+Association List Type
+.....................
+
+An "association list" or "alist" is a specially-constructed list whose
+elements are cons cells. In each element, the CAR is considered a
+"key", and the CDR is considered an "associated value". (In some
+cases, the associated value is stored in the CAR of the CDR.)
+Association lists are often used as stacks, since it is easy to add or
+remove associations at the front of the list.
+
+ For example,
+
+ (setq alist-of-colors
+ '((rose . red) (lily . white) (buttercup . yellow)))
+
+sets the variable `alist-of-colors' to an alist of three elements. In
+the first element, `rose' is the key and `red' is the value.
+
+ *Note Association Lists::, for a further explanation of alists and
+for functions that work on alists.
+
+\1f
+File: lispref.info, Node: Array Type, Next: String Type, Prev: Cons Cell Type, Up: Programming Types
+
+Array Type
+----------
+
+An "array" is composed of an arbitrary number of slots for referring to
+other Lisp objects, arranged in a contiguous block of memory.
+Accessing any element of an array takes the same amount of time. In
+contrast, accessing an element of a list requires time proportional to
+the position of the element in the list. (Elements at the end of a
+list take longer to access than elements at the beginning of a list.)
+
+ XEmacs defines three types of array, strings, vectors, and bit
+vectors. A string is an array of characters, a vector is an array of
+arbitrary objects, and a bit vector is an array of 1's and 0's. All are
+one-dimensional. (Most other programming languages support
+multidimensional arrays, but they are not essential; you can get the
+same effect with an array of arrays.) Each type of array has its own
+read syntax; see *Note String Type::, *Note Vector Type::, and *Note
+Bit Vector Type::.
+
+ An array may have any length up to the largest integer; but once
+created, it has a fixed size. The first element of an array has index
+zero, the second element has index 1, and so on. This is called
+"zero-origin" indexing. For example, an array of four elements has
+indices 0, 1, 2, and 3.
+
+ The array type is contained in the sequence type and contains the
+string type, the vector type, and the bit vector type.
+
+\1f
+File: lispref.info, Node: String Type, Next: Vector Type, Prev: Array Type, Up: Programming Types
+
+String Type
+-----------
+
+A "string" is an array of characters. Strings are used for many
+purposes in XEmacs, as can be expected in a text editor; for example, as
+the names of Lisp symbols, as messages for the user, and to represent
+text extracted from buffers. Strings in Lisp are constants: evaluation
+of a string returns the same string.
+
+ The read syntax for strings is a double-quote, an arbitrary number of
+characters, and another double-quote, `"like this"'. The Lisp reader
+accepts the same formats for reading the characters of a string as it
+does for reading single characters (without the question mark that
+begins a character literal). You can enter a nonprinting character such
+as tab or `C-a' using the convenient escape sequences, like this: `"\t,
+\C-a"'. You can include a double-quote in a string by preceding it
+with a backslash; thus, `"\""' is a string containing just a single
+double-quote character. (*Note Character Type::, for a description of
+the read syntax for characters.)
+
+ The printed representation of a string consists of a double-quote,
+the characters it contains, and another double-quote. However, you must
+escape any backslash or double-quote characters in the string with a
+backslash, like this: `"this \" is an embedded quote"'.
+
+ The newline character is not special in the read syntax for strings;
+if you write a new line between the double-quotes, it becomes a
+character in the string. But an escaped newline--one that is preceded
+by `\'--does not become part of the string; i.e., the Lisp reader
+ignores an escaped newline while reading a string.
+
+ "It is useful to include newlines
+ in documentation strings,
+ but the newline is \
+ ignored if escaped."
+ => "It is useful to include newlines
+ in documentation strings,
+ but the newline is ignored if escaped."
+
+ A string can hold extents and properties of the text it contains, in
+addition to the characters themselves. This enables programs that copy
+text between strings and buffers to preserve the extents and properties
+with no special effort. *Note Extents::, *Note Text Properties::.
+
+ Note that FSF GNU Emacs has a special read and print syntax for
+strings with text properties, but XEmacs does not currently implement
+this. It was judged better not to include this in XEmacs because it
+entails that `equal' return `nil' when passed a string with text
+properties and the equivalent string without text properties, which is
+often counter-intuitive.
+
+ *Note Strings and Characters::, for functions that work on strings.
+
+\1f
+File: lispref.info, Node: Vector Type, Next: Bit Vector Type, Prev: String Type, Up: Programming Types
+
+Vector Type
+-----------
+
+A "vector" is a one-dimensional array of elements of any type. It
+takes a constant amount of time to access any element of a vector. (In
+a list, the access time of an element is proportional to the distance of
+the element from the beginning of the list.)
+
+ The printed representation of a vector consists of a left square
+bracket, the elements, and a right square bracket. This is also the
+read syntax. Like numbers and strings, vectors are considered constants
+for evaluation.
+
+ [1 "two" (three)] ; A vector of three elements.
+ => [1 "two" (three)]
+
+ *Note Vectors::, for functions that work with vectors.
+
+\1f
+File: lispref.info, Node: Bit Vector Type, Next: Function Type, Prev: Vector Type, Up: Programming Types
+
+Bit Vector Type
+---------------
+
+A "bit vector" is a one-dimensional array of 1's and 0's. It takes a
+constant amount of time to access any element of a bit vector, as for
+vectors. Bit vectors have an extremely compact internal representation
+(one machine bit per element), which makes them ideal for keeping track
+of unordered sets, large collections of boolean values, etc.
+
+ The printed representation of a bit vector consists of `#*' followed
+by the bits in the vector. This is also the read syntax. Like
+numbers, strings, and vectors, bit vectors are considered constants for
+evaluation.
+
+ #*00101000 ; A bit vector of eight elements.
+ => #*00101000
+
+ *Note Bit Vectors::, for functions that work with bit vectors.
+
+\1f
+File: lispref.info, Node: Function Type, Next: Macro Type, Prev: Bit Vector Type, Up: Programming Types
+
+Function Type
+-------------
+
+Just as functions in other programming languages are executable, "Lisp
+function" objects are pieces of executable code. However, functions in
+Lisp are primarily Lisp objects, and only secondarily the text which
+represents them. These Lisp objects are lambda expressions: lists
+whose first element is the symbol `lambda' (*note Lambda Expressions::).
+
+ In most programming languages, it is impossible to have a function
+without a name. In Lisp, a function has no intrinsic name. A lambda
+expression is also called an "anonymous function" (*note Anonymous
+Functions::). A named function in Lisp is actually a symbol with a
+valid function in its function cell (*note Defining Functions::).
+
+ Most of the time, functions are called when their names are written
+in Lisp expressions in Lisp programs. However, you can construct or
+obtain a function object at run time and then call it with the primitive
+functions `funcall' and `apply'. *Note Calling Functions::.
+
+\1f
+File: lispref.info, Node: Macro Type, Next: Primitive Function Type, Prev: Function Type, Up: Programming Types
+
+Macro Type
+----------
+
+A "Lisp macro" is a user-defined construct that extends the Lisp
+language. It is represented as an object much like a function, but with
+different parameter-passing semantics. A Lisp macro has the form of a
+list whose first element is the symbol `macro' and whose CDR is a Lisp
+function object, including the `lambda' symbol.
+
+ Lisp macro objects are usually defined with the built-in `defmacro'
+function, but any list that begins with `macro' is a macro as far as
+XEmacs is concerned. *Note Macros::, for an explanation of how to
+write a macro.
+
+\1f
+File: lispref.info, Node: Primitive Function Type, Next: Compiled-Function Type, Prev: Macro Type, Up: Programming Types
+
+Primitive Function Type
+-----------------------
+
+A "primitive function" is a function callable from Lisp but written in
+the C programming language. Primitive functions are also called
+"subrs" or "built-in functions". (The word "subr" is derived from
+"subroutine".) Most primitive functions evaluate all their arguments
+when they are called. A primitive function that does not evaluate all
+its arguments is called a "special form" (*note Special Forms::).
+
+ It does not matter to the caller of a function whether the function
+is primitive. However, this does matter if you try to substitute a
+function written in Lisp for a primitive of the same name. The reason
+is that the primitive function may be called directly from C code.
+Calls to the redefined function from Lisp will use the new definition,
+but calls from C code may still use the built-in definition.
+
+ The term "function" refers to all Emacs functions, whether written
+in Lisp or C. *Note Function Type::, for information about the
+functions written in Lisp.
+
+ Primitive functions have no read syntax and print in hash notation
+with the name of the subroutine.
+
+ (symbol-function 'car) ; Access the function cell
+ ; of the symbol.
+ => #<subr car>
+ (subrp (symbol-function 'car)) ; Is this a primitive function?
+ => t ; Yes.
+
+\1f
+File: lispref.info, Node: Compiled-Function Type, Next: Autoload Type, Prev: Primitive Function Type, Up: Programming Types
+
+Compiled-Function Type
+----------------------
+
+The byte compiler produces "compiled-function objects". The evaluator
+handles this data type specially when it appears as a function to be
+called. *Note Byte Compilation::, for information about the byte
+compiler.
+
+ The printed representation for a compiled-function object is normally
+`#<compiled-function...>'. If `print-readably' is true, however, it is
+`#[...]'.
+
+\1f
+File: lispref.info, Node: Autoload Type, Next: Char Table Type, Prev: Compiled-Function Type, Up: Programming Types
+
+Autoload Type
+-------------
+
+An "autoload object" is a list whose first element is the symbol
+`autoload'. It is stored as the function definition of a symbol as a
+placeholder for the real definition; it says that the real definition
+is found in a file of Lisp code that should be loaded when necessary.
+The autoload object contains the name of the file, plus some other
+information about the real definition.
+
+ After the file has been loaded, the symbol should have a new function
+definition that is not an autoload object. The new definition is then
+called as if it had been there to begin with. From the user's point of
+view, the function call works as expected, using the function definition
+in the loaded file.
+
+ An autoload object is usually created with the function `autoload',
+which stores the object in the function cell of a symbol. *Note
+Autoload::, for more details.
+
+\1f
+File: lispref.info, Node: Char Table Type, Next: Hash Table Type, Prev: Autoload Type, Up: Programming Types
+
+Char Table Type
+---------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Hash Table Type, Next: Range Table Type, Prev: Char Table Type, Up: Programming Types
+
+Hash Table Type
+---------------
+
+A "hash table" is a table providing an arbitrary mapping from one Lisp
+object to another, using an internal indexing method called "hashing".
+Hash tables are very fast (much more efficient that using an
+association list, when there are a large number of elements in the
+table).
+
+ Hash tables have a special read syntax beginning with
+`#s(hash-table' (this is an example of "structure" read syntax. This
+notation is also used for printing when `print-readably' is `t'.
+
+ Otherwise they print in hash notation (The "hash" in "hash notation"
+has nothing to do with the "hash" in "hash table"), giving the number
+of elements, total space allocated for elements, and a unique number
+assigned at the time the hash table was created. (Hash tables
+automatically resize as necessary so there is no danger of running out
+of space for elements.)
+
+ (make-hash-table :size 50)
+ => #<hash-table 0/107 0x313a>
+
+ *Note Hash Tables::, for information on how to create and work with
+hash tables.
+
+\1f
+File: lispref.info, Node: Range Table Type, Next: Weak List Type, Prev: Hash Table Type, Up: Programming Types
+
+Range Table Type
+----------------
+
+A "range table" is a table that maps from ranges of integers to
+arbitrary Lisp objects. Range tables automatically combine overlapping
+ranges that map to the same Lisp object, and operations are provided
+for mapping over all of the ranges in a range table.
+
+ Range tables have a special read syntax beginning with
+`#s(range-table' (this is an example of "structure" read syntax, which
+is also used for char tables and faces).
+
+ (setq x (make-range-table))
+ (put-range-table 20 50 'foo x)
+ (put-range-table 100 200 "bar" x)
+ x
+ => #s(range-table data ((20 50) foo (100 200) "bar"))
+
+ *Note Range Tables::, for information on how to create and work with
+range tables.
+
+\1f
+File: lispref.info, Node: Weak List Type, Prev: Range Table Type, Up: Programming Types
+
+Weak List Type
+--------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Editing Types, Next: Window-System Types, Prev: Programming Types, Up: Lisp Data Types
+
+Editing Types
+=============
+
+The types in the previous section are common to many Lisp dialects.
+XEmacs Lisp provides several additional data types for purposes
+connected with editing.
+
+* Menu:
+
+* Buffer Type:: The basic object of editing.
+* Marker Type:: A position in a buffer.
+* Extent Type:: A range in a buffer or string, maybe with properties.
+* Window Type:: Buffers are displayed in windows.
+* Frame Type:: Windows subdivide frames.
+* Device Type:: Devices group all frames on a display.
+* Console Type:: Consoles group all devices with the same keyboard.
+* Window Configuration Type:: Recording the way a frame is subdivided.
+* Event Type:: An interesting occurrence in the system.
+* Process Type:: A process running on the underlying OS.
+* Stream Type:: Receive or send characters.
+* Keymap Type:: What function a keystroke invokes.
+* Syntax Table Type:: What a character means.
+* Display Table Type:: How display tables are represented.
+* Database Type:: A connection to an external DBM or DB database.
+* Charset Type:: A character set (e.g. all Kanji characters),
+ under XEmacs/MULE.
+* Coding System Type:: An object encapsulating a way of converting between
+ different textual encodings, under XEmacs/MULE.
+* ToolTalk Message Type:: A message, in the ToolTalk IPC protocol.
+* ToolTalk Pattern Type:: A pattern, in the ToolTalk IPC protocol.
+
+\1f
+File: lispref.info, Node: Buffer Type, Next: Marker Type, Up: Editing Types
+
+Buffer Type
+-----------
+
+A "buffer" is an object that holds text that can be edited (*note
+Buffers::). Most buffers hold the contents of a disk file (*note
+Files::) so they can be edited, but some are used for other purposes.
+Most buffers are also meant to be seen by the user, and therefore
+displayed, at some time, in a window (*note Windows::). But a buffer
+need not be displayed in any window.
+
+ The contents of a buffer are much like a string, but buffers are not
+used like strings in XEmacs Lisp, and the available operations are
+different. For example, insertion of text into a buffer is very
+efficient, whereas "inserting" text into a string requires
+concatenating substrings, and the result is an entirely new string
+object.
+
+ Each buffer has a designated position called "point" (*note
+Positions::). At any time, one buffer is the "current buffer". Most
+editing commands act on the contents of the current buffer in the
+neighborhood of point. Many of the standard Emacs functions manipulate
+or test the characters in the current buffer; a whole chapter in this
+manual is devoted to describing these functions (*note Text::).
+
+ Several other data structures are associated with each buffer:
+
+ * a local syntax table (*note Syntax Tables::);
+
+ * a local keymap (*note Keymaps::);
+
+ * a local variable binding list (*note Buffer-Local Variables::);
+
+ * a list of extents (*note Extents::);
+
+ * and various other related properties.
+
+The local keymap and variable list contain entries that individually
+override global bindings or values. These are used to customize the
+behavior of programs in different buffers, without actually changing the
+programs.
+
+ A buffer may be "indirect", which means it shares the text of
+another buffer. *Note Indirect Buffers::.
+
+ Buffers have no read syntax. They print in hash notation, showing
+the buffer name.
+
+ (current-buffer)
+ => #<buffer "objects.texi">
+
+\1f
+File: lispref.info, Node: Marker Type, Next: Extent Type, Prev: Buffer Type, Up: Editing Types
+
+Marker Type
+-----------
+
+A "marker" denotes a position in a specific buffer. Markers therefore
+have two components: one for the buffer, and one for the position.
+Changes in the buffer's text automatically relocate the position value
+as necessary to ensure that the marker always points between the same
+two characters in the buffer.
+
+ Markers have no read syntax. They print in hash notation, giving the
+current character position and the name of the buffer.
+
+ (point-marker)
+ => #<marker at 50661 in objects.texi>
+
+ *Note Markers::, for information on how to test, create, copy, and
+move markers.
+
+\1f
+File: lispref.info, Node: Extent Type, Next: Window Type, Prev: Marker Type, Up: Editing Types
+
+Extent Type
+-----------
+
+An "extent" specifies temporary alteration of the display appearance of
+a part of a buffer (or string). It contains markers delimiting a range
+of the buffer, plus a property list (a list whose elements are
+alternating property names and values). Extents are used to present
+parts of the buffer temporarily in a different display style. They
+have no read syntax, and print in hash notation, giving the buffer name
+and range of positions.
+
+ Extents can exist over strings as well as buffers; the primary use
+of this is to preserve extent and text property information as text is
+copied from one buffer to another or between different parts of a
+buffer.
+
+ Extents have no read syntax. They print in hash notation, giving the
+range of text they cover, the name of the buffer or string they are in,
+the address in core, and a summary of some of the properties attached to
+the extent.
+
+ (extent-at (point))
+ => #<extent [51742, 51748) font-lock text-prop 0x90121e0 in buffer objects.texi>
+
+ *Note Extents::, for how to create and use extents.
+
+ Extents are used to implement text properties. *Note Text
+Properties::.
+
+\1f
+File: lispref.info, Node: Window Type, Next: Frame Type, Prev: Extent Type, Up: Editing Types
+
+Window Type
+-----------
+
+A "window" describes the portion of the frame that XEmacs uses to
+display a buffer. (In standard window-system usage, a "window" is what
+XEmacs calls a "frame"; XEmacs confusingly uses the term "window" to
+refer to what is called a "pane" in standard window-system usage.)
+Every window has one associated buffer, whose contents appear in the
+window. By contrast, a given buffer may appear in one window, no
+window, or several windows.
+
+ Though many windows may exist simultaneously, at any time one window
+is designated the "selected window". This is the window where the
+cursor is (usually) displayed when XEmacs is ready for a command. The
+selected window usually displays the current buffer, but this is not
+necessarily the case.
+
+ Windows are grouped on the screen into frames; each window belongs to
+one and only one frame. *Note Frame Type::.
+
+ Windows have no read syntax. They print in hash notation, giving the
+name of the buffer being displayed and a unique number assigned at the
+time the window was created. (This number can be useful because the
+buffer displayed in any given window can change frequently.)
+
+ (selected-window)
+ => #<window on "objects.texi" 0x266c>
+
+ *Note Windows::, for a description of the functions that work on
+windows.
+
+\1f
+File: lispref.info, Node: Frame Type, Next: Device Type, Prev: Window Type, Up: Editing Types
+
+Frame Type
+----------
+
+A FRAME is a rectangle on the screen (a "window" in standard
+window-system terminology) that contains one or more non-overlapping
+Emacs windows ("panes" in standard window-system terminology). A frame
+initially contains a single main window (plus perhaps a minibuffer
+window) which you can subdivide vertically or horizontally into smaller
+windows.
+
+ Frames have no read syntax. They print in hash notation, giving the
+frame's type, name as used for resourcing, and a unique number assigned
+at the time the frame was created.
+
+ (selected-frame)
+ => #<x-frame "emacs" 0x9db>
+
+ *Note Frames::, for a description of the functions that work on
+frames.
+
+\1f
+File: lispref.info, Node: Device Type, Next: Console Type, Prev: Frame Type, Up: Editing Types
+
+Device Type
+-----------
+
+A "device" represents a single display on which frames exist.
+Normally, there is only one device object, but there may be more than
+one if XEmacs is being run on a multi-headed display (e.g. an X server
+with attached color and mono screens) or if XEmacs is simultaneously
+driving frames attached to different consoles, e.g. an X display and a
+TTY connection.
+
+ Devices do not have a read syntax. They print in hash notation,
+giving the device's type, connection name, and a unique number assigned
+at the time the device was created.
+
+ (selected-device)
+ => #<x-device on ":0.0" 0x5b9>
+
+ *Note Consoles and Devices::, for a description of several functions
+related to devices.
+
+\1f
+File: lispref.info, Node: Console Type, Next: Window Configuration Type, Prev: Device Type, Up: Editing Types
+
+Console Type
+------------
+
+A "console" represents a single keyboard to which devices (i.e.
+displays on which frames exist) are connected. Normally, there is only
+one console object, but there may be more than one if XEmacs is
+simultaneously driving frames attached to different X servers and/or
+TTY connections. (XEmacs is capable of driving multiple X and TTY
+connections at the same time, and provides a robust mechanism for
+handling the differing display capabilities of such heterogeneous
+environments. A buffer with embedded glyphs and multiple fonts and
+colors, for example, will display reasonably if it simultaneously
+appears on a frame on a color X display, a frame on a mono X display,
+and a frame on a TTY connection.)
+
+ Consoles do not have a read syntax. They print in hash notation,
+giving the console's type, connection name, and a unique number assigned
+at the time the console was created.
+
+ (selected-console)
+ => #<x-console on "localhost:0" 0x5b7>
+
+ *Note Consoles and Devices::, for a description of several functions
+related to consoles.
+
+\1f
+File: lispref.info, Node: Window Configuration Type, Next: Event Type, Prev: Console Type, Up: Editing Types
+
+Window Configuration Type
+-------------------------
+
+A "window configuration" stores information about the positions, sizes,
+and contents of the windows in a frame, so you can recreate the same
+arrangement of windows later.
+
+ Window configurations do not have a read syntax. They print in hash
+notation, giving a unique number assigned at the time the window
+configuration was created.
+
+ (current-window-configuration)
+ => #<window-configuration 0x2db4>
+
+ *Note Window Configurations::, for a description of several functions
+related to window configurations.
+
+\1f
+File: lispref.info, Node: Event Type, Next: Process Type, Prev: Window Configuration Type, Up: Editing Types
+
+Event Type
+----------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Process Type, Next: Stream Type, Prev: Event Type, Up: Editing Types
+
+Process Type
+------------
+
+The word "process" usually means a running program. XEmacs itself runs
+in a process of this sort. However, in XEmacs Lisp, a process is a
+Lisp object that designates a subprocess created by the XEmacs process.
+Programs such as shells, GDB, ftp, and compilers, running in
+subprocesses of XEmacs, extend the capabilities of XEmacs.
+
+ An Emacs subprocess takes textual input from Emacs and returns
+textual output to Emacs for further manipulation. Emacs can also send
+signals to the subprocess.
+
+ Process objects have no read syntax. They print in hash notation,
+giving the name of the process, its associated process ID, and the
+current state of the process:
+
+ (process-list)
+ => (#<process "shell" pid 2909 state:run>)
+
+ *Note Processes::, for information about functions that create,
+delete, return information about, send input or signals to, and receive
+output from processes.
+
+\1f
+File: lispref.info, Node: Stream Type, Next: Keymap Type, Prev: Process Type, Up: Editing Types
+
+Stream Type
+-----------
+
+A "stream" is an object that can be used as a source or sink for
+characters--either to supply characters for input or to accept them as
+output. Many different types can be used this way: markers, buffers,
+strings, and functions. Most often, input streams (character sources)
+obtain characters from the keyboard, a buffer, or a file, and output
+streams (character sinks) send characters to a buffer, such as a
+`*Help*' buffer, or to the echo area.
+
+ The object `nil', in addition to its other meanings, may be used as
+a stream. It stands for the value of the variable `standard-input' or
+`standard-output'. Also, the object `t' as a stream specifies input
+using the minibuffer (*note Minibuffers::) or output in the echo area
+(*note The Echo Area::).
+
+ Streams have no special printed representation or read syntax, and
+print as whatever primitive type they are.
+
+ *Note Read and Print::, for a description of functions related to
+streams, including parsing and printing functions.
+
+\1f
+File: lispref.info, Node: Keymap Type, Next: Syntax Table Type, Prev: Stream Type, Up: Editing Types
+
+Keymap Type
+-----------
+
+A "keymap" maps keys typed by the user to commands. This mapping
+controls how the user's command input is executed.
+
+ NOTE: In XEmacs, a keymap is a separate primitive type. In FSF GNU
+Emacs, a keymap is actually a list whose CAR is the symbol `keymap'.
+
+ *Note Keymaps::, for information about creating keymaps, handling
+prefix keys, local as well as global keymaps, and changing key bindings.
+
+\1f
+File: lispref.info, Node: Syntax Table Type, Next: Display Table Type, Prev: Keymap Type, Up: Editing Types
+
+Syntax Table Type
+-----------------
+
+Under XEmacs 20, a "syntax table" is a particular type of char table.
+Under XEmacs 19, a syntax table a vector of 256 integers. In both
+cases, each element defines how one character is interpreted when it
+appears in a buffer. For example, in C mode (*note Major Modes::), the
+`+' character is punctuation, but in Lisp mode it is a valid character
+in a symbol. These modes specify different interpretations by changing
+the syntax table entry for `+'.
+
+ Syntax tables are used only for scanning text in buffers, not for
+reading Lisp expressions. The table the Lisp interpreter uses to read
+expressions is built into the XEmacs source code and cannot be changed;
+thus, to change the list delimiters to be `{' and `}' instead of `('
+and `)' would be impossible.
+
+ *Note Syntax Tables::, for details about syntax classes and how to
+make and modify syntax tables.
+
+\1f
+File: lispref.info, Node: Display Table Type, Next: Database Type, Prev: Syntax Table Type, Up: Editing Types
+
+Display Table Type
+------------------
+
+A "display table" specifies how to display each character code. Each
+buffer and each window can have its own display table. A display table
+is actually a vector of length 256, although in XEmacs 20 this may
+change to be a particular type of char table. *Note Display Tables::.
+
+\1f
+File: lispref.info, Node: Database Type, Next: Charset Type, Prev: Display Table Type, Up: Editing Types
+
+Database Type
+-------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Charset Type, Next: Coding System Type, Prev: Database Type, Up: Editing Types
+
+Charset Type
+------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Coding System Type, Next: ToolTalk Message Type, Prev: Charset Type, Up: Editing Types
+
+Coding System Type
+------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: ToolTalk Message Type, Next: ToolTalk Pattern Type, Prev: Coding System Type, Up: Editing Types
+
+ToolTalk Message Type
+---------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: ToolTalk Pattern Type, Prev: ToolTalk Message Type, Up: Editing Types
+
+ToolTalk Pattern Type
+---------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Window-System Types, Next: Type Predicates, Prev: Editing Types, Up: Lisp Data Types
+
+Window-System Types
+===================
+
+XEmacs also has some types that represent objects such as faces
+(collections of display characters), fonts, and pixmaps that are
+commonly found in windowing systems.
+
+* Menu:
+
+* Face Type:: A collection of display characteristics.
+* Glyph Type:: An image appearing in a buffer or elsewhere.
+* Specifier Type:: A way of controlling display characteristics on
+ a per-buffer, -frame, -window, or -device level.
+* Font Instance Type:: The way a font appears on a particular device.
+* Color Instance Type:: The way a color appears on a particular device.
+* Image Instance Type:: The way an image appears on a particular device.
+* Toolbar Button Type:: An object representing a button in a toolbar.
+* Subwindow Type:: An externally-controlled window-system window
+ appearing in a buffer.
+* X Resource Type:: A miscellaneous X resource, if Epoch support was
+ compiled into XEmacs.
+
+\1f
+File: lispref.info, Node: Face Type, Next: Glyph Type, Up: Window-System Types
+
+Face Type
+---------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Glyph Type, Next: Specifier Type, Prev: Face Type, Up: Window-System Types
+
+Glyph Type
+----------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Specifier Type, Next: Font Instance Type, Prev: Glyph Type, Up: Window-System Types
+
+Specifier Type
+--------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Font Instance Type, Next: Color Instance Type, Prev: Specifier Type, Up: Window-System Types
+
+Font Instance Type
+------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Color Instance Type, Next: Image Instance Type, Prev: Font Instance Type, Up: Window-System Types
+
+Color Instance Type
+-------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Image Instance Type, Next: Toolbar Button Type, Prev: Color Instance Type, Up: Window-System Types
+
+Image Instance Type
+-------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Toolbar Button Type, Next: Subwindow Type, Prev: Image Instance Type, Up: Window-System Types
+
+Toolbar Button Type
+-------------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Subwindow Type, Next: X Resource Type, Prev: Toolbar Button Type, Up: Window-System Types
+
+Subwindow Type
+--------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: X Resource Type, Prev: Subwindow Type, Up: Window-System Types
+
+X Resource Type
+---------------
+
+(not yet documented)
+
+\1f
+File: lispref.info, Node: Type Predicates, Next: Equality Predicates, Prev: Window-System Types, Up: Lisp Data Types
+
+Type Predicates
+===============
+
+The XEmacs Lisp interpreter itself does not perform type checking on
+the actual arguments passed to functions when they are called. It could
+not do so, since function arguments in Lisp do not have declared data
+types, as they do in other programming languages. It is therefore up to
+the individual function to test whether each actual argument belongs to
+a type that the function can use.
+
+ All built-in functions do check the types of their actual arguments
+when appropriate, and signal a `wrong-type-argument' error if an
+argument is of the wrong type. For example, here is what happens if you
+pass an argument to `+' that it cannot handle:
+
+ (+ 2 'a)
+ error--> Wrong type argument: integer-or-marker-p, a
+
+ If you want your program to handle different types differently, you
+must do explicit type checking. The most common way to check the type
+of an object is to call a "type predicate" function. Emacs has a type
+predicate for each type, as well as some predicates for combinations of
+types.
+
+ A type predicate function takes one argument; it returns `t' if the
+argument belongs to the appropriate type, and `nil' otherwise.
+Following a general Lisp convention for predicate functions, most type
+predicates' names end with `p'.
+
+ Here is an example which uses the predicates `listp' to check for a
+list and `symbolp' to check for a symbol.
+
+ (defun add-on (x)
+ (cond ((symbolp x)
+ ;; If X is a symbol, put it on LIST.
+ (setq list (cons x list)))
+ ((listp x)
+ ;; If X is a list, add its elements to LIST.
+ (setq list (append x list)))
+ (t
+ ;; We only handle symbols and lists.
+ (error "Invalid argument %s in add-on" x))))
+
+ Here is a table of predefined type predicates, in alphabetical order,
+with references to further information.
+
+`annotationp'
+ *Note annotationp: Annotation Primitives.
+
+`arrayp'
+ *Note arrayp: Array Functions.
+
+`atom'
+ *Note atom: List-related Predicates.
+
+`bit-vector-p'
+ *Note bit-vector-p: Bit Vector Functions.
+
+`bitp'
+ *Note bitp: Bit Vector Functions.
+
+`boolean-specifier-p'
+ *Note boolean-specifier-p: Specifier Types.
+
+`buffer-glyph-p'
+ *Note buffer-glyph-p: Glyph Types.
+
+`buffer-live-p'
+ *Note buffer-live-p: Killing Buffers.
+
+`bufferp'
+ *Note bufferp: Buffer Basics.
+
+`button-event-p'
+ *Note button-event-p: Event Predicates.
+
+`button-press-event-p'
+ *Note button-press-event-p: Event Predicates.
+
+`button-release-event-p'
+ *Note button-release-event-p: Event Predicates.
+
+`case-table-p'
+ *Note case-table-p: Case Tables.
+
+`char-int-p'
+ *Note char-int-p: Character Codes.
+
+`char-or-char-int-p'
+ *Note char-or-char-int-p: Character Codes.
+
+`char-or-string-p'
+ *Note char-or-string-p: Predicates for Strings.
+
+`char-table-p'
+ *Note char-table-p: Char Tables.
+
+`characterp'
+ *Note characterp: Predicates for Characters.
+
+`color-instance-p'
+ *Note color-instance-p: Colors.
+
+`color-pixmap-image-instance-p'
+ *Note color-pixmap-image-instance-p: Image Instance Types.
+
+`color-specifier-p'
+ *Note color-specifier-p: Specifier Types.
+
+`commandp'
+ *Note commandp: Interactive Call.
+
+`compiled-function-p'
+ *Note compiled-function-p: Compiled-Function Type.
+
+`console-live-p'
+ *Note console-live-p: Connecting to a Console or Device.
+
+`consolep'
+ *Note consolep: Consoles and Devices.
+
+`consp'
+ *Note consp: List-related Predicates.
+
+`database-live-p'
+ *Note database-live-p: Connecting to a Database.
+
+`databasep'
+ *Note databasep: Databases.
+
+`device-live-p'
+ *Note device-live-p: Connecting to a Console or Device.
+
+`device-or-frame-p'
+ *Note device-or-frame-p: Basic Device Functions.
+
+`devicep'
+ *Note devicep: Consoles and Devices.
+
+`eval-event-p'
+ *Note eval-event-p: Event Predicates.
+
+`event-live-p'
+ *Note event-live-p: Event Predicates.
+
+`eventp'
+ *Note eventp: Events.
+
+`extent-live-p'
+ *Note extent-live-p: Creating and Modifying Extents.
+
+`extentp'
+ *Note extentp: Extents.
+
+`face-boolean-specifier-p'
+ *Note face-boolean-specifier-p: Specifier Types.
+
+`facep'
+ *Note facep: Basic Face Functions.
+
+`floatp'
+ *Note floatp: Predicates on Numbers.
+
+`font-instance-p'
+ *Note font-instance-p: Fonts.
+
+`font-specifier-p'
+ *Note font-specifier-p: Specifier Types.
+
+`frame-live-p'
+ *Note frame-live-p: Deleting Frames.
+
+`framep'
+ *Note framep: Frames.
+
+`functionp'
+ (not yet documented)
+
+`generic-specifier-p'
+ *Note generic-specifier-p: Specifier Types.
+
+`glyphp'
+ *Note glyphp: Glyphs.
+
+`hash-table-p'
+ *Note hash-table-p: Hash Tables.
+
+`icon-glyph-p'
+ *Note icon-glyph-p: Glyph Types.
+
+`image-instance-p'
+ *Note image-instance-p: Images.
+
+`image-specifier-p'
+ *Note image-specifier-p: Specifier Types.
+
+`integer-char-or-marker-p'
+ *Note integer-char-or-marker-p: Predicates on Markers.
+
+`integer-or-char-p'
+ *Note integer-or-char-p: Predicates for Characters.
+
+`integer-or-marker-p'
+ *Note integer-or-marker-p: Predicates on Markers.
+
+`integer-specifier-p'
+ *Note integer-specifier-p: Specifier Types.
+
+`integerp'
+ *Note integerp: Predicates on Numbers.
+
+`itimerp'
+ (not yet documented)
+
+`key-press-event-p'
+ *Note key-press-event-p: Event Predicates.
+
+`keymapp'
+ *Note keymapp: Creating Keymaps.
+
+`keywordp'
+ (not yet documented)
+
+`listp'
+ *Note listp: List-related Predicates.
+
+`markerp'
+ *Note markerp: Predicates on Markers.
+
+`misc-user-event-p'
+ *Note misc-user-event-p: Event Predicates.
+
+`mono-pixmap-image-instance-p'
+ *Note mono-pixmap-image-instance-p: Image Instance Types.
+
+`motion-event-p'
+ *Note motion-event-p: Event Predicates.
+
+`mouse-event-p'
+ *Note mouse-event-p: Event Predicates.
+
+`natnum-specifier-p'
+ *Note natnum-specifier-p: Specifier Types.
+
+`natnump'
+ *Note natnump: Predicates on Numbers.
+
+`nlistp'
+ *Note nlistp: List-related Predicates.
+
+`nothing-image-instance-p'
+ *Note nothing-image-instance-p: Image Instance Types.
+
+`number-char-or-marker-p'
+ *Note number-char-or-marker-p: Predicates on Markers.
+
+`number-or-marker-p'
+ *Note number-or-marker-p: Predicates on Markers.
+
+`numberp'
+ *Note numberp: Predicates on Numbers.
+
+`pointer-glyph-p'
+ *Note pointer-glyph-p: Glyph Types.
+
+`pointer-image-instance-p'
+ *Note pointer-image-instance-p: Image Instance Types.
+
+`process-event-p'
+ *Note process-event-p: Event Predicates.
+
+`processp'
+ *Note processp: Processes.
+
+`range-table-p'
+ *Note range-table-p: Range Tables.
+
+`ringp'
+ (not yet documented)
+
+`sequencep'
+ *Note sequencep: Sequence Functions.
+
+`specifierp'
+ *Note specifierp: Specifiers.
+
+`stringp'
+ *Note stringp: Predicates for Strings.
+
+`subrp'
+ *Note subrp: Function Cells.
+
+`subwindow-image-instance-p'
+ *Note subwindow-image-instance-p: Image Instance Types.
+
+`subwindowp'
+ *Note subwindowp: Subwindows.
+
+`symbolp'
+ *Note symbolp: Symbols.
+
+`syntax-table-p'
+ *Note syntax-table-p: Syntax Tables.
+
+`text-image-instance-p'
+ *Note text-image-instance-p: Image Instance Types.
+
+`timeout-event-p'
+ *Note timeout-event-p: Event Predicates.
+
+`toolbar-button-p'
+ *Note toolbar-button-p: Toolbar.
+
+`toolbar-specifier-p'
+ *Note toolbar-specifier-p: Toolbar.
+
+`user-variable-p'
+ *Note user-variable-p: Defining Variables.
+
+`vectorp'
+ *Note vectorp: Vectors.
+
+`weak-list-p'
+ *Note weak-list-p: Weak Lists.
+
+`window-configuration-p'
+ *Note window-configuration-p: Window Configurations.
+
+`window-live-p'
+ *Note window-live-p: Deleting Windows.
+
+`windowp'
+ *Note windowp: Basic Windows.
+
+ The most general way to check the type of an object is to call the
+function `type-of'. Recall that each object belongs to one and only
+one primitive type; `type-of' tells you which one (*note Lisp Data
+Types::). But `type-of' knows nothing about non-primitive types. In
+most cases, it is more convenient to use type predicates than `type-of'.
+
+ - Function: type-of object
+ This function returns a symbol naming the primitive type of
+ OBJECT. The value is one of `bit-vector', `buffer', `char-table',
+ `character', `charset', `coding-system', `cons', `color-instance',
+ `compiled-function', `console', `database', `device', `event',
+ `extent', `face', `float', `font-instance', `frame', `glyph',
+ `hash-table', `image-instance', `integer', `keymap', `marker',
+ `process', `range-table', `specifier', `string', `subr',
+ `subwindow', `symbol', `toolbar-button', `tooltalk-message',
+ `tooltalk-pattern', `vector', `weak-list', `window',
+ `window-configuration', or `x-resource'.
+
+ (type-of 1)
+ => integer
+ (type-of 'nil)
+ => symbol
+ (type-of '()) ; `()' is `nil'.
+ => symbol
+ (type-of '(x))
+ => cons
+
+\1f
+File: lispref.info, Node: Equality Predicates, Prev: Type Predicates, Up: Lisp Data Types
+
+Equality Predicates
+===================
+
+Here we describe two functions that test for equality between any two
+objects. Other functions test equality between objects of specific
+types, e.g., strings. For these predicates, see the appropriate chapter
+describing the data type.
+
+ - Function: eq object1 object2
+ This function returns `t' if OBJECT1 and OBJECT2 are the same
+ object, `nil' otherwise. The "same object" means that a change in
+ one will be reflected by the same change in the other.
+
+ `eq' returns `t' if OBJECT1 and OBJECT2 are integers with the same
+ value. Also, since symbol names are normally unique, if the
+ arguments are symbols with the same name, they are `eq'. For
+ other types (e.g., lists, vectors, strings), two arguments with
+ the same contents or elements are not necessarily `eq' to each
+ other: they are `eq' only if they are the same object.
+
+ (The `make-symbol' function returns an uninterned symbol that is
+ not interned in the standard `obarray'. When uninterned symbols
+ are in use, symbol names are no longer unique. Distinct symbols
+ with the same name are not `eq'. *Note Creating Symbols::.)
+
+ NOTE: Under XEmacs 19, characters are really just integers, and
+ thus characters and integers are `eq'. Under XEmacs 20, it was
+ necessary to preserve remnants of this in function such as `old-eq'
+ in order to maintain byte-code compatibility. Byte code compiled
+ under any Emacs 19 will automatically have calls to `eq' mapped to
+ `old-eq' when executed under XEmacs 20.
+
+ (eq 'foo 'foo)
+ => t
+
+ (eq 456 456)
+ => t
+
+ (eq "asdf" "asdf")
+ => nil
+
+ (eq '(1 (2 (3))) '(1 (2 (3))))
+ => nil
+
+ (setq foo '(1 (2 (3))))
+ => (1 (2 (3)))
+ (eq foo foo)
+ => t
+ (eq foo '(1 (2 (3))))
+ => nil
+
+ (eq [(1 2) 3] [(1 2) 3])
+ => nil
+
+ (eq (point-marker) (point-marker))
+ => nil
+
+
+ - Function: old-eq object1 object2
+ This function exists under XEmacs 20 and is exactly like `eq'
+ except that it suffers from the char-int confoundance disease. In
+ other words, it returns `t' if given a character and the
+ equivalent integer, even though the objects are of different types!
+ You should _not_ ever call this function explicitly in your code.
+ However, be aware that all calls to `eq' in byte code compiled
+ under version 19 map to `old-eq' in XEmacs 20. (Likewise for
+ `old-equal', `old-memq', `old-member', `old-assq' and
+ `old-assoc'.)
+
+ ;; Remember, this does not apply under XEmacs 19.
+ ?A
+ => ?A
+ (char-int ?A)
+ => 65
+ (old-eq ?A 65)
+ => t ; Eek, we've been infected.
+ (eq ?A 65)
+ => nil ; We are still healthy.
+
+ - Function: equal object1 object2
+ This function returns `t' if OBJECT1 and OBJECT2 have equal
+ components, `nil' otherwise. Whereas `eq' tests if its arguments
+ are the same object, `equal' looks inside nonidentical arguments
+ to see if their elements are the same. So, if two objects are
+ `eq', they are `equal', but the converse is not always true.
+
+ (equal 'foo 'foo)
+ => t
+
+ (equal 456 456)
+ => t
+
+ (equal "asdf" "asdf")
+ => t
+ (eq "asdf" "asdf")
+ => nil
+
+ (equal '(1 (2 (3))) '(1 (2 (3))))
+ => t
+ (eq '(1 (2 (3))) '(1 (2 (3))))
+ => nil
+
+ (equal [(1 2) 3] [(1 2) 3])
+ => t
+ (eq [(1 2) 3] [(1 2) 3])
+ => nil
+
+ (equal (point-marker) (point-marker))
+ => t
+
+ (eq (point-marker) (point-marker))
+ => nil
+
+ Comparison of strings is case-sensitive.
+
+ Note that in FSF GNU Emacs, comparison of strings takes into
+ account their text properties, and you have to use `string-equal'
+ if you want only the strings themselves compared. This difference
+ does not exist in XEmacs; `equal' and `string-equal' always return
+ the same value on the same strings.
+
+ (equal "asdf" "ASDF")
+ => nil
+
+ Two distinct buffers are never `equal', even if their contents are
+ the same.
+
+ The test for equality is implemented recursively, and circular lists
+may therefore cause infinite recursion (leading to an error).
+
+\1f
+File: lispref.info, Node: Numbers, Next: Strings and Characters, Prev: Lisp Data Types, Up: Top
+
+Numbers
+*******
+
+XEmacs supports two numeric data types: "integers" and "floating point
+numbers". Integers are whole numbers such as -3, 0, #b0111, #xFEED,
+#o744. Their values are exact. The number prefixes `#b', `#o', and
+`#x' are supported to represent numbers in binary, octal, and
+hexadecimal notation (or radix). Floating point numbers are numbers
+with fractional parts, such as -4.5, 0.0, or 2.71828. They can also be
+expressed in exponential notation: 1.5e2 equals 150; in this example,
+`e2' stands for ten to the second power, and is multiplied by 1.5.
+Floating point values are not exact; they have a fixed, limited amount
+of precision.
+
+* Menu:
+
+* Integer Basics:: Representation and range of integers.
+* Float Basics:: Representation and range of floating point.
+* Predicates on Numbers:: Testing for numbers.
+* Comparison of Numbers:: Equality and inequality predicates.
+* Numeric Conversions:: Converting float to integer and vice versa.
+* Arithmetic Operations:: How to add, subtract, multiply and divide.
+* Rounding Operations:: Explicitly rounding floating point numbers.
+* Bitwise Operations:: Logical and, or, not, shifting.
+* Math Functions:: Trig, exponential and logarithmic functions.
+* Random Numbers:: Obtaining random integers, predictable or not.
+
+\1f
+File: lispref.info, Node: Integer Basics, Next: Float Basics, Up: Numbers
+
+Integer Basics
+==============
+
+The range of values for an integer depends on the machine. The minimum
+range is -134217728 to 134217727 (28 bits; i.e., -2**27 to 2**27 - 1),
+but some machines may provide a wider range. Many examples in this
+chapter assume an integer has 28 bits.
+
+ The Lisp reader reads an integer as a sequence of digits with
+optional initial sign and optional final period.
+
+ 1 ; The integer 1.
+ 1. ; The integer 1.
+ +1 ; Also the integer 1.
+ -1 ; The integer -1.
+ 268435457 ; Also the integer 1, due to overflow.
+ 0 ; The integer 0.
+ -0 ; The integer 0.
+
+ To understand how various functions work on integers, especially the
+bitwise operators (*note Bitwise Operations::), it is often helpful to
+view the numbers in their binary form.
+
+ In 28-bit binary, the decimal integer 5 looks like this:
+
+ 0000 0000 0000 0000 0000 0000 0101
+
+(We have inserted spaces between groups of 4 bits, and two spaces
+between groups of 8 bits, to make the binary integer easier to read.)
+
+ The integer -1 looks like this:
+
+ 1111 1111 1111 1111 1111 1111 1111
+
+-1 is represented as 28 ones. (This is called "two's complement"
+notation.)
+
+ The negative integer, -5, is creating by subtracting 4 from -1. In
+binary, the decimal integer 4 is 100. Consequently, -5 looks like this:
+
+ 1111 1111 1111 1111 1111 1111 1011
+
+ In this implementation, the largest 28-bit binary integer is the
+decimal integer 134,217,727. In binary, it looks like this:
+
+ 0111 1111 1111 1111 1111 1111 1111
+
+ Since the arithmetic functions do not check whether integers go
+outside their range, when you add 1 to 134,217,727, the value is the
+negative integer -134,217,728:
+
+ (+ 1 134217727)
+ => -134217728
+ => 1000 0000 0000 0000 0000 0000 0000
+
+ Many of the following functions accept markers for arguments as well
+as integers. (*Note Markers::.) More precisely, the actual arguments
+to such functions may be either integers or markers, which is why we
+often give these arguments the name INT-OR-MARKER. When the argument
+value is a marker, its position value is used and its buffer is ignored.
+
+\1f
+File: lispref.info, Node: Float Basics, Next: Predicates on Numbers, Prev: Integer Basics, Up: Numbers
+
+Floating Point Basics
+=====================
+
+XEmacs supports floating point numbers. The precise range of floating
+point numbers is machine-specific; it is the same as the range of the C
+data type `double' on the machine in question.
+
+ The printed representation for floating point numbers requires either
+a decimal point (with at least one digit following), an exponent, or
+both. For example, `1500.0', `15e2', `15.0e2', `1.5e3', and `.15e4'
+are five ways of writing a floating point number whose value is 1500.
+They are all equivalent. You can also use a minus sign to write
+negative floating point numbers, as in `-1.0'.
+
+ Most modern computers support the IEEE floating point standard, which
+provides for positive infinity and negative infinity as floating point
+values. It also provides for a class of values called NaN or
+"not-a-number"; numerical functions return such values in cases where
+there is no correct answer. For example, `(sqrt -1.0)' returns a NaN.
+For practical purposes, there's no significant difference between
+different NaN values in XEmacs Lisp, and there's no rule for precisely
+which NaN value should be used in a particular case, so this manual
+doesn't try to distinguish them. XEmacs Lisp has no read syntax for
+NaNs or infinities; perhaps we should create a syntax in the future.
+
+ You can use `logb' to extract the binary exponent of a floating
+point number (or estimate the logarithm of an integer):
+
+ - Function: logb number
+ This function returns the binary exponent of NUMBER. More
+ precisely, the value is the logarithm of NUMBER base 2, rounded
+ down to an integer.
+
+\1f
+File: lispref.info, Node: Predicates on Numbers, Next: Comparison of Numbers, Prev: Float Basics, Up: Numbers
+
+Type Predicates for Numbers
+===========================
+
+The functions in this section test whether the argument is a number or
+whether it is a certain sort of number. The functions `integerp' and
+`floatp' can take any type of Lisp object as argument (the predicates
+would not be of much use otherwise); but the `zerop' predicate requires
+a number as its argument. See also `integer-or-marker-p',
+`integer-char-or-marker-p', `number-or-marker-p' and
+`number-char-or-marker-p', in *Note Predicates on Markers::.
+
+ - Function: floatp object
+ This predicate tests whether its argument is a floating point
+ number and returns `t' if so, `nil' otherwise.
+
+ `floatp' does not exist in Emacs versions 18 and earlier.
+
+ - Function: integerp object
+ This predicate tests whether its argument is an integer, and
+ returns `t' if so, `nil' otherwise.
+
+ - Function: numberp object
+ This predicate tests whether its argument is a number (either
+ integer or floating point), and returns `t' if so, `nil' otherwise.
+
+ - Function: natnump object
+ The `natnump' predicate (whose name comes from the phrase
+ "natural-number-p") tests to see whether its argument is a
+ nonnegative integer, and returns `t' if so, `nil' otherwise. 0 is
+ considered non-negative.
+
+ - Function: zerop number
+ This predicate tests whether its argument is zero, and returns `t'
+ if so, `nil' otherwise. The argument must be a number.
+
+ These two forms are equivalent: `(zerop x)' == `(= x 0)'.
+
+\1f
+File: lispref.info, Node: Comparison of Numbers, Next: Numeric Conversions, Prev: Predicates on Numbers, Up: Numbers
+
+Comparison of Numbers
+=====================
+
+To test numbers for numerical equality, you should normally use `=',
+not `eq'. There can be many distinct floating point number objects
+with the same numeric value. If you use `eq' to compare them, then you
+test whether two values are the same _object_. By contrast, `='
+compares only the numeric values of the objects.
+
+ At present, each integer value has a unique Lisp object in XEmacs
+Lisp. Therefore, `eq' is equivalent to `=' where integers are
+concerned. It is sometimes convenient to use `eq' for comparing an
+unknown value with an integer, because `eq' does not report an error if
+the unknown value is not a number--it accepts arguments of any type.
+By contrast, `=' signals an error if the arguments are not numbers or
+markers. However, it is a good idea to use `=' if you can, even for
+comparing integers, just in case we change the representation of
+integers in a future XEmacs version.
+
+ There is another wrinkle: because floating point arithmetic is not
+exact, it is often a bad idea to check for equality of two floating
+point values. Usually it is better to test for approximate equality.
+Here's a function to do this:
+
+ (defconst fuzz-factor 1.0e-6)
+ (defun approx-equal (x y)
+ (or (and (= x 0) (= y 0))
+ (< (/ (abs (- x y))
+ (max (abs x) (abs y)))
+ fuzz-factor)))
+
+ Common Lisp note: Comparing numbers in Common Lisp always requires
+ `=' because Common Lisp implements multi-word integers, and two
+ distinct integer objects can have the same numeric value. XEmacs
+ Lisp can have just one integer object for any given value because
+ it has a limited range of integer values.
+
+ In addition to numbers, all of the following functions also accept
+characters and markers as arguments, and treat them as their number
+equivalents.
+
+ - Function: = number &rest more-numbers
+ This function returns `t' if all of its arguments are numerically
+ equal, `nil' otherwise.
+
+ (= 5)
+ => t
+ (= 5 6)
+ => nil
+ (= 5 5.0)
+ => t
+ (= 5 5 6)
+ => nil
+
+ - Function: /= number &rest more-numbers
+ This function returns `t' if no two arguments are numerically
+ equal, `nil' otherwise.
+
+ (/= 5 6)
+ => t
+ (/= 5 5 6)
+ => nil
+ (/= 5 6 1)
+ => t
+
+ - Function: < number &rest more-numbers
+ This function returns `t' if the sequence of its arguments is
+ monotonically increasing, `nil' otherwise.
+
+ (< 5 6)
+ => t
+ (< 5 6 6)
+ => nil
+ (< 5 6 7)
+ => t
+
+ - Function: <= number &rest more-numbers
+ This function returns `t' if the sequence of its arguments is
+ monotonically nondecreasing, `nil' otherwise.
+
+ (<= 5 6)
+ => t
+ (<= 5 6 6)
+ => t
+ (<= 5 6 5)
+ => nil
+
+ - Function: > number &rest more-numbers
+ This function returns `t' if the sequence of its arguments is
+ monotonically decreasing, `nil' otherwise.
+
+ - Function: >= number &rest more-numbers
+ This function returns `t' if the sequence of its arguments is
+ monotonically nonincreasing, `nil' otherwise.
+
+ - Function: max number &rest more-numbers
+ This function returns the largest of its arguments.
+
+ (max 20)
+ => 20
+ (max 1 2.5)
+ => 2.5
+ (max 1 3 2.5)
+ => 3
+
+ - Function: min number &rest more-numbers
+ This function returns the smallest of its arguments.
+
+ (min -4 1)
+ => -4
+
+\1f
+File: lispref.info, Node: Numeric Conversions, Next: Arithmetic Operations, Prev: Comparison of Numbers, Up: Numbers
+
+Numeric Conversions
+===================
+
+To convert an integer to floating point, use the function `float'.
+
+ - Function: float number
+ This returns NUMBER converted to floating point. If NUMBER is
+ already a floating point number, `float' returns it unchanged.
+
+ There are four functions to convert floating point numbers to
+integers; they differ in how they round. These functions accept
+integer arguments also, and return such arguments unchanged.
+
+ - Function: truncate number
+ This returns NUMBER, converted to an integer by rounding towards
+ zero.
+
+ - Function: floor number &optional divisor
+ This returns NUMBER, converted to an integer by rounding downward
+ (towards negative infinity).
+
+ If DIVISOR is specified, NUMBER is divided by DIVISOR before the
+ floor is taken; this is the division operation that corresponds to
+ `mod'. An `arith-error' results if DIVISOR is 0.
+
+ - Function: ceiling number
+ This returns NUMBER, converted to an integer by rounding upward
+ (towards positive infinity).
+
+ - Function: round number
+ This returns NUMBER, converted to an integer by rounding towards
+ the nearest integer. Rounding a value equidistant between two
+ integers may choose the integer closer to zero, or it may prefer
+ an even integer, depending on your machine.
+
+\1f
+File: lispref.info, Node: Arithmetic Operations, Next: Rounding Operations, Prev: Numeric Conversions, Up: Numbers
+
+Arithmetic Operations
+=====================
+
+XEmacs Lisp provides the traditional four arithmetic operations:
+addition, subtraction, multiplication, and division. Remainder and
+modulus functions supplement the division functions. The functions to
+add or subtract 1 are provided because they are traditional in Lisp and
+commonly used.
+
+ All of these functions except `%' return a floating point value if
+any argument is floating.
+
+ It is important to note that in XEmacs Lisp, arithmetic functions do
+not check for overflow. Thus `(1+ 134217727)' may evaluate to
+-134217728, depending on your hardware.
+
+ - Function: 1+ number
+ This function returns NUMBER plus one. NUMBER may be a number,
+ character or marker. Markers and characters are converted to
+ integers.
+
+ For example,
+
+ (setq foo 4)
+ => 4
+ (1+ foo)
+ => 5
+
+ This function is not analogous to the C operator `++'--it does not
+ increment a variable. It just computes a sum. Thus, if we
+ continue,
+
+ foo
+ => 4
+
+ If you want to increment the variable, you must use `setq', like
+ this:
+
+ (setq foo (1+ foo))
+ => 5
+
+ Now that the `cl' package is always available from lisp code, a
+ more convenient and natural way to increment a variable is
+ `(incf foo)'.
+
+ - Function: 1- number
+ This function returns NUMBER minus one. NUMBER may be a number,
+ character or marker. Markers and characters are converted to
+ integers.
+
+ - Function: abs number
+ This returns the absolute value of NUMBER.
+
+ - Function: + &rest numbers
+ This function adds its arguments together. When given no
+ arguments, `+' returns 0.
+
+ If any of the arguments are characters or markers, they are first
+ converted to integers.
+
+ (+)
+ => 0
+ (+ 1)
+ => 1
+ (+ 1 2 3 4)
+ => 10
+
+ - Function: - &optional number &rest other-numbers
+ The `-' function serves two purposes: negation and subtraction.
+ When `-' has a single argument, the value is the negative of the
+ argument. When there are multiple arguments, `-' subtracts each of
+ the OTHER-NUMBERS from NUMBER, cumulatively. If there are no
+ arguments, an error is signaled.
+
+ If any of the arguments are characters or markers, they are first
+ converted to integers.
+
+ (- 10 1 2 3 4)
+ => 0
+ (- 10)
+ => -10
+ (-)
+ => 0
+
+ - Function: * &rest numbers
+ This function multiplies its arguments together, and returns the
+ product. When given no arguments, `*' returns 1.
+
+ If any of the arguments are characters or markers, they are first
+ converted to integers.
+
+ (*)
+ => 1
+ (* 1)
+ => 1
+ (* 1 2 3 4)
+ => 24
+
+ - Function: / dividend &rest divisors
+ The `/' function serves two purposes: inversion and division. When
+ `/' has a single argument, the value is the inverse of the
+ argument. When there are multiple arguments, `/' divides DIVIDEND
+ by each of the DIVISORS, cumulatively, returning the quotient. If
+ there are no arguments, an error is signaled.
+
+ If none of the arguments are floats, then the result is an integer.
+ This means the result has to be rounded. On most machines, the
+ result is rounded towards zero after each division, but some
+ machines may round differently with negative arguments. This is
+ because the Lisp function `/' is implemented using the C division
+ operator, which also permits machine-dependent rounding. As a
+ practical matter, all known machines round in the standard fashion.
+
+ If any of the arguments are characters or markers, they are first
+ converted to integers.
+
+ If you divide by 0, an `arith-error' error is signaled. (*Note
+ Errors::.)
+
+ (/ 6 2)
+ => 3
+ (/ 5 2)
+ => 2
+ (/ 25 3 2)
+ => 4
+ (/ 3.0)
+ => 0.3333333333333333
+ (/ -17 6)
+ => -2
+
+ The result of `(/ -17 6)' could in principle be -3 on some
+ machines.
+
+ - Function: % dividend divisor
+ This function returns the integer remainder after division of
+ DIVIDEND by DIVISOR. The arguments must be integers or markers.
+
+ For negative arguments, the remainder is in principle
+ machine-dependent since the quotient is; but in practice, all
+ known machines behave alike.
+
+ An `arith-error' results if DIVISOR is 0.
+
+ (% 9 4)
+ => 1
+ (% -9 4)
+ => -1
+ (% 9 -4)
+ => 1
+ (% -9 -4)
+ => -1
+
+ For any two integers DIVIDEND and DIVISOR,
+
+ (+ (% DIVIDEND DIVISOR)
+ (* (/ DIVIDEND DIVISOR) DIVISOR))
+
+ always equals DIVIDEND.
+
+ - Function: mod dividend divisor
+ This function returns the value of DIVIDEND modulo DIVISOR; in
+ other words, the remainder after division of DIVIDEND by DIVISOR,
+ but with the same sign as DIVISOR. The arguments must be numbers
+ or markers.
+
+ Unlike `%', `mod' returns a well-defined result for negative
+ arguments. It also permits floating point arguments; it rounds the
+ quotient downward (towards minus infinity) to an integer, and uses
+ that quotient to compute the remainder.
+
+ An `arith-error' results if DIVISOR is 0.
+
+ (mod 9 4)
+ => 1
+ (mod -9 4)
+ => 3
+ (mod 9 -4)
+ => -3
+ (mod -9 -4)
+ => -1
+ (mod 5.5 2.5)
+ => .5
+
+ For any two numbers DIVIDEND and DIVISOR,
+
+ (+ (mod DIVIDEND DIVISOR)
+ (* (floor DIVIDEND DIVISOR) DIVISOR))
+
+ always equals DIVIDEND, subject to rounding error if either
+ argument is floating point. For `floor', see *Note Numeric
+ Conversions::.
+
+\1f
+File: lispref.info, Node: Rounding Operations, Next: Bitwise Operations, Prev: Arithmetic Operations, Up: Numbers
+
+Rounding Operations
+===================
+
+The functions `ffloor', `fceiling', `fround' and `ftruncate' take a
+floating point argument and return a floating point result whose value
+is a nearby integer. `ffloor' returns the nearest integer below;
+`fceiling', the nearest integer above; `ftruncate', the nearest integer
+in the direction towards zero; `fround', the nearest integer.
+
+ - Function: ffloor number
+ This function rounds NUMBER to the next lower integral value, and
+ returns that value as a floating point number.
+
+ - Function: fceiling number
+ This function rounds NUMBER to the next higher integral value, and
+ returns that value as a floating point number.
+
+ - Function: ftruncate number
+ This function rounds NUMBER towards zero to an integral value, and
+ returns that value as a floating point number.
+
+ - Function: fround number
+ This function rounds NUMBER to the nearest integral value, and
+ returns that value as a floating point number.
+
+\1f
+File: lispref.info, Node: Bitwise Operations, Next: Math Functions, Prev: Rounding Operations, Up: Numbers
+
+Bitwise Operations on Integers
+==============================
+
+In a computer, an integer is represented as a binary number, a sequence
+of "bits" (digits which are either zero or one). A bitwise operation
+acts on the individual bits of such a sequence. For example,
+"shifting" moves the whole sequence left or right one or more places,
+reproducing the same pattern "moved over".
+
+ The bitwise operations in XEmacs Lisp apply only to integers.
+
+ - Function: lsh integer1 count
+ `lsh', which is an abbreviation for "logical shift", shifts the
+ bits in INTEGER1 to the left COUNT places, or to the right if
+ COUNT is negative, bringing zeros into the vacated bits. If COUNT
+ is negative, `lsh' shifts zeros into the leftmost
+ (most-significant) bit, producing a positive result even if
+ INTEGER1 is negative. Contrast this with `ash', below.
+
+ Here are two examples of `lsh', shifting a pattern of bits one
+ place to the left. We show only the low-order eight bits of the
+ binary pattern; the rest are all zero.
+
+ (lsh 5 1)
+ => 10
+ ;; Decimal 5 becomes decimal 10.
+ 00000101 => 00001010
+
+ (lsh 7 1)
+ => 14
+ ;; Decimal 7 becomes decimal 14.
+ 00000111 => 00001110
+
+ As the examples illustrate, shifting the pattern of bits one place
+ to the left produces a number that is twice the value of the
+ previous number.
+
+ Shifting a pattern of bits two places to the left produces results
+ like this (with 8-bit binary numbers):
+
+ (lsh 3 2)
+ => 12
+ ;; Decimal 3 becomes decimal 12.
+ 00000011 => 00001100
+
+ On the other hand, shifting one place to the right looks like this:
+
+ (lsh 6 -1)
+ => 3
+ ;; Decimal 6 becomes decimal 3.
+ 00000110 => 00000011
+
+ (lsh 5 -1)
+ => 2
+ ;; Decimal 5 becomes decimal 2.
+ 00000101 => 00000010
+
+ As the example illustrates, shifting one place to the right
+ divides the value of a positive integer by two, rounding downward.
+
+ The function `lsh', like all XEmacs Lisp arithmetic functions, does
+ not check for overflow, so shifting left can discard significant
+ bits and change the sign of the number. For example, left shifting
+ 134,217,727 produces -2 on a 28-bit machine:
+
+ (lsh 134217727 1) ; left shift
+ => -2
+
+ In binary, in the 28-bit implementation, the argument looks like
+ this:
+
+ ;; Decimal 134,217,727
+ 0111 1111 1111 1111 1111 1111 1111
+
+ which becomes the following when left shifted:
+
+ ;; Decimal -2
+ 1111 1111 1111 1111 1111 1111 1110
+
+ - Function: ash integer1 count
+ `ash' ("arithmetic shift") shifts the bits in INTEGER1 to the left
+ COUNT places, or to the right if COUNT is negative.
+
+ `ash' gives the same results as `lsh' except when INTEGER1 and
+ COUNT are both negative. In that case, `ash' puts ones in the
+ empty bit positions on the left, while `lsh' puts zeros in those
+ bit positions.
+
+ Thus, with `ash', shifting the pattern of bits one place to the
+ right looks like this:
+
+ (ash -6 -1) => -3
+ ;; Decimal -6 becomes decimal -3.
+ 1111 1111 1111 1111 1111 1111 1010
+ =>
+ 1111 1111 1111 1111 1111 1111 1101
+
+ In contrast, shifting the pattern of bits one place to the right
+ with `lsh' looks like this:
+
+ (lsh -6 -1) => 134217725
+ ;; Decimal -6 becomes decimal 134,217,725.
+ 1111 1111 1111 1111 1111 1111 1010
+ =>
+ 0111 1111 1111 1111 1111 1111 1101
+
+ Here are other examples:
+
+ ; 28-bit binary values
+
+ (lsh 5 2) ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ => 20 ; = 0000 0000 0000 0000 0000 0001 0100
+ (ash 5 2)
+ => 20
+ (lsh -5 2) ; -5 = 1111 1111 1111 1111 1111 1111 1011
+ => -20 ; = 1111 1111 1111 1111 1111 1110 1100
+ (ash -5 2)
+ => -20
+ (lsh 5 -2) ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ => 1 ; = 0000 0000 0000 0000 0000 0000 0001
+ (ash 5 -2)
+ => 1
+ (lsh -5 -2) ; -5 = 1111 1111 1111 1111 1111 1111 1011
+ => 4194302 ; = 0011 1111 1111 1111 1111 1111 1110
+ (ash -5 -2) ; -5 = 1111 1111 1111 1111 1111 1111 1011
+ => -2 ; = 1111 1111 1111 1111 1111 1111 1110
+
+ - Function: logand &rest ints-or-markers
+ This function returns the "logical and" of the arguments: the Nth
+ bit is set in the result if, and only if, the Nth bit is set in
+ all the arguments. ("Set" means that the value of the bit is 1
+ rather than 0.)
+
+ For example, using 4-bit binary numbers, the "logical and" of 13
+ and 12 is 12: 1101 combined with 1100 produces 1100. In both the
+ binary numbers, the leftmost two bits are set (i.e., they are
+ 1's), so the leftmost two bits of the returned value are set.
+ However, for the rightmost two bits, each is zero in at least one
+ of the arguments, so the rightmost two bits of the returned value
+ are 0's.
+
+ Therefore,
+
+ (logand 13 12)
+ => 12
+
+ If `logand' is not passed any argument, it returns a value of -1.
+ This number is an identity element for `logand' because its binary
+ representation consists entirely of ones. If `logand' is passed
+ just one argument, it returns that argument.
+
+ ; 28-bit binary values
+
+ (logand 14 13) ; 14 = 0000 0000 0000 0000 0000 0000 1110
+ ; 13 = 0000 0000 0000 0000 0000 0000 1101
+ => 12 ; 12 = 0000 0000 0000 0000 0000 0000 1100
+
+ (logand 14 13 4) ; 14 = 0000 0000 0000 0000 0000 0000 1110
+ ; 13 = 0000 0000 0000 0000 0000 0000 1101
+ ; 4 = 0000 0000 0000 0000 0000 0000 0100
+ => 4 ; 4 = 0000 0000 0000 0000 0000 0000 0100
+
+ (logand)
+ => -1 ; -1 = 1111 1111 1111 1111 1111 1111 1111
+
+ - Function: logior &rest ints-or-markers
+ This function returns the "inclusive or" of its arguments: the Nth
+ bit is set in the result if, and only if, the Nth bit is set in at
+ least one of the arguments. If there are no arguments, the result
+ is zero, which is an identity element for this operation. If
+ `logior' is passed just one argument, it returns that argument.
+
+ ; 28-bit binary values
+
+ (logior 12 5) ; 12 = 0000 0000 0000 0000 0000 0000 1100
+ ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ => 13 ; 13 = 0000 0000 0000 0000 0000 0000 1101
+
+ (logior 12 5 7) ; 12 = 0000 0000 0000 0000 0000 0000 1100
+ ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ ; 7 = 0000 0000 0000 0000 0000 0000 0111
+ => 15 ; 15 = 0000 0000 0000 0000 0000 0000 1111
+
+ - Function: logxor &rest ints-or-markers
+ This function returns the "exclusive or" of its arguments: the Nth
+ bit is set in the result if, and only if, the Nth bit is set in an
+ odd number of the arguments. If there are no arguments, the
+ result is 0, which is an identity element for this operation. If
+ `logxor' is passed just one argument, it returns that argument.
+
+ ; 28-bit binary values
+
+ (logxor 12 5) ; 12 = 0000 0000 0000 0000 0000 0000 1100
+ ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ => 9 ; 9 = 0000 0000 0000 0000 0000 0000 1001
+
+ (logxor 12 5 7) ; 12 = 0000 0000 0000 0000 0000 0000 1100
+ ; 5 = 0000 0000 0000 0000 0000 0000 0101
+ ; 7 = 0000 0000 0000 0000 0000 0000 0111
+ => 14 ; 14 = 0000 0000 0000 0000 0000 0000 1110
+
+ - Function: lognot integer
+ This function returns the logical complement of its argument: the
+ Nth bit is one in the result if, and only if, the Nth bit is zero
+ in INTEGER, and vice-versa.
+
+ (lognot 5)
+ => -6
+ ;; 5 = 0000 0000 0000 0000 0000 0000 0101
+ ;; becomes
+ ;; -6 = 1111 1111 1111 1111 1111 1111 1010
+
+\1f
+File: lispref.info, Node: Math Functions, Next: Random Numbers, Prev: Bitwise Operations, Up: Numbers
+
+Standard Mathematical Functions
+===============================
+
+These mathematical functions are available if floating point is
+supported (which is the normal state of affairs). They allow integers
+as well as floating point numbers as arguments.
+
+ - Function: sin number
+ - Function: cos number
+ - Function: tan number
+ These are the ordinary trigonometric functions, with argument
+ measured in radians.
+
+ - Function: asin number
+ The value of `(asin NUMBER)' is a number between -pi/2 and pi/2
+ (inclusive) whose sine is NUMBER; if, however, NUMBER is out of
+ range (outside [-1, 1]), then the result is a NaN.
+
+ - Function: acos number
+ The value of `(acos NUMBER)' is a number between 0 and pi
+ (inclusive) whose cosine is NUMBER; if, however, NUMBER is out of
+ range (outside [-1, 1]), then the result is a NaN.
+
+ - Function: atan number &optional number2
+ The value of `(atan NUMBER)' is a number between -pi/2 and pi/2
+ (exclusive) whose tangent is NUMBER.
+
+ If optional argument NUMBER2 is supplied, the function returns
+ `atan2(NUMBER,NUMBER2)'.
+
+ - Function: sinh number
+ - Function: cosh number
+ - Function: tanh number
+ These are the ordinary hyperbolic trigonometric functions.
+
+ - Function: asinh number
+ - Function: acosh number
+ - Function: atanh number
+ These are the inverse hyperbolic trigonometric functions.
+
+ - Function: exp number
+ This is the exponential function; it returns e to the power
+ NUMBER. e is a fundamental mathematical constant also called the
+ base of natural logarithms.
+
+ - Function: log number &optional base
+ This function returns the logarithm of NUMBER, with base BASE. If
+ you don't specify BASE, the base `e' is used. If NUMBER is
+ negative, the result is a NaN.
+
+ - Function: log10 number
+ This function returns the logarithm of NUMBER, with base 10. If
+ NUMBER is negative, the result is a NaN. `(log10 X)' == `(log X
+ 10)', at least approximately.
+
+ - Function: expt x y
+ This function returns X raised to power Y. If both arguments are
+ integers and Y is positive, the result is an integer; in this
+ case, it is truncated to fit the range of possible integer values.
+
+ - Function: sqrt number
+ This returns the square root of NUMBER. If NUMBER is negative,
+ the value is a NaN.
+
+ - Function: cube-root number
+ This returns the cube root of NUMBER.
+
+\1f
+File: lispref.info, Node: Random Numbers, Prev: Math Functions, Up: Numbers
+
+Random Numbers
+==============
+
+A deterministic computer program cannot generate true random numbers.
+For most purposes, "pseudo-random numbers" suffice. A series of
+pseudo-random numbers is generated in a deterministic fashion. The
+numbers are not truly random, but they have certain properties that
+mimic a random series. For example, all possible values occur equally
+often in a pseudo-random series.
+
+ In XEmacs, pseudo-random numbers are generated from a "seed" number.
+Starting from any given seed, the `random' function always generates
+the same sequence of numbers. XEmacs always starts with the same seed
+value, so the sequence of values of `random' is actually the same in
+each XEmacs run! For example, in one operating system, the first call
+to `(random)' after you start XEmacs always returns -1457731, and the
+second one always returns -7692030. This repeatability is helpful for
+debugging.
+
+ If you want truly unpredictable random numbers, execute `(random
+t)'. This chooses a new seed based on the current time of day and on
+XEmacs's process ID number.
+
+ - Function: random &optional limit
+ This function returns a pseudo-random integer. Repeated calls
+ return a series of pseudo-random integers.
+
+ If LIMIT is a positive integer, the value is chosen to be
+ nonnegative and less than LIMIT.
+
+ If LIMIT is `t', it means to choose a new seed based on the
+ current time of day and on XEmacs's process ID number.
+
+ On some machines, any integer representable in Lisp may be the
+ result of `random'. On other machines, the result can never be
+ larger than a certain maximum or less than a certain (negative)
+ minimum.
+
+\1f
+File: lispref.info, Node: Strings and Characters, Next: Lists, Prev: Numbers, Up: Top
+
+Strings and Characters
+**********************
+
+A string in XEmacs Lisp is an array that contains an ordered sequence
+of characters. Strings are used as names of symbols, buffers, and
+files, to send messages to users, to hold text being copied between
+buffers, and for many other purposes. Because strings are so important,
+XEmacs Lisp has many functions expressly for manipulating them. XEmacs
+Lisp programs use strings more often than individual characters.
+
+* Menu:
+
+* String Basics:: Basic properties of strings and characters.
+* Predicates for Strings:: Testing whether an object is a string or char.
+* Creating Strings:: Functions to allocate new strings.
+* Predicates for Characters:: Testing whether an object is a character.
+* Character Codes:: Each character has an equivalent integer.
+* Text Comparison:: Comparing characters or strings.
+* String Conversion:: Converting characters or strings and vice versa.
+* Modifying Strings:: Changing characters in a string.
+* String Properties:: Additional information attached to strings.
+* Formatting Strings:: `format': XEmacs's analog of `printf'.
+* Character Case:: Case conversion functions.
+* Case Tables:: Customizing case conversion.
+* Char Tables:: Mapping from characters to Lisp objects.
+
+\1f
+File: lispref.info, Node: String Basics, Next: Predicates for Strings, Up: Strings and Characters
+
+String and Character Basics
+===========================
+
+Strings in XEmacs Lisp are arrays that contain an ordered sequence of
+characters. Characters are their own primitive object type in XEmacs
+20. However, in XEmacs 19, characters are represented in XEmacs Lisp as
+integers; whether an integer was intended as a character or not is
+determined only by how it is used. *Note Character Type::.
+
+ The length of a string (like any array) is fixed and independent of
+the string contents, and cannot be altered. Strings in Lisp are _not_
+terminated by a distinguished character code. (By contrast, strings in
+C are terminated by a character with ASCII code 0.) This means that
+any character, including the null character (ASCII code 0), is a valid
+element of a string.
+
+ Since strings are considered arrays, you can operate on them with the
+general array functions. (*Note Sequences Arrays Vectors::.) For
+example, you can access or change individual characters in a string
+using the functions `aref' and `aset' (*note Array Functions::).
+
+ Strings use an efficient representation for storing the characters
+in them, and thus take up much less memory than a vector of the same
+length.
+
+ Sometimes you will see strings used to hold key sequences. This
+exists for backward compatibility with Emacs 18, but should _not_ be
+used in new code, since many key chords can't be represented at all and
+others (in particular meta key chords) are confused with accented
+characters.
+
+ Strings are useful for holding regular expressions. You can also
+match regular expressions against strings (*note Regexp Search::). The
+functions `match-string' (*note Simple Match Data::) and
+`replace-match' (*note Replacing Match::) are useful for decomposing
+and modifying strings based on regular expression matching.
+
+ Like a buffer, a string can contain extents in it. These extents are
+created when a function such as `buffer-substring' is called on a
+region with duplicable extents in it. When the string is inserted into
+a buffer, the extents are inserted along with it. *Note Duplicable
+Extents::.
+
+ *Note Text::, for information about functions that display strings or
+copy them into buffers. *Note Character Type::, and *Note String
+Type::, for information about the syntax of characters and strings.
+
+\1f
+File: lispref.info, Node: Predicates for Strings, Next: Creating Strings, Prev: String Basics, Up: Strings and Characters
+
+The Predicates for Strings
+==========================
+
+For more information about general sequence and array predicates, see
+*Note Sequences Arrays Vectors::, and *Note Arrays::.
+
+ - Function: stringp object
+ This function returns `t' if OBJECT is a string, `nil' otherwise.
+
+ - Function: char-or-string-p object
+ This function returns `t' if OBJECT is a string or a character,
+ `nil' otherwise.
+
+ In XEmacs addition, this function also returns `t' if OBJECT is an
+ integer that can be represented as a character. This is because
+ of compatibility with previous XEmacs and should not be depended
+ on.
+
+\1f
+File: lispref.info, Node: Creating Strings, Next: Predicates for Characters, Prev: Predicates for Strings, Up: Strings and Characters
+
+Creating Strings
+================
+
+The following functions create strings, either from scratch, or by
+putting strings together, or by taking them apart.
+
+ - Function: string &rest characters
+ This function returns a new string made up of CHARACTERS.
+
+ (string ?X ?E ?m ?a ?c ?s)
+ => "XEmacs"
+ (string)
+ => ""
+
+ Analogous functions operating on other data types include `list',
+ `cons' (*note Building Lists::), `vector' (*note Vectors::) and
+ `bit-vector' (*note Bit Vectors::). This function has not been
+ available in XEmacs prior to 21.0 and FSF Emacs prior to 20.3.
+
+ - Function: make-string length character
+ This function returns a new string consisting entirely of LENGTH
+ successive copies of CHARACTER. LENGTH must be a non-negative
+ integer.
+
+ (make-string 5 ?x)
+ => "xxxxx"
+ (make-string 0 ?x)
+ => ""
+
+ Other functions to compare with this one include `char-to-string'
+ (*note String Conversion::), `make-vector' (*note Vectors::), and
+ `make-list' (*note Building Lists::).
+
+ - Function: substring string start &optional end
+ This function returns a new string which consists of those
+ characters from STRING in the range from (and including) the
+ character at the index START up to (but excluding) the character
+ at the index END. The first character is at index zero.
+
+ (substring "abcdefg" 0 3)
+ => "abc"
+
+ Here the index for `a' is 0, the index for `b' is 1, and the index
+ for `c' is 2. Thus, three letters, `abc', are copied from the
+ string `"abcdefg"'. The index 3 marks the character position up
+ to which the substring is copied. The character whose index is 3
+ is actually the fourth character in the string.
+
+ A negative number counts from the end of the string, so that -1
+ signifies the index of the last character of the string. For
+ example:
+
+ (substring "abcdefg" -3 -1)
+ => "ef"
+
+ In this example, the index for `e' is -3, the index for `f' is -2,
+ and the index for `g' is -1. Therefore, `e' and `f' are included,
+ and `g' is excluded.
+
+ When `nil' is used as an index, it stands for the length of the
+ string. Thus,
+
+ (substring "abcdefg" -3 nil)
+ => "efg"
+
+ Omitting the argument END is equivalent to specifying `nil'. It
+ follows that `(substring STRING 0)' returns a copy of all of
+ STRING.
+
+ (substring "abcdefg" 0)
+ => "abcdefg"
+
+ But we recommend `copy-sequence' for this purpose (*note Sequence
+ Functions::).
+
+ If the characters copied from STRING have duplicable extents or
+ text properties, those are copied into the new string also. *Note
+ Duplicable Extents::.
+
+ A `wrong-type-argument' error is signaled if either START or END
+ is not an integer or `nil'. An `args-out-of-range' error is
+ signaled if START indicates a character following END, or if
+ either integer is out of range for STRING.
+
+ Contrast this function with `buffer-substring' (*note Buffer
+ Contents::), which returns a string containing a portion of the
+ text in the current buffer. The beginning of a string is at index
+ 0, but the beginning of a buffer is at index 1.
+
+ - Function: concat &rest sequences
+ This function returns a new string consisting of the characters in
+ the arguments passed to it (along with their text properties, if
+ any). The arguments may be strings, lists of numbers, or vectors
+ of numbers; they are not themselves changed. If `concat' receives
+ no arguments, it returns an empty string.
+
+ (concat "abc" "-def")
+ => "abc-def"
+ (concat "abc" (list 120 (+ 256 121)) [122])
+ => "abcxyz"
+ ;; `nil' is an empty sequence.
+ (concat "abc" nil "-def")
+ => "abc-def"
+ (concat "The " "quick brown " "fox.")
+ => "The quick brown fox."
+ (concat)
+ => ""
+
+ The second example above shows how characters stored in strings are
+ taken modulo 256. In other words, each character in the string is
+ stored in one byte.
+
+ The `concat' function always constructs a new string that is not
+ `eq' to any existing string.
+
+ When an argument is an integer (not a sequence of integers), it is
+ converted to a string of digits making up the decimal printed
+ representation of the integer. *Don't use this feature; we plan
+ to eliminate it. If you already use this feature, change your
+ programs now!* The proper way to convert an integer to a decimal
+ number in this way is with `format' (*note Formatting Strings::) or
+ `number-to-string' (*note String Conversion::).
+
+ (concat 137)
+ => "137"
+ (concat 54 321)
+ => "54321"
+
+ For information about other concatenation functions, see the
+ description of `mapconcat' in *Note Mapping Functions::, `vconcat'
+ in *Note Vectors::, `bvconcat' in *Note Bit Vectors::, and `append'
+ in *Note Building Lists::.
+
+\1f
+File: lispref.info, Node: Predicates for Characters, Next: Character Codes, Prev: Creating Strings, Up: Strings and Characters
+
+The Predicates for Characters
+=============================
+
+ - Function: characterp object
+ This function returns `t' if OBJECT is a character.
+
+ Some functions that work on integers (e.g. the comparison functions
+ <, <=, =, /=, etc. and the arithmetic functions +, -, *, etc.)
+ accept characters and implicitly convert them into integers. In
+ general, functions that work on characters also accept char-ints
+ and implicitly convert them into characters. WARNING: Neither of
+ these behaviors is very desirable, and they are maintained for
+ backward compatibility with old E-Lisp programs that confounded
+ characters and integers willy-nilly. These behaviors may change
+ in the future; therefore, do not rely on them. Instead, convert
+ the characters explicitly using `char-int'.
+
+ - Function: integer-or-char-p object
+ This function returns `t' if OBJECT is an integer or character.
+
+\1f
+File: lispref.info, Node: Character Codes, Next: Text Comparison, Prev: Predicates for Characters, Up: Strings and Characters
+
+Character Codes
+===============
+
+ - Function: char-int character
+ This function converts a character into an equivalent integer.
+ The resulting integer will always be non-negative. The integers in
+ the range 0 - 255 map to characters as follows:
+
+ 0 - 31
+ Control set 0
+
+ 32 - 127
+ ASCII
+
+ 128 - 159
+ Control set 1
+
+ 160 - 255
+ Right half of ISO-8859-1
+
+ If support for MULE does not exist, these are the only valid
+ character values. When MULE support exists, the values assigned to
+ other characters may vary depending on the particular version of
+ XEmacs, the order in which character sets were loaded, etc., and
+ you should not depend on them.
+
+ - Function: int-char integer
+ This function converts an integer into the equivalent character.
+ Not all integers correspond to valid characters; use `char-int-p'
+ to determine whether this is the case. If the integer cannot be
+ converted, `nil' is returned.
+
+ - Function: char-int-p object
+ This function returns `t' if OBJECT is an integer that can be
+ converted into a character.
+
+ - Function: char-or-char-int-p object
+ This function returns `t' if OBJECT is a character or an integer
+ that can be converted into one.
+
+\1f
+File: lispref.info, Node: Text Comparison, Next: String Conversion, Prev: Character Codes, Up: Strings and Characters
+
+Comparison of Characters and Strings
+====================================
+
+ - Function: char-equal character1 character2 &optional buffer
+ This function returns `t' if the arguments represent the same
+ character, `nil' otherwise. This function ignores differences in
+ case if the value of `case-fold-search' is non-`nil' in BUFFER,
+ which defaults to the current buffer.
+
+ (char-equal ?x ?x)
+ => t
+ (let ((case-fold-search t))
+ (char-equal ?x ?X))
+ => t
+ (let ((case-fold-search nil))
+ (char-equal ?x ?X))
+ => nil
+
+ - Function: char= character1 character2
+ This function returns `t' if the arguments represent the same
+ character, `nil' otherwise. Case is significant.
+
+ (char= ?x ?x)
+ => t
+ (char= ?x ?X)
+ => nil
+ (let ((case-fold-search t))
+ (char-equal ?x ?X))
+ => nil
+ (let ((case-fold-search nil))
+ (char-equal ?x ?X))
+ => nil
+
+ - Function: string= string1 string2
+ This function returns `t' if the characters of the two strings
+ match exactly; case is significant.
+
+ (string= "abc" "abc")
+ => t
+ (string= "abc" "ABC")
+ => nil
+ (string= "ab" "ABC")
+ => nil
+
+
+ - Function: string-equal string1 string2
+ `string-equal' is another name for `string='.
+
+ - Function: string< string1 string2
+ This function compares two strings a character at a time. First it
+ scans both the strings at once to find the first pair of
+ corresponding characters that do not match. If the lesser
+ character of those two is the character from STRING1, then STRING1
+ is less, and this function returns `t'. If the lesser character
+ is the one from STRING2, then STRING1 is greater, and this
+ function returns `nil'. If the two strings match entirely, the
+ value is `nil'.
+
+ Pairs of characters are compared by their ASCII codes. Keep in
+ mind that lower case letters have higher numeric values in the
+ ASCII character set than their upper case counterparts; numbers and
+ many punctuation characters have a lower numeric value than upper
+ case letters.
+
+ (string< "abc" "abd")
+ => t
+ (string< "abd" "abc")
+ => nil
+ (string< "123" "abc")
+ => t
+
+ When the strings have different lengths, and they match up to the
+ length of STRING1, then the result is `t'. If they match up to
+ the length of STRING2, the result is `nil'. A string of no
+ characters is less than any other string.
+
+ (string< "" "abc")
+ => t
+ (string< "ab" "abc")
+ => t
+ (string< "abc" "")
+ => nil
+ (string< "abc" "ab")
+ => nil
+ (string< "" "")
+ => nil
+
+ - Function: string-lessp string1 string2
+ `string-lessp' is another name for `string<'.
+
+ See also `compare-buffer-substrings' in *Note Comparing Text::, for
+a way to compare text in buffers. The function `string-match', which
+matches a regular expression against a string, can be used for a kind
+of string comparison; see *Note Regexp Search::.
+
+\1f
+File: lispref.info, Node: String Conversion, Next: Modifying Strings, Prev: Text Comparison, Up: Strings and Characters
+
+Conversion of Characters and Strings
+====================================
+
+This section describes functions for conversions between characters,
+strings and integers. `format' and `prin1-to-string' (*note Output
+Functions::) can also convert Lisp objects into strings.
+`read-from-string' (*note Input Functions::) can "convert" a string
+representation of a Lisp object into an object.
+
+ *Note Documentation::, for functions that produce textual
+descriptions of text characters and general input events
+(`single-key-description' and `text-char-description'). These
+functions are used primarily for making help messages.
+
+ - Function: char-to-string character
+ This function returns a new string with a length of one character.
+ The value of CHARACTER, modulo 256, is used to initialize the
+ element of the string.
+
+ This function is similar to `make-string' with an integer argument
+ of 1. (*Note Creating Strings::.) This conversion can also be
+ done with `format' using the `%c' format specification. (*Note
+ Formatting Strings::.)
+
+ (char-to-string ?x)
+ => "x"
+ (char-to-string (+ 256 ?x))
+ => "x"
+ (make-string 1 ?x)
+ => "x"
+
+ - Function: string-to-char string
+ This function returns the first character in STRING. If the
+ string is empty, the function returns 0. (Under XEmacs 19, the
+ value is also 0 when the first character of STRING is the null
+ character, ASCII code 0.)
+
+ (string-to-char "ABC")
+ => ?A ;; Under XEmacs 20.
+ => 65 ;; Under XEmacs 19.
+ (string-to-char "xyz")
+ => ?x ;; Under XEmacs 20.
+ => 120 ;; Under XEmacs 19.
+ (string-to-char "")
+ => 0
+ (string-to-char "\000")
+ => ?\^ ;; Under XEmacs 20.
+ => 0 ;; Under XEmacs 20.
+
+ This function may be eliminated in the future if it does not seem
+ useful enough to retain.
+
+ - Function: number-to-string number
+ This function returns a string consisting of the printed
+ representation of NUMBER, which may be an integer or a floating
+ point number. The value starts with a sign if the argument is
+ negative.
+
+ (number-to-string 256)
+ => "256"
+ (number-to-string -23)
+ => "-23"
+ (number-to-string -23.5)
+ => "-23.5"
+
+ `int-to-string' is a semi-obsolete alias for this function.
+
+ See also the function `format' in *Note Formatting Strings::.
+
+ - Function: string-to-number string &optional base
+ This function returns the numeric value represented by STRING,
+ read in BASE. It skips spaces and tabs at the beginning of
+ STRING, then reads as much of STRING as it can interpret as a
+ number. (On some systems it ignores other whitespace at the
+ beginning, not just spaces and tabs.) If the first character
+ after the ignored whitespace is not a digit or a minus sign, this
+ function returns 0.
+
+ If BASE is not specified, it defaults to ten. With BASE other
+ than ten, only integers can be read.
+
+ (string-to-number "256")
+ => 256
+ (string-to-number "25 is a perfect square.")
+ => 25
+ (string-to-number "X256")
+ => 0
+ (string-to-number "-4.5")
+ => -4.5
+ (string-to-number "ffff" 16)
+ => 65535
+
+ `string-to-int' is an obsolete alias for this function.
+
+\1f
+File: lispref.info, Node: Modifying Strings, Next: String Properties, Prev: String Conversion, Up: Strings and Characters
+
+Modifying Strings
+=================
+
+You can modify a string using the general array-modifying primitives.
+*Note Arrays::. The function `aset' modifies a single character; the
+function `fillarray' sets all characters in the string to a specified
+character.
+
+ Each string has a tick counter that starts out at zero (when the
+string is created) and is incremented each time a change is made to that
+string.
+
+ - Function: string-modified-tick string
+ This function returns the tick counter for `string'.
+
+\1f
+File: lispref.info, Node: String Properties, Next: Formatting Strings, Prev: Modifying Strings, Up: Strings and Characters
+
+String Properties
+=================
+
+Just as with symbols, extents, faces, and glyphs, you can attach
+additional information to strings in the form of "string properties".
+These differ from text properties, which are logically attached to
+particular characters in the string.
+
+ To attach a property to a string, use `put'. To retrieve a property
+from a string, use `get'. You can also use `remprop' to remove a
+property from a string and `object-plist' to retrieve a list of all the
+properties in a string.
+
+\1f
+File: lispref.info, Node: Formatting Strings, Next: Character Case, Prev: String Properties, Up: Strings and Characters
+
+Formatting Strings
+==================
+
+"Formatting" means constructing a string by substitution of computed
+values at various places in a constant string. This string controls
+how the other values are printed as well as where they appear; it is
+called a "format string".
+
+ Formatting is often useful for computing messages to be displayed.
+In fact, the functions `message' and `error' provide the same
+formatting feature described here; they differ from `format' only in
+how they use the result of formatting.
+
+ - Function: format string &rest objects
+ This function returns a new string that is made by copying STRING
+ and then replacing any format specification in the copy with
+ encodings of the corresponding OBJECTS. The arguments OBJECTS are
+ the computed values to be formatted.
+
+ A format specification is a sequence of characters beginning with a
+`%'. Thus, if there is a `%d' in STRING, the `format' function
+replaces it with the printed representation of one of the values to be
+formatted (one of the arguments OBJECTS). For example:
+
+ (format "The value of fill-column is %d." fill-column)
+ => "The value of fill-column is 72."
+
+ If STRING contains more than one format specification, the format
+specifications correspond with successive values from OBJECTS. Thus,
+the first format specification in STRING uses the first such value, the
+second format specification uses the second such value, and so on. Any
+extra format specifications (those for which there are no corresponding
+values) cause unpredictable behavior. Any extra values to be formatted
+are ignored.
+
+ Certain format specifications require values of particular types.
+However, no error is signaled if the value actually supplied fails to
+have the expected type. Instead, the output is likely to be
+meaningless.
+
+ Here is a table of valid format specifications:
+
+`%s'
+ Replace the specification with the printed representation of the
+ object, made without quoting. Thus, strings are represented by
+ their contents alone, with no `"' characters, and symbols appear
+ without `\' characters. This is equivalent to printing the object
+ with `princ'.
+
+ If there is no corresponding object, the empty string is used.
+
+`%S'
+ Replace the specification with the printed representation of the
+ object, made with quoting. Thus, strings are enclosed in `"'
+ characters, and `\' characters appear where necessary before
+ special characters. This is equivalent to printing the object
+ with `prin1'.
+
+ If there is no corresponding object, the empty string is used.
+
+`%o'
+ Replace the specification with the base-eight representation of an
+ integer.
+
+`%d'
+`%i'
+ Replace the specification with the base-ten representation of an
+ integer.
+
+`%x'
+ Replace the specification with the base-sixteen representation of
+ an integer, using lowercase letters.
+
+`%X'
+ Replace the specification with the base-sixteen representation of
+ an integer, using uppercase letters.
+
+`%c'
+ Replace the specification with the character which is the value
+ given.
+
+`%e'
+ Replace the specification with the exponential notation for a
+ floating point number (e.g. `7.85200e+03').
+
+`%f'
+ Replace the specification with the decimal-point notation for a
+ floating point number.
+
+`%g'
+ Replace the specification with notation for a floating point
+ number, using a "pretty format". Either exponential notation or
+ decimal-point notation will be used (usually whichever is
+ shorter), and trailing zeroes are removed from the fractional part.
+
+`%%'
+ A single `%' is placed in the string. This format specification is
+ unusual in that it does not use a value. For example, `(format "%%
+ %d" 30)' returns `"% 30"'.
+
+ Any other format character results in an `Invalid format operation'
+error.
+
+ Here are several examples:
+
+ (format "The name of this buffer is %s." (buffer-name))
+ => "The name of this buffer is strings.texi."
+
+ (format "The buffer object prints as %s." (current-buffer))
+ => "The buffer object prints as #<buffer strings.texi>."
+
+ (format "The octal value of %d is %o,
+ and the hex value is %x." 18 18 18)
+ => "The octal value of 18 is 22,
+ and the hex value is 12."
+
+ There are many additional flags and specifications that can occur
+between the `%' and the format character, in the following order:
+
+ 1. An optional repositioning specification, which is a positive
+ integer followed by a `$'.
+
+ 2. Zero or more of the optional flag characters `-', `+', ` ', `0',
+ and `#'.
+
+ 3. An asterisk (`*', meaning that the field width is now assumed to
+ have been specified as an argument.
+
+ 4. An optional minimum field width.
+
+ 5. An optional precision, preceded by a `.' character.
+
+ A "repositioning" specification changes which argument to `format'
+is used by the current and all following format specifications.
+Normally the first specification uses the first argument, the second
+specification uses the second argument, etc. Using a repositioning
+specification, you can change this. By placing a number N followed by
+a `$' between the `%' and the format character, you cause the
+specification to use the Nth argument. The next specification will use
+the N+1'th argument, etc.
+
+ For example:
+
+ (format "Can't find file `%s' in directory `%s'."
+ "ignatius.c" "loyola/")
+ => "Can't find file `ignatius.c' in directory `loyola/'."
+
+ (format "In directory `%2$s', the file `%1$s' was not found."
+ "ignatius.c" "loyola/")
+ => "In directory `loyola/', the file `ignatius.c' was not found."
+
+ (format
+ "The numbers %d and %d are %1$x and %x in hex and %1$o and %o in octal."
+ 37 12)
+ => "The numbers 37 and 12 are 25 and c in hex and 45 and 14 in octal."
+
+ As you can see, this lets you reprocess arguments more than once or
+reword a format specification (thereby moving the arguments around)
+without having to actually reorder the arguments. This is especially
+useful in translating messages from one language to another: Different
+languages use different word orders, and this sometimes entails changing
+the order of the arguments. By using repositioning specifications,
+this can be accomplished without having to embed knowledge of particular
+languages into the location in the program's code where the message is
+displayed.
+
+ All the specification characters allow an optional numeric prefix
+between the `%' and the character, and following any repositioning
+specification or flag. The optional numeric prefix defines the minimum
+width for the object. If the printed representation of the object
+contains fewer characters than this, then it is padded. The padding is
+normally on the left, but will be on the right if the `-' flag
+character is given. The padding character is normally a space, but if
+the `0' flag character is given, zeros are used for padding.
+
+ (format "%06d is padded on the left with zeros" 123)
+ => "000123 is padded on the left with zeros"
+
+ (format "%-6d is padded on the right" 123)
+ => "123 is padded on the right"
+
+ `format' never truncates an object's printed representation, no
+matter what width you specify. Thus, you can use a numeric prefix to
+specify a minimum spacing between columns with no risk of losing
+information.
+
+ In the following three examples, `%7s' specifies a minimum width of
+7. In the first case, the string inserted in place of `%7s' has only 3
+letters, so 4 blank spaces are inserted for padding. In the second
+case, the string `"specification"' is 13 letters wide but is not
+truncated. In the third case, the padding is on the right.
+
+ (format "The word `%7s' actually has %d letters in it."
+ "foo" (length "foo"))
+ => "The word ` foo' actually has 3 letters in it."
+
+ (format "The word `%7s' actually has %d letters in it."
+ "specification" (length "specification"))
+ => "The word `specification' actually has 13 letters in it."
+
+ (format "The word `%-7s' actually has %d letters in it."
+ "foo" (length "foo"))
+ => "The word `foo ' actually has 3 letters in it."
+
+ After any minimum field width, a precision may be specified by
+preceding it with a `.' character. The precision specifies the minimum
+number of digits to appear in `%d', `%i', `%o', `%x', and `%X'
+conversions (the number is padded on the left with zeroes as
+necessary); the number of digits printed after the decimal point for
+`%f', `%e', and `%E' conversions; the number of significant digits
+printed in `%g' and `%G' conversions; and the maximum number of
+non-padding characters printed in `%s' and `%S' conversions. The
+default precision for floating-point conversions is six.
+
+ The other flag characters have the following meanings:
+
+ * The ` ' flag means prefix non-negative numbers with a space.
+
+ * The `+' flag means prefix non-negative numbers with a plus sign.
+
+ * The `#' flag means print numbers in an alternate, more verbose
+ format: octal numbers begin with zero; hex numbers begin with a
+ `0x' or `0X'; a decimal point is printed in `%f', `%e', and `%E'
+ conversions even if no numbers are printed after it; and trailing
+ zeroes are not omitted in `%g' and `%G' conversions.
+
+\1f
+File: lispref.info, Node: Character Case, Next: Case Tables, Prev: Formatting Strings, Up: Strings and Characters
+
+Character Case
+==============
+
+The character case functions change the case of single characters or of
+the contents of strings. The functions convert only alphabetic
+characters (the letters `A' through `Z' and `a' through `z'); other
+characters are not altered. The functions do not modify the strings
+that are passed to them as arguments.
+
+ The examples below use the characters `X' and `x' which have ASCII
+codes 88 and 120 respectively.
+
+ - Function: downcase string-or-char &optional buffer
+ This function converts a character or a string to lower case.
+
+ When the argument to `downcase' is a string, the function creates
+ and returns a new string in which each letter in the argument that
+ is upper case is converted to lower case. When the argument to
+ `downcase' is a character, `downcase' returns the corresponding
+ lower case character. (This value is actually an integer under
+ XEmacs 19.) If the original character is lower case, or is not a
+ letter, then the value equals the original character.
+
+ Optional second arg BUFFER specifies which buffer's case tables to
+ use, and defaults to the current buffer.
+
+ (downcase "The cat in the hat")
+ => "the cat in the hat"
+
+ (downcase ?X)
+ => ?x ;; Under XEmacs 20.
+ => 120 ;; Under XEmacs 19.
+
+ - Function: upcase string-or-char &optional buffer
+ This function converts a character or a string to upper case.
+
+ When the argument to `upcase' is a string, the function creates
+ and returns a new string in which each letter in the argument that
+ is lower case is converted to upper case.
+
+ When the argument to `upcase' is a character, `upcase' returns the
+ corresponding upper case character. (This value is actually an
+ integer under XEmacs 19.) If the original character is upper
+ case, or is not a letter, then the value equals the original
+ character.
+
+ Optional second arg BUFFER specifies which buffer's case tables to
+ use, and defaults to the current buffer.
+
+ (upcase "The cat in the hat")
+ => "THE CAT IN THE HAT"
+
+ (upcase ?x)
+ => ?X ;; Under XEmacs 20.
+ => 88 ;; Under XEmacs 19.
+
+ - Function: capitalize string-or-char &optional buffer
+ This function capitalizes strings or characters. If
+ STRING-OR-CHAR is a string, the function creates and returns a new
+ string, whose contents are a copy of STRING-OR-CHAR in which each
+ word has been capitalized. This means that the first character of
+ each word is converted to upper case, and the rest are converted
+ to lower case.
+
+ The definition of a word is any sequence of consecutive characters
+ that are assigned to the word constituent syntax class in the
+ current syntax table (*note Syntax Class Table::).
+
+ When the argument to `capitalize' is a character, `capitalize' has
+ the same result as `upcase'.
+
+ Optional second arg BUFFER specifies which buffer's case tables to
+ use, and defaults to the current buffer.
+
+ (capitalize "The cat in the hat")
+ => "The Cat In The Hat"
+
+ (capitalize "THE 77TH-HATTED CAT")
+ => "The 77th-Hatted Cat"
+
+ (capitalize ?x)
+ => ?X ;; Under XEmacs 20.
+ => 88 ;; Under XEmacs 19.
+
+\1f
+File: lispref.info, Node: Case Tables, Next: Char Tables, Prev: Character Case, Up: Strings and Characters
+
+The Case Table
+==============
+
+You can customize case conversion by installing a special "case table".
+A case table specifies the mapping between upper case and lower case
+letters. It affects both the string and character case conversion
+functions (see the previous section) and those that apply to text in the
+buffer (*note Case Changes::). You need a case table if you are using a
+language which has letters other than the standard ASCII letters.
+
+ A case table is a list of this form:
+
+ (DOWNCASE UPCASE CANONICALIZE EQUIVALENCES)
+
+where each element is either `nil' or a string of length 256. The
+element DOWNCASE says how to map each character to its lower-case
+equivalent. The element UPCASE maps each character to its upper-case
+equivalent. If lower and upper case characters are in one-to-one
+correspondence, use `nil' for UPCASE; then XEmacs deduces the upcase
+table from DOWNCASE.
+
+ For some languages, upper and lower case letters are not in
+one-to-one correspondence. There may be two different lower case
+letters with the same upper case equivalent. In these cases, you need
+to specify the maps for both directions.
+
+ The element CANONICALIZE maps each character to a canonical
+equivalent; any two characters that are related by case-conversion have
+the same canonical equivalent character.
+
+ The element EQUIVALENCES is a map that cyclicly permutes each
+equivalence class (of characters with the same canonical equivalent).
+(For ordinary ASCII, this would map `a' into `A' and `A' into `a', and
+likewise for each set of equivalent characters.)
+
+ When you construct a case table, you can provide `nil' for
+CANONICALIZE; then Emacs fills in this string from UPCASE and DOWNCASE.
+You can also provide `nil' for EQUIVALENCES; then Emacs fills in this
+string from CANONICALIZE. In a case table that is actually in use,
+those components are non-`nil'. Do not try to specify EQUIVALENCES
+without also specifying CANONICALIZE.
+
+ Each buffer has a case table. XEmacs also has a "standard case
+table" which is copied into each buffer when you create the buffer.
+Changing the standard case table doesn't affect any existing buffers.
+
+ Here are the functions for working with case tables:
+
+ - Function: case-table-p object
+ This predicate returns non-`nil' if OBJECT is a valid case table.
+
+ - Function: set-standard-case-table case-table
+ This function makes CASE-TABLE the standard case table, so that it
+ will apply to any buffers created subsequently.
+
+ - Function: standard-case-table
+ This returns the standard case table.
+
+ - Function: current-case-table &optional buffer
+ This function returns the case table of BUFFER, which defaults to
+ the current buffer.
+
+ - Function: set-case-table case-table
+ This sets the current buffer's case table to CASE-TABLE.
+
+ The following three functions are convenient subroutines for packages
+that define non-ASCII character sets. They modify a string
+DOWNCASE-TABLE provided as an argument; this should be a string to be
+used as the DOWNCASE part of a case table. They also modify the
+standard syntax table. *Note Syntax Tables::.
+
+ - Function: set-case-syntax-pair uc lc downcase-table
+ This function specifies a pair of corresponding letters, one upper
+ case and one lower case.
+
+ - Function: set-case-syntax-delims l r downcase-table
+ This function makes characters L and R a matching pair of
+ case-invariant delimiters.
+
+ - Function: set-case-syntax char syntax downcase-table
+ This function makes CHAR case-invariant, with syntax SYNTAX.
+
+ - Command: describe-buffer-case-table
+ This command displays a description of the contents of the current
+ buffer's case table.
+
+ You can load the library `iso-syntax' to set up the standard syntax
+table and define a case table for the 8-bit ISO Latin 1 character set.
+
+\1f
+File: lispref.info, Node: Char Tables, Prev: Case Tables, Up: Strings and Characters
+
+The Char Table
+==============
+
+A char table is a table that maps characters (or ranges of characters)
+to values. Char tables are specialized for characters, only allowing
+particular sorts of ranges to be assigned values. Although this loses
+in generality, it makes for extremely fast (constant-time) lookups, and
+thus is feasible for applications that do an extremely large number of
+lookups (e.g. scanning a buffer for a character in a particular syntax,
+where a lookup in the syntax table must occur once per character).
+
+ Note that char tables as a primitive type, and all of the functions
+in this section, exist only in XEmacs 20. In XEmacs 19, char tables are
+generally implemented using a vector of 256 elements.
+
+ When MULE support exists, the types of ranges that can be assigned
+values are
+
+ * all characters
+
+ * an entire charset
+
+ * a single row in a two-octet charset
+
+ * a single character
+
+ When MULE support is not present, the types of ranges that can be
+assigned values are
+
+ * all characters
+
+ * a single character
+
+ - Function: char-table-p object
+ This function returns non-`nil' if OBJECT is a char table.
+
+* Menu:
+
+* Char Table Types:: Char tables have different uses.
+* Working With Char Tables:: Creating and working with char tables.
+
+\1f
+File: lispref.info, Node: Char Table Types, Next: Working With Char Tables, Up: Char Tables
+
+Char Table Types
+----------------
+
+Each char table type is used for a different purpose and allows
+different sorts of values. The different char table types are
+
+`category'
+ Used for category tables, which specify the regexp categories that
+ a character is in. The valid values are `nil' or a bit vector of
+ 95 elements. Higher-level Lisp functions are provided for working
+ with category tables. Currently categories and category tables
+ only exist when MULE support is present.
+
+`char'
+ A generalized char table, for mapping from one character to
+ another. Used for case tables, syntax matching tables,
+ `keyboard-translate-table', etc. The valid values are characters.
+
+`generic'
+ An even more generalized char table, for mapping from a character
+ to anything.
+
+`display'
+ Used for display tables, which specify how a particular character
+ is to appear when displayed. #### Not yet implemented.
+
+`syntax'
+ Used for syntax tables, which specify the syntax of a particular
+ character. Higher-level Lisp functions are provided for working
+ with syntax tables. The valid values are integers.
+
+ - Function: char-table-type char-table
+ This function returns the type of char table CHAR-TABLE.
+
+ - Function: char-table-type-list
+ This function returns a list of the recognized char table types.
+
+ - Function: valid-char-table-type-p type
+ This function returns `t' if TYPE if a recognized char table type.
+
+\1f
+File: lispref.info, Node: Working With Char Tables, Prev: Char Table Types, Up: Char Tables
+
+Working With Char Tables
+------------------------
+
+ - Function: make-char-table type
+ This function makes a new, empty char table of type TYPE. TYPE
+ should be a symbol, one of `char', `category', `display',
+ `generic', or `syntax'.
+
+ - Function: put-char-table range value char-table
+ This function sets the value for chars in RANGE to be VALUE in
+ CHAR-TABLE.
+
+ RANGE specifies one or more characters to be affected and should be
+ one of the following:
+
+ * `t' (all characters are affected)
+
+ * A charset (only allowed when MULE support is present)
+
+ * A vector of two elements: a two-octet charset and a row number
+ (only allowed when MULE support is present)
+
+ * A single character
+
+ VALUE must be a value appropriate for the type of CHAR-TABLE.
+
+ - Function: get-char-table character char-table
+ This function finds the value for CHARACTER in CHAR-TABLE.
+
+ - Function: get-range-char-table range char-table &optional multi
+ This function finds the value for a range in CHAR-TABLE. If there
+ is more than one value, MULTI is returned (defaults to `nil').
+
+ - Function: reset-char-table char-table
+ This function resets CHAR-TABLE to its default state.
+
+ - Function: map-char-table function char-table &optional range
+ This function maps FUNCTION over entries in CHAR-TABLE, calling it
+ with two args, each key and value in the table.
+
+ RANGE specifies a subrange to map over and is in the same format
+ as the RANGE argument to `put-range-table'. If omitted or `t', it
+ defaults to the entire table.
+
+ - Function: valid-char-table-value-p value char-table-type
+ This function returns non-`nil' if VALUE is a valid value for
+ CHAR-TABLE-TYPE.
+
+ - Function: check-valid-char-table-value value char-table-type
+ This function signals an error if VALUE is not a valid value for
+ CHAR-TABLE-TYPE.
+
+\1f
+File: lispref.info, Node: Lists, Next: Sequences Arrays Vectors, Prev: Strings and Characters, Up: Top
+
+Lists
+*****
+
+A "list" represents a sequence of zero or more elements (which may be
+any Lisp objects). The important difference between lists and vectors
+is that two or more lists can share part of their structure; in
+addition, you can insert or delete elements in a list without copying
+the whole list.
+
+* Menu:
+
+* Cons Cells:: How lists are made out of cons cells.
+* Lists as Boxes:: Graphical notation to explain lists.
+* List-related Predicates:: Is this object a list? Comparing two lists.
+* List Elements:: Extracting the pieces of a list.
+* Building Lists:: Creating list structure.
+* Modifying Lists:: Storing new pieces into an existing list.
+* Sets And Lists:: A list can represent a finite mathematical set.
+* Association Lists:: A list can represent a finite relation or mapping.
+* Property Lists:: A different way to represent a finite mapping.
+* Weak Lists:: A list with special garbage-collection behavior.
+
+\1f
+File: lispref.info, Node: Cons Cells, Next: Lists as Boxes, Up: Lists
+
+Lists and Cons Cells
+====================
+
+Lists in Lisp are not a primitive data type; they are built up from
+"cons cells". A cons cell is a data object that represents an ordered
+pair. It records two Lisp objects, one labeled as the CAR, and the
+other labeled as the CDR. These names are traditional; see *Note Cons
+Cell Type::. CDR is pronounced "could-er."
+
+ A list is a series of cons cells chained together, one cons cell per
+element of the list. By convention, the CARs of the cons cells are the
+elements of the list, and the CDRs are used to chain the list: the CDR
+of each cons cell is the following cons cell. The CDR of the last cons
+cell is `nil'. This asymmetry between the CAR and the CDR is entirely
+a matter of convention; at the level of cons cells, the CAR and CDR
+slots have the same characteristics.
+
+ Because most cons cells are used as part of lists, the phrase "list
+structure" has come to mean any structure made out of cons cells.
+
+ The symbol `nil' is considered a list as well as a symbol; it is the
+list with no elements. For convenience, the symbol `nil' is considered
+to have `nil' as its CDR (and also as its CAR).
+
+ The CDR of any nonempty list L is a list containing all the elements
+of L except the first.
+
+\1f
+File: lispref.info, Node: Lists as Boxes, Next: List-related Predicates, Prev: Cons Cells, Up: Lists
+
+Lists as Linked Pairs of Boxes
+==============================
+
+A cons cell can be illustrated as a pair of boxes. The first box
+represents the CAR and the second box represents the CDR. Here is an
+illustration of the two-element list, `(tulip lily)', made from two
+cons cells:
+
+ --------------- ---------------
+ | car | cdr | | car | cdr |
+ | tulip | o---------->| lily | nil |
+ | | | | | |
+ --------------- ---------------
+
+ Each pair of boxes represents a cons cell. Each box "refers to",
+"points to" or "contains" a Lisp object. (These terms are synonymous.)
+The first box, which is the CAR of the first cons cell, contains the
+symbol `tulip'. The arrow from the CDR of the first cons cell to the
+second cons cell indicates that the CDR of the first cons cell points
+to the second cons cell.
+
+ The same list can be illustrated in a different sort of box notation
+like this:
+
+ ___ ___ ___ ___
+ |___|___|--> |___|___|--> nil
+ | |
+ | |
+ --> tulip --> lily
+
+ Here is a more complex illustration, showing the three-element list,
+`((pine needles) oak maple)', the first element of which is a
+two-element list:
+
+ ___ ___ ___ ___ ___ ___
+ |___|___|--> |___|___|--> |___|___|--> nil
+ | | |
+ | | |
+ | --> oak --> maple
+ |
+ | ___ ___ ___ ___
+ --> |___|___|--> |___|___|--> nil
+ | |
+ | |
+ --> pine --> needles
+
+ The same list represented in the first box notation looks like this:
+
+ -------------- -------------- --------------
+ | car | cdr | | car | cdr | | car | cdr |
+ | o | o------->| oak | o------->| maple | nil |
+ | | | | | | | | | |
+ -- | --------- -------------- --------------
+ |
+ |
+ | -------------- ----------------
+ | | car | cdr | | car | cdr |
+ ------>| pine | o------->| needles | nil |
+ | | | | | |
+ -------------- ----------------
+
+ *Note Cons Cell Type::, for the read and print syntax of cons cells
+and lists, and for more "box and arrow" illustrations of lists.
+
+\1f
+File: lispref.info, Node: List-related Predicates, Next: List Elements, Prev: Lists as Boxes, Up: Lists
+
+Predicates on Lists
+===================
+
+The following predicates test whether a Lisp object is an atom, is a
+cons cell or is a list, or whether it is the distinguished object
+`nil'. (Many of these predicates can be defined in terms of the
+others, but they are used so often that it is worth having all of them.)
+
+ - Function: consp object
+ This function returns `t' if OBJECT is a cons cell, `nil'
+ otherwise. `nil' is not a cons cell, although it _is_ a list.
+
+ - Function: atom object
+ This function returns `t' if OBJECT is an atom, `nil' otherwise.
+ All objects except cons cells are atoms. The symbol `nil' is an
+ atom and is also a list; it is the only Lisp object that is both.
+
+ (atom OBJECT) == (not (consp OBJECT))
+
+ - Function: listp object
+ This function returns `t' if OBJECT is a cons cell or `nil'.
+ Otherwise, it returns `nil'.
+
+ (listp '(1))
+ => t
+ (listp '())
+ => t
+
+ - Function: nlistp object
+ This function is the opposite of `listp': it returns `t' if OBJECT
+ is not a list. Otherwise, it returns `nil'.
+
+ (listp OBJECT) == (not (nlistp OBJECT))
+
+ - Function: null object
+ This function returns `t' if OBJECT is `nil', and returns `nil'
+ otherwise. This function is identical to `not', but as a matter
+ of clarity we use `null' when OBJECT is considered a list and
+ `not' when it is considered a truth value (see `not' in *Note
+ Combining Conditions::).
+
+ (null '(1))
+ => nil
+ (null '())
+ => t
+