changeset 73590:dcc218a536a8

info/eintr-1: Updated Info file to Third Edition for `Introduction to Programming in Emacs Lisp'
author Robert J. Chassell <bob@rattlesnake.com>
date Tue, 31 Oct 2006 17:00:13 +0000
parents 2660f3193d24
children b214bd8be620
files info/eintr-1
diffstat 1 files changed, 7313 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/info/eintr-1	Tue Oct 31 17:00:13 2006 +0000
@@ -0,0 +1,7313 @@
+This is ../info/eintr, produced by makeinfo version 4.8 from
+emacs-lisp-intro.texi.
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* Emacs Lisp Intro: (eintr).
+  			A simple introduction to Emacs Lisp programming.
+END-INFO-DIR-ENTRY
+
+This is an `Introduction to Programming in Emacs Lisp', for people who
+are not programmers.
+
+Edition 3.00, 2006 Oct 31
+
+Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001,    2002,
+2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+Published by the:
+
+     GNU Press,                          Website: http://www.gnupress.org
+     a division of the                   General: press@gnu.org
+     Free Software Foundation, Inc.      Orders:  sales@gnu.org
+     51 Franklin Street, Fifth Floor     Tel: +1 (617) 542-5942
+     Boston, MA 02110-1301 USA           Fax: +1 (617) 542-2652
+
+
+ISBN 1-882114-43-4
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; there
+being no Invariant Section, with the Front-Cover Texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+(a) The FSF's Back-Cover Text is: "You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development."
+
+
+File: eintr,  Node: Top,  Next: Preface,  Prev: (dir),  Up: (dir)
+
+An Introduction to Programming in Emacs Lisp
+********************************************
+
+This is an `Introduction to Programming in Emacs Lisp', for people who
+are not programmers.
+
+Edition 3.00, 2006 Oct 31
+
+Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001,    2002,
+2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+Published by the:
+
+     GNU Press,                          Website: http://www.gnupress.org
+     a division of the                   General: press@gnu.org
+     Free Software Foundation, Inc.      Orders:  sales@gnu.org
+     51 Franklin Street, Fifth Floor     Tel: +1 (617) 542-5942
+     Boston, MA 02110-1301 USA           Fax: +1 (617) 542-2652
+
+
+ISBN 1-882114-43-4
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; there
+being no Invariant Section, with the Front-Cover Texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+(a) The FSF's Back-Cover Text is: "You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development."
+
+This master menu first lists each chapter and index; then it lists
+every node in every chapter.
+
+* Menu:
+
+* Preface::                     What to look for.
+* List Processing::             What is Lisp?
+* Practicing Evaluation::       Running several programs.
+* Writing Defuns::              How to write function definitions.
+* Buffer Walk Through::         Exploring a few buffer-related functions.
+* More Complex::                A few, even more complex functions.
+* Narrowing & Widening::        Restricting your and Emacs attention to
+                                    a region.
+* car cdr & cons::              Fundamental functions in Lisp.
+* Cutting & Storing Text::      Removing text and saving it.
+* List Implementation::         How lists are implemented in the computer.
+* Yanking::                     Pasting stored text.
+* Loops & Recursion::           How to repeat a process.
+* Regexp Search::               Regular expression searches.
+* Counting Words::              A review of repetition and regexps.
+* Words in a defun::            Counting words in a `defun'.
+* Readying a Graph::            A prototype graph printing function.
+* Emacs Initialization::        How to write a `.emacs' file.
+* Debugging::                   How to run the Emacs Lisp debuggers.
+* Conclusion::                  Now you have the basics.
+* the-the::                     An appendix: how to find reduplicated words.
+* Kill Ring::                   An appendix: how the kill ring works.
+* Full Graph::                  How to create a graph with labelled axes.
+* Free Software and Free Manuals::
+* GNU Free Documentation License::
+* Index::
+* About the Author::
+
+ --- The Detailed Node Listing ---
+
+Preface
+
+* Why::                         Why learn Emacs Lisp?
+* On Reading this Text::        Read, gain familiarity, pick up habits....
+* Who You Are::                 For whom this is written.
+* Lisp History::
+* Note for Novices::            You can read this as a novice.
+* Thank You::
+
+List Processing
+
+* Lisp Lists::                  What are lists?
+* Run a Program::               Any list in Lisp is a program ready to run.
+* Making Errors::               Generating an error message.
+* Names & Definitions::         Names of symbols and function definitions.
+* Lisp Interpreter::            What the Lisp interpreter does.
+* Evaluation::                  Running a program.
+* Variables::                   Returning a value from a variable.
+* Arguments::                   Passing information to a function.
+* set & setq::                  Setting the value of a variable.
+* Summary::                     The major points.
+* Error Message Exercises::
+
+Lisp Lists
+
+* Numbers Lists::               List have numbers, other lists, in them.
+* Lisp Atoms::                  Elemental entities.
+* Whitespace in Lists::         Formatting lists to be readable.
+* Typing Lists::                How GNU Emacs helps you type lists.
+
+The Lisp Interpreter
+
+* Complications::               Variables, Special forms, Lists within.
+* Byte Compiling::              Specially processing code for speed.
+
+Evaluation
+
+* Evaluating Inner Lists::      Lists within lists...
+
+Variables
+
+* fill-column Example::
+* Void Function::               The error message for a symbol
+                                  without a function.
+* Void Variable::               The error message for a symbol without a value.
+
+Arguments
+
+* Data types::                  Types of data passed to a function.
+* Args as Variable or List::    An argument can be the value
+                                  of a variable or list.
+* Variable Number of Arguments::  Some functions may take a
+                                  variable number of arguments.
+* Wrong Type of Argument::      Passing an argument of the wrong type
+                                  to a function.
+* message::                     A useful function for sending messages.
+
+Setting the Value of a Variable
+
+* Using set::                  Setting values.
+* Using setq::                 Setting a quoted value.
+* Counting::                   Using `setq' to count.
+
+Practicing Evaluation
+
+* How to Evaluate::            Typing editing commands or C-x C-e
+                                 causes evaluation.
+* Buffer Names::               Buffers and files are different.
+* Getting Buffers::            Getting a buffer itself, not merely its name.
+* Switching Buffers::          How to change to another buffer.
+* Buffer Size & Locations::    Where point is located and the size of
+                               the buffer.
+* Evaluation Exercise::
+
+How To Write Function Definitions
+
+* Primitive Functions::
+* defun::                        The `defun' special form.
+* Install::                      Install a function definition.
+* Interactive::                  Making a function interactive.
+* Interactive Options::          Different options for `interactive'.
+* Permanent Installation::       Installing code permanently.
+* let::                          Creating and initializing local variables.
+* if::                           What if?
+* else::                         If--then--else expressions.
+* Truth & Falsehood::            What Lisp considers false and true.
+* save-excursion::               Keeping track of point, mark, and buffer.
+* Review::
+* defun Exercises::
+
+Install a Function Definition
+
+* Effect of installation::
+* Change a defun::              How to change a function definition.
+
+Make a Function Interactive
+
+* Interactive multiply-by-seven::  An overview.
+* multiply-by-seven in detail::  The interactive version.
+
+`let'
+
+* Prevent confusion::
+* Parts of let Expression::
+* Sample let Expression::
+* Uninitialized let Variables::
+
+The `if' Special Form
+
+* if in more detail::
+* type-of-animal in detail::    An example of an `if' expression.
+
+Truth and Falsehood in Emacs Lisp
+
+* nil explained::               `nil' has two meanings.
+
+`save-excursion'
+
+* Point and mark::              A review of various locations.
+* Template for save-excursion::
+
+A Few Buffer--Related Functions
+
+* Finding More::                How to find more information.
+* simplified-beginning-of-buffer::  Shows `goto-char',
+                                `point-min', and `push-mark'.
+* mark-whole-buffer::           Almost the same as `beginning-of-buffer'.
+* append-to-buffer::            Uses `save-excursion' and
+                                `insert-buffer-substring'.
+* Buffer Related Review::       Review.
+* Buffer Exercises::
+
+The Definition of `mark-whole-buffer'
+
+* mark-whole-buffer overview::
+* Body of mark-whole-buffer::   Only three lines of code.
+
+The Definition of `append-to-buffer'
+
+* append-to-buffer overview::
+* append interactive::          A two part interactive expression.
+* append-to-buffer body::       Incorporates a `let' expression.
+* append save-excursion::       How the `save-excursion' works.
+
+A Few More Complex Functions
+
+* copy-to-buffer::              With `set-buffer', `get-buffer-create'.
+* insert-buffer::               Read-only, and with `or'.
+* beginning-of-buffer::         Shows `goto-char',
+                                `point-min', and `push-mark'.
+* Second Buffer Related Review::
+* optional Exercise::
+
+The Definition of `insert-buffer'
+
+* insert-buffer code::
+* insert-buffer interactive::   When you can read, but not write.
+* insert-buffer body::          The body has an `or' and a `let'.
+* if & or::                     Using an `if' instead of an `or'.
+* Insert or::                   How the `or' expression works.
+* Insert let::                  Two `save-excursion' expressions.
+* New insert-buffer::
+
+The Interactive Expression in `insert-buffer'
+
+* Read-only buffer::            When a buffer cannot be modified.
+* b for interactive::           An existing buffer or else its name.
+
+Complete Definition of `beginning-of-buffer'
+
+* Optional Arguments::
+* beginning-of-buffer opt arg::  Example with optional argument.
+* beginning-of-buffer complete::
+
+`beginning-of-buffer' with an Argument
+
+* Disentangle beginning-of-buffer::
+* Large buffer case::
+* Small buffer case::
+
+Narrowing and Widening
+
+* Narrowing advantages::        The advantages of narrowing
+* save-restriction::            The `save-restriction' special form.
+* what-line::                   The number of the line that point is on.
+* narrow Exercise::
+
+`car', `cdr', `cons': Fundamental Functions
+
+* Strange Names::               An historical aside: why the strange names?
+* car & cdr::                   Functions for extracting part of a list.
+* cons::                        Constructing a list.
+* nthcdr::                      Calling `cdr' repeatedly.
+* nth::
+* setcar::                      Changing the first element of a list.
+* setcdr::                      Changing the rest of a list.
+* cons Exercise::
+
+`cons'
+
+* Build a list::
+* length::                      How to find the length of a list.
+
+Cutting and Storing Text
+
+* Storing Text::                Text is stored in a list.
+* zap-to-char::                 Cutting out text up to a character.
+* kill-region::                 Cutting text out of a region.
+* copy-region-as-kill::         A definition for copying text.
+* Digression into C::           Minor note on C programming language macros.
+* defvar::                      How to give a variable an initial value.
+* cons & search-fwd Review::
+* search Exercises::
+
+`zap-to-char'
+
+* Complete zap-to-char::        The complete implementation.
+* zap-to-char interactive::     A three part interactive expression.
+* zap-to-char body::            A short overview.
+* search-forward::              How to search for a string.
+* progn::                       The `progn' special form.
+* Summing up zap-to-char::      Using `point' and `search-forward'.
+
+`kill-region'
+
+* Complete kill-region::        The function definition.
+* condition-case::              Dealing with a problem.
+* Lisp macro::
+
+`copy-region-as-kill'
+
+* Complete copy-region-as-kill::  The complete function definition.
+* copy-region-as-kill body::    The body of `copy-region-as-kill'.
+
+The Body of `copy-region-as-kill'
+
+* last-command & this-command::
+* kill-append function::
+* kill-new function::
+
+Initializing a Variable with `defvar'
+
+* See variable current value::
+* defvar and asterisk::
+
+How Lists are Implemented
+
+* Lists diagrammed::
+* Symbols as Chest::            Exploring a powerful metaphor.
+* List Exercise::
+
+Yanking Text Back
+
+* Kill Ring Overview::
+* kill-ring-yank-pointer::      The kill ring is a list.
+* yank nthcdr Exercises::       The `kill-ring-yank-pointer' variable.
+
+Loops and Recursion
+
+* while::                       Causing a stretch of code to repeat.
+* dolist dotimes::
+* Recursion::                   Causing a function to call itself.
+* Looping exercise::
+
+`while'
+
+* Looping with while::          Repeat so long as test returns true.
+* Loop Example::                A `while' loop that uses a list.
+* print-elements-of-list::      Uses `while', `car', `cdr'.
+* Incrementing Loop::           A loop with an incrementing counter.
+* Decrementing Loop::           A loop with a decrementing counter.
+
+A Loop with an Incrementing Counter
+
+* Incrementing Example::        Counting pebbles in a triangle.
+* Inc Example parts::           The parts of the function definition.
+* Inc Example altogether::      Putting the function definition together.
+
+Loop with a Decrementing Counter
+
+* Decrementing Example::        More pebbles on the beach.
+* Dec Example parts::           The parts of the function definition.
+* Dec Example altogether::      Putting the function definition together.
+
+Save your time: `dolist' and `dotimes'
+
+* dolist::
+* dotimes::
+
+Recursion
+
+* Building Robots::             Same model, different serial number ...
+* Recursive Definition Parts::  Walk until you stop ...
+* Recursion with list::         Using a list as the test whether to recurse.
+* Recursive triangle function::
+* Recursion with cond::
+* Recursive Patterns::          Often used templates.
+* No Deferment::                Don't store up work ...
+* No deferment solution::
+
+Recursion in Place of a Counter
+
+* Recursive Example arg of 1 or 2::
+* Recursive Example arg of 3 or 4::
+
+Recursive Patterns
+
+* Every::
+* Accumulate::
+* Keep::
+
+Regular Expression Searches
+
+* sentence-end::                The regular expression for `sentence-end'.
+* re-search-forward::           Very similar to `search-forward'.
+* forward-sentence::            A straightforward example of regexp search.
+* forward-paragraph::           A somewhat complex example.
+* etags::                       How to create your own `TAGS' table.
+* Regexp Review::
+* re-search Exercises::
+
+`forward-sentence'
+
+* Complete forward-sentence::
+* fwd-sentence while loops::    Two `while' loops.
+* fwd-sentence re-search::      A regular expression search.
+
+`forward-paragraph': a Goldmine of Functions
+
+* forward-paragraph in brief::  Key parts of the function definition.
+* fwd-para let::                The `let*' expression.
+* fwd-para while::              The forward motion `while' loop.
+
+Counting: Repetition and Regexps
+
+* Why Count Words::
+* count-words-region::          Use a regexp, but find a problem.
+* recursive-count-words::       Start with case of no words in region.
+* Counting Exercise::
+
+The `count-words-region' Function
+
+* Design count-words-region::   The definition using a `while' loop.
+* Whitespace Bug::              The Whitespace Bug in `count-words-region'.
+
+Counting Words in a `defun'
+
+* Divide and Conquer::
+* Words and Symbols::           What to count?
+* Syntax::                      What constitutes a word or symbol?
+* count-words-in-defun::        Very like `count-words'.
+* Several defuns::              Counting several defuns in a file.
+* Find a File::                 Do you want to look at a file?
+* lengths-list-file::           A list of the lengths of many definitions.
+* Several files::               Counting in definitions in different files.
+* Several files recursively::   Recursively counting in different files.
+* Prepare the data::            Prepare the data for display in a graph.
+
+Count Words in `defuns' in Different Files
+
+* lengths-list-many-files::     Return a list of the lengths of defuns.
+* append::                      Attach one list to another.
+
+Prepare the Data for Display in a Graph
+
+* Sorting::                     Sorting lists.
+* Files List::                  Making a list of files.
+* Counting function definitions::
+
+Readying a Graph
+
+* Columns of a graph::
+* graph-body-print::            How to print the body of a graph.
+* recursive-graph-body-print::
+* Printed Axes::
+* Line Graph Exercise::
+
+Your `.emacs' File
+
+* Default Configuration::
+* Site-wide Init::              You can write site-wide init files.
+* defcustom::                   Emacs will write code for you.
+* Beginning a .emacs File::     How to write a `.emacs file'.
+* Text and Auto-fill::          Automatically wrap lines.
+* Mail Aliases::                Use abbreviations for email addresses.
+* Indent Tabs Mode::            Don't use tabs with TeX
+* Keybindings::                 Create some personal keybindings.
+* Keymaps::                     More about key binding.
+* Loading Files::               Load (i.e., evaluate) files automatically.
+* Autoload::                    Make functions available.
+* Simple Extension::            Define a function; bind it to a key.
+* X11 Colors::                  Colors in version 19 in X.
+* Miscellaneous::
+* Mode Line::                   How to customize your mode line.
+
+Debugging
+
+* debug::                       How to use the built-in debugger.
+* debug-on-entry::              Start debugging when you call a function.
+* debug-on-quit::               Start debugging when you quit with C-g.
+* edebug::                      How to use Edebug, a source level debugger.
+* Debugging Exercises::
+
+Handling the Kill Ring
+
+* current-kill::
+* yank::                        Paste a copy of a clipped element.
+* yank-pop::                    Insert element pointed to.
+* ring file::
+
+The `current-kill' Function
+
+* Understanding current-kill::
+
+`current-kill' in Outline
+
+* Digression concerning error::  How to mislead humans, but not computers.
+* Determining the Element::
+
+A Graph with Labelled Axes
+
+* Labelled Example::
+* print-graph Varlist::         `let' expression in `print-graph'.
+* print-Y-axis::                Print a label for the vertical axis.
+* print-X-axis::                Print a horizontal label.
+* Print Whole Graph::           The function to print a complete graph.
+
+The `print-Y-axis' Function
+
+* Height of label::             What height for the Y axis?
+* Compute a Remainder::         How to compute the remainder of a division.
+* Y Axis Element::              Construct a line for the Y axis.
+* Y-axis-column::               Generate a list of Y axis labels.
+* print-Y-axis Penultimate::    A not quite final version.
+
+The `print-X-axis' Function
+
+* Similarities differences::    Much like `print-Y-axis', but not exactly.
+* X Axis Tic Marks::            Create tic marks for the horizontal axis.
+
+Printing the Whole Graph
+
+* The final version::           A few changes.
+* Test print-graph::            Run a short test.
+* Graphing words in defuns::    Executing the final code.
+* lambda::                      How to write an anonymous function.
+* mapcar::                      Apply a function to elements of a list.
+* Another Bug::                 Yet another bug ... most insidious.
+* Final printed graph::         The graph itself!
+
+
+File: eintr,  Node: Preface,  Next: List Processing,  Prev: Top,  Up: Top
+
+Preface
+*******
+
+Most of the GNU Emacs integrated environment is written in the
+programming language called Emacs Lisp.  The code written in this
+programming language is the software--the sets of instructions--that
+tell the computer what to do when you give it commands.  Emacs is
+designed so that you can write new code in Emacs Lisp and easily
+install it as an extension to the editor.
+
+(GNU Emacs is sometimes called an "extensible editor", but it does much
+more than provide editing capabilities.  It is better to refer to Emacs
+as an "extensible computing environment".  However, that phrase is
+quite a mouthful.  It is easier to refer to Emacs simply as an editor.
+Moreover, everything you do in Emacs--find the Mayan date and phases of
+the moon, simplify polynomials, debug code, manage files, read letters,
+write books--all these activities are kinds of editing in the most
+general sense of the word.)
+
+* Menu:
+
+* Why::
+* On Reading this Text::
+* Who You Are::
+* Lisp History::
+* Note for Novices::
+* Thank You::
+
+
+File: eintr,  Node: Why,  Next: On Reading this Text,  Prev: Preface,  Up: Preface
+
+Why Study Emacs Lisp?
+=====================
+
+Although Emacs Lisp is usually thought of in association only with
+Emacs, it is a full computer programming language.  You can use Emacs
+Lisp as you would any other programming language.
+
+Perhaps you want to understand programming; perhaps you want to extend
+Emacs; or perhaps you want to become a programmer.  This introduction to
+Emacs Lisp is designed to get you started: to guide you in learning the
+fundamentals of programming, and more importantly, to show you how you
+can teach yourself to go further.
+
+
+File: eintr,  Node: On Reading this Text,  Next: Who You Are,  Prev: Why,  Up: Preface
+
+On Reading this Text
+====================
+
+All through this document, you will see little sample programs you can
+run inside of Emacs.  If you read this document in Info inside of GNU
+Emacs, you can run the programs as they appear.  (This is easy to do and
+is explained when the examples are presented.)  Alternatively, you can
+read this introduction as a printed book while sitting beside a computer
+running Emacs.  (This is what I like to do; I like printed books.)  If
+you don't have a running Emacs beside you, you can still read this book,
+but in this case, it is best to treat it as a novel or as a travel guide
+to a country not yet visited: interesting, but not the same as being
+there.
+
+Much of this introduction is dedicated to walk-throughs or guided tours
+of code used in GNU Emacs.  These tours are designed for two purposes:
+first, to give you familiarity with real, working code (code you use
+every day); and, second, to give you familiarity with the way Emacs
+works.  It is interesting to see how a working environment is
+implemented.  Also, I hope that you will pick up the habit of browsing
+through source code.  You can learn from it and mine it for ideas.
+Having GNU Emacs is like having a dragon's cave of treasures.
+
+In addition to learning about Emacs as an editor and Emacs Lisp as a
+programming language, the examples and guided tours will give you an
+opportunity to get acquainted with Emacs as a Lisp programming
+environment.  GNU Emacs supports programming and provides tools that
+you will want to become comfortable using, such as `M-.' (the key which
+invokes the `find-tag' command).  You will also learn about buffers and
+other objects that are part of the environment.  Learning about these
+features of Emacs is like learning new routes around your home town.
+
+Finally, I hope to convey some of the skills for using Emacs to learn
+aspects of programming that you don't know.  You can often use Emacs to
+help you understand what puzzles you or to find out how to do something
+new.  This self-reliance is not only a pleasure, but an advantage.
+
+
+File: eintr,  Node: Who You Are,  Next: Lisp History,  Prev: On Reading this Text,  Up: Preface
+
+For Whom This is Written
+========================
+
+This text is written as an elementary introduction for people who are
+not programmers.  If you are a programmer, you may not be satisfied with
+this primer.  The reason is that you may have become expert at reading
+reference manuals and be put off by the way this text is organized.
+
+An expert programmer who reviewed this text said to me:
+
+     I prefer to learn from reference manuals.  I "dive into" each
+     paragraph, and "come up for air" between paragraphs.
+
+     When I get to the end of a paragraph, I assume that that subject is
+     done, finished, that I know everything I need (with the possible
+     exception of the case when the next paragraph starts talking about
+     it in more detail).  I expect that a well written reference manual
+     will not have a lot of redundancy, and that it will have excellent
+     pointers to the (one) place where the information I want is.
+
+This introduction is not written for this person!
+
+Firstly, I try to say everything at least three times: first, to
+introduce it; second, to show it in context; and third, to show it in a
+different context, or to review it.
+
+Secondly, I hardly ever put all the information about a subject in one
+place, much less in one paragraph.  To my way of thinking, that imposes
+too heavy a burden on the reader.  Instead I try to explain only what
+you need to know at the time.  (Sometimes I include a little extra
+information so you won't be surprised later when the additional
+information is formally introduced.)
+
+When you read this text, you are not expected to learn everything the
+first time.  Frequently, you need only make, as it were, a `nodding
+acquaintance' with some of the items mentioned.  My hope is that I have
+structured the text and given you enough hints that you will be alert to
+what is important, and concentrate on it.
+
+You will need to "dive into" some paragraphs; there is no other way to
+read them.  But I have tried to keep down the number of such
+paragraphs.  This book is intended as an approachable hill, rather than
+as a daunting mountain.
+
+This introduction to `Programming in Emacs Lisp' has a companion
+document, *Note The GNU Emacs Lisp Reference Manual: (elisp)Top.  The
+reference manual has more detail than this introduction.  In the
+reference manual, all the information about one topic is concentrated
+in one place.  You should turn to it if you are like the programmer
+quoted above.  And, of course, after you have read this `Introduction',
+you will find the `Reference Manual' useful when you are writing your
+own programs.
+
+
+File: eintr,  Node: Lisp History,  Next: Note for Novices,  Prev: Who You Are,  Up: Preface
+
+Lisp History
+============
+
+Lisp was first developed in the late 1950s 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 editor commands and integrated environments.
+
+GNU Emacs Lisp is largely inspired by Maclisp, which was written at MIT
+in the 1960s.  It is somewhat inspired by Common Lisp, which became a
+standard in the 1980s.  However, Emacs Lisp is much simpler than Common
+Lisp.  (The standard Emacs distribution contains an optional extensions
+file, `cl.el', that adds many Common Lisp features to Emacs Lisp.)
+
+
+File: eintr,  Node: Note for Novices,  Next: Thank You,  Prev: Lisp History,  Up: Preface
+
+A Note for Novices
+==================
+
+If you don't know GNU Emacs, you can still read this document
+profitably.  However, I recommend you learn Emacs, if only to learn to
+move around your computer screen.  You can teach yourself how to use
+Emacs with the on-line tutorial.  To use it, type `C-h t'.  (This means
+you press and release the <CTRL> key and the `h' at the same time, and
+then press and release `t'.)
+
+Also, I often refer to one of Emacs' standard commands by listing the
+keys which you press to invoke the command and then giving the name of
+the command in parentheses, like this: `M-C-\' (`indent-region').  What
+this means is that the `indent-region' command is customarily invoked
+by typing `M-C-\'.  (You can, if you wish, change the keys that are
+typed to invoke the command; this is called "rebinding".  *Note
+Keymaps: Keymaps.)  The abbreviation `M-C-\' means that you type your
+<META> key, <CTRL> key and <\> key all at the same time.  (On many
+modern keyboards the <META> key is labelled <ALT>.)  Sometimes a
+combination like this is called a keychord, since it is similar to the
+way you play a chord on a piano.  If your keyboard does not have a
+<META> key, the <ESC> key prefix is used in place of it.  In this case,
+`M-C-\' means that you press and release your <ESC> key and then type
+the <CTRL> key and the <\> key at the same time.  But usually `M-C-\'
+means press the <CTRL> key along with the key that is labelled <ALT>
+and, at the same time, press the <\> key.
+
+In addition to typing a lone keychord, you can prefix what you type
+with `C-u', which is called the `universal argument'.  The `C-u'
+keychord passes an argument to the subsequent command.  Thus, to indent
+a region of plain text by 6 spaces, mark the region, and then type
+`C-u 6 M-C-\'.  (If you do not specify a number, Emacs either passes
+the number 4 to the command or otherwise runs the command differently
+than it would otherwise.)  *Note Numeric Arguments: (emacs)Arguments.
+
+If you are reading this in Info using GNU Emacs, you can read through
+this whole document just by pressing the space bar, <SPC>.  (To learn
+about Info, type `C-h i' and then select Info.)
+
+A note on terminology:  when I use the word Lisp alone, I often am
+referring to the various dialects of Lisp in general, but when I speak
+of Emacs Lisp, I am referring to GNU Emacs Lisp in particular.
+
+
+File: eintr,  Node: Thank You,  Prev: Note for Novices,  Up: Preface
+
+Thank You
+=========
+
+My thanks to all who helped me with this book.  My especial thanks to
+Jim Blandy, Noah Friedman, Jim Kingdon, Roland McGrath, Frank Ritter,
+Randy Smith, Richard M. Stallman, and Melissa Weisshaus.  My thanks
+also go to both Philip Johnson and David Stampe for their patient
+encouragement.  My mistakes are my own.
+
+                                                     Robert J. Chassell
+
+
+File: eintr,  Node: List Processing,  Next: Practicing Evaluation,  Prev: Preface,  Up: Top
+
+1 List Processing
+*****************
+
+To the untutored eye, Lisp is a strange programming language.  In Lisp
+code there are parentheses everywhere.  Some people even claim that the
+name stands for `Lots of Isolated Silly Parentheses'.  But the claim is
+unwarranted.  Lisp stands for LISt Processing, and the programming
+language handles _lists_ (and lists of lists) by putting them between
+parentheses.  The parentheses mark the boundaries of the list.
+Sometimes a list is preceded by a single apostrophe or quotation mark,
+`''(1)  Lists are the basis of Lisp.
+
+* Menu:
+
+* Lisp Lists::
+* Run a Program::
+* Making Errors::
+* Names & Definitions::
+* Lisp Interpreter::
+* Evaluation::
+* Variables::
+* Arguments::
+* set & setq::
+* Summary::
+* Error Message Exercises::
+
+---------- Footnotes ----------
+
+(1) The single apostrophe or quotation mark is an abbreviation for the
+function `quote'; you need not think about functions now; functions are
+defined in *Note Generate an Error Message: Making Errors.
+
+
+File: eintr,  Node: Lisp Lists,  Next: Run a Program,  Prev: List Processing,  Up: List Processing
+
+1.1 Lisp Lists
+==============
+
+In Lisp, a list looks like this: `'(rose violet daisy buttercup)'.
+This list is preceded by a single apostrophe.  It could just as well be
+written as follows, which looks more like the kind of list you are
+likely to be familiar with:
+
+     '(rose
+       violet
+       daisy
+       buttercup)
+
+The elements of this list are the names of the four different flowers,
+separated from each other by whitespace and surrounded by parentheses,
+like flowers in a field with a stone wall around them.  
+
+* Menu:
+
+* Numbers Lists::
+* Lisp Atoms::
+* Whitespace in Lists::
+* Typing Lists::
+
+
+File: eintr,  Node: Numbers Lists,  Next: Lisp Atoms,  Prev: Lisp Lists,  Up: Lisp Lists
+
+Numbers, Lists inside of Lists
+------------------------------
+
+Lists can also have numbers in them, as in this list: `(+ 2 2)'.  This
+list has a plus-sign, `+', followed by two `2's, each separated by
+whitespace.
+
+In Lisp, both data and programs are represented the same way; that is,
+they are both lists of words, numbers, or other lists, separated by
+whitespace and surrounded by parentheses.  (Since a program looks like
+data, one program may easily serve as data for another; this is a very
+powerful feature of Lisp.)  (Incidentally, these two parenthetical
+remarks are _not_ Lisp lists, because they contain `;' and `.' as
+punctuation marks.)
+
+Here is another list, this time with a list inside of it:
+
+     '(this list has (a list inside of it))
+
+The components of this list are the words `this', `list', `has', and
+the list `(a list inside of it)'.  The interior list is made up of the
+words `a', `list', `inside', `of', `it'.
+
+
+File: eintr,  Node: Lisp Atoms,  Next: Whitespace in Lists,  Prev: Numbers Lists,  Up: Lisp Lists
+
+1.1.1 Lisp Atoms
+----------------
+
+In Lisp, what we have been calling words are called "atoms".  This term
+comes from the historical meaning of the word atom, which means
+`indivisible'.  As far as Lisp is concerned, the words we have been
+using in the lists cannot be divided into any smaller parts and still
+mean the same thing as part of a program; likewise with numbers and
+single character symbols like `+'.  On the other hand, unlike an
+ancient atom, a list can be split into parts.  (*Note `car' `cdr' &
+`cons' Fundamental Functions: car cdr & cons.)
+
+In a list, atoms are separated from each other by whitespace.  They can
+be right next to a parenthesis.
+
+Technically speaking, a list in Lisp consists of parentheses surrounding
+atoms separated by whitespace or surrounding other lists or surrounding
+both atoms and other lists.  A list can have just one atom in it or
+have nothing in it at all.  A list with nothing in it looks like this:
+`()', and is called the "empty list".  Unlike anything else, an empty
+list is considered both an atom and a list at the same time.
+
+The printed representation of both atoms and lists are called "symbolic
+expressions" or, more concisely, "s-expressions".  The word
+"expression" by itself can refer to either the printed representation,
+or to the atom or list as it is held internally in the computer.
+Often, people use the term "expression" indiscriminately.  (Also, in
+many texts, the word "form" is used as a synonym for expression.)
+
+Incidentally, the atoms that make up our universe were named such when
+they were thought to be indivisible; but it has been found that physical
+atoms are not indivisible.  Parts can split off an atom or it can
+fission into two parts of roughly equal size.  Physical atoms were named
+prematurely, before their truer nature was found.  In Lisp, certain
+kinds of atom, such as an array, can be separated into parts; but the
+mechanism for doing this is different from the mechanism for splitting a
+list.  As far as list operations are concerned, the atoms of a list are
+unsplittable.
+
+As in English, the meanings of the component letters of a Lisp atom are
+different from the meaning the letters make as a word.  For example,
+the word for the South American sloth, the `ai', is completely
+different from the two words, `a', and `i'.
+
+There are many kinds of atom in nature but only a few in Lisp: for
+example, "numbers", such as 37, 511, or 1729, and "symbols", such as
+`+', `foo', or `forward-line'.  The words we have listed in the
+examples above are all symbols.  In everyday Lisp conversation, the
+word "atom" is not often used, because programmers usually try to be
+more specific about what kind of atom they are dealing with.  Lisp
+programming is mostly about symbols (and sometimes numbers) within
+lists.  (Incidentally, the preceding three word parenthetical remark is
+a proper list in Lisp, since it consists of atoms, which in this case
+are symbols, separated by whitespace and enclosed by parentheses,
+without any non-Lisp punctuation.)
+
+In addition, text between double quotation marks--even sentences or
+paragraphs--is an atom.  Here is an example: 
+
+     '(this list includes "text between quotation marks.")
+
+In Lisp, all of the quoted text including the punctuation mark and the
+blank spaces is a single atom.  This kind of atom is called a "string"
+(for `string of characters') and is the sort of thing that is used for
+messages that a computer can print for a human to read.  Strings are a
+different kind of atom than numbers or symbols and are used differently.
+
+
+File: eintr,  Node: Whitespace in Lists,  Next: Typing Lists,  Prev: Lisp Atoms,  Up: Lisp Lists
+
+1.1.2 Whitespace in Lists
+-------------------------
+
+The amount of whitespace in a list does not matter.  From the point of
+view of the Lisp language,
+
+     '(this list
+        looks like this)
+
+is exactly the same as this:
+
+     '(this list looks like this)
+
+Both examples show what to Lisp is the same list, the list made up of
+the symbols `this', `list', `looks', `like', and `this' in that order.
+
+Extra whitespace and newlines are designed to make a list more readable
+by humans.  When Lisp reads the expression, it gets rid of all the extra
+whitespace (but it needs to have at least one space between atoms in
+order to tell them apart.)
+
+Odd as it seems, the examples we have seen cover almost all of what Lisp
+lists look like!  Every other list in Lisp looks more or less like one
+of these examples, except that the list may be longer and more complex.
+In brief, a list is between parentheses, a string is between quotation
+marks, a symbol looks like a word, and a number looks like a number.
+(For certain situations, square brackets, dots and a few other special
+characters may be used; however, we will go quite far without them.)
+
+
+File: eintr,  Node: Typing Lists,  Prev: Whitespace in Lists,  Up: Lisp Lists
+
+1.1.3 GNU Emacs Helps You Type Lists
+------------------------------------
+
+When you type a Lisp expression in GNU Emacs using either Lisp
+Interaction mode or Emacs Lisp mode, you have available to you several
+commands to format the Lisp expression so it is easy to read.  For
+example, pressing the <TAB> key automatically indents the line the
+cursor is on by the right amount.  A command to properly indent the
+code in a region is customarily bound to `M-C-\'.  Indentation is
+designed so that you can see which elements of a list belong to which
+list--elements of a sub-list are indented more than the elements of the
+enclosing list.
+
+In addition, when you type a closing parenthesis, Emacs momentarily
+jumps the cursor back to the matching opening parenthesis, so you can
+see which one it is.  This is very useful, since every list you type in
+Lisp must have its closing parenthesis match its opening parenthesis.
+(*Note Major Modes: (emacs)Major Modes, for more information about
+Emacs' modes.)
+
+
+File: eintr,  Node: Run a Program,  Next: Making Errors,  Prev: Lisp Lists,  Up: List Processing
+
+1.2 Run a Program
+=================
+
+A list in Lisp--any list--is a program ready to run.  If you run it
+(for which the Lisp jargon is "evaluate"), the computer will do one of
+three things: do nothing except return to you the list itself; send you
+an error message; or, treat the first symbol in the list as a command
+to do something.  (Usually, of course, it is the last of these three
+things that you really want!)
+
+The single apostrophe, `'', that I put in front of some of the example
+lists in preceding sections is called a "quote"; when it precedes a
+list, it tells Lisp to do nothing with the list, other than take it as
+it is written.  But if there is no quote preceding a list, the first
+item of the list is special: it is a command for the computer to obey.
+(In Lisp, these commands are called _functions_.)  The list `(+ 2 2)'
+shown above did not have a quote in front of it, so Lisp understands
+that the `+' is an instruction to do something with the rest of the
+list: add the numbers that follow.
+
+If you are reading this inside of GNU Emacs in Info, here is how you can
+evaluate such a list:  place your cursor immediately after the right
+hand parenthesis of the following list and then type `C-x C-e':
+
+     (+ 2 2)
+
+You will see the number `4' appear in the echo area.  (In the jargon,
+what you have just done is "evaluate the list."  The echo area is the
+line at the bottom of the screen that displays or "echoes" text.)  Now
+try the same thing with a quoted list:  place the cursor right after
+the following list and type `C-x C-e':
+
+     '(this is a quoted list)
+
+You will see `(this is a quoted list)' appear in the echo area.
+
+In both cases, what you are doing is giving a command to the program
+inside of GNU Emacs called the "Lisp interpreter"--giving the
+interpreter a command to evaluate the expression.  The name of the Lisp
+interpreter comes from the word for the task done by a human who comes
+up with the meaning of an expression--who "interprets" it.
+
+You can also evaluate an atom that is not part of a list--one that is
+not surrounded by parentheses; again, the Lisp interpreter translates
+from the humanly readable expression to the language of the computer.
+But before discussing this (*note Variables::), we will discuss what the
+Lisp interpreter does when you make an error.
+
+
+File: eintr,  Node: Making Errors,  Next: Names & Definitions,  Prev: Run a Program,  Up: List Processing
+
+1.3 Generate an Error Message
+=============================
+
+Partly so you won't worry if you do it accidentally, we will now give a
+command to the Lisp interpreter that generates an error message.  This
+is a harmless activity; and indeed, we will often try to generate error
+messages intentionally.  Once you understand the jargon, error messages
+can be informative.  Instead of being called "error" messages, they
+should be called "help" messages.  They are like signposts to a
+traveller in a strange country; deciphering them can be hard, but once
+understood, they can point the way.
+
+The error message is generated by a built-in GNU Emacs debugger.  We
+will `enter the debugger'.  You get out of the debugger by typing `q'.
+
+What we will do is evaluate a list that is not quoted and does not have
+a meaningful command as its first element.  Here is a list almost
+exactly the same as the one we just used, but without the single-quote
+in front of it.  Position the cursor right after it and type `C-x C-e':
+
+     (this is an unquoted list)
+
+What you see depends on which version of Emacs you are running.  GNU
+Emacs version 22 provides more information than version 20 and before.
+First, the more recent result of generating an error; then the earlier,
+version 20 result.
+
+In GNU Emacs version 22, a `*Backtrace*' window will open up and you
+will see the following in it:
+
+     ---------- Buffer: *Backtrace* ----------
+     Debugger entered--Lisp error: (void-function this)
+       (this is an unquoted list)
+       eval((this is an unquoted list))
+       eval-last-sexp-1(nil)
+       eval-last-sexp(nil)
+       call-interactively(eval-last-sexp)
+     ---------- Buffer: *Backtrace* ----------
+
+Your cursor will be in this window (you may have to wait a few seconds
+before it becomes visible).  To quit the debugger and make the debugger
+window go away, type:
+
+     q
+
+Please type `q' right now, so you become confident that you can get out
+of the debugger.  Then, type `C-x C-e' again to re-enter it.
+
+Based on what we already know, we can almost read this error message.
+
+You read the `*Backtrace*' buffer from the bottom up; it tells you what
+Emacs did.  When you typed `C-x C-e', you made an interactive call to
+the command `eval-last-sexp'.  `eval' is an abbreviation for `evaluate'
+and `sexp' is an abbreviation for `symbolic expression'.  The command
+means `evaluate last symbolic expression', which is the expression just
+before your cursor.
+
+Each line above tells you what the Lisp interpreter evaluated next.
+The most recent action is at the top.  The buffer is called the
+`*Backtrace*' buffer because it enables you to track Emacs backwards.
+
+At the top of the `*Backtrace*' buffer, you see the line:
+
+     Debugger entered--Lisp error: (void-function this)
+
+The Lisp interpreter tried to evaluate the first atom of the list, the
+word `this'.  It is this action that generated the error message
+`void-function this'.
+
+The message contains the words `void-function' and `this'.
+
+The word `function' was mentioned once before.  It is a very important
+word.  For our purposes, we can define it by saying that a "function"
+is a set of instructions to the computer that tell the computer to do
+something.
+
+Now we can begin to understand the error message: `void-function this'.
+The function (that is, the word `this') does not have a definition of
+any set of instructions for the computer to carry out.
+
+The slightly odd word, `void-function', is designed to cover the way
+Emacs Lisp is implemented, which is that when a symbol does not have a
+function definition attached to it, the place that should contain the
+instructions is `void'.
+
+On the other hand, since we were able to add 2 plus 2 successfully, by
+evaluating `(+ 2 2)', we can infer that the symbol `+' must have a set
+of instructions for the computer to obey and those instructions must be
+to add the numbers that follow the `+'.
+
+In GNU Emacs version 20, and in earlier versions, you will see only one
+line of error message; it will appear in the echo area and look like
+this:
+
+     Symbol's function definition is void: this
+
+(Also, your terminal may beep at you--some do, some don't; and others
+blink.  This is just a device to get your attention.)  The message goes
+away as soon as you type another key, even just to move the cursor.
+
+We know the meaning of the word `Symbol'.  It refers to the first atom
+of the list, the word `this'.  The word `function' refers to the
+instructions that tell the computer what to do.  (Technically, the
+symbol tells the computer where to find the instructions, but this is a
+complication we can ignore for the moment.)
+
+The error message can be understood: `Symbol's function definition is
+void: this'.  The symbol (that is, the word `this') lacks instructions
+for the computer to carry out.
+
+
+File: eintr,  Node: Names & Definitions,  Next: Lisp Interpreter,  Prev: Making Errors,  Up: List Processing
+
+1.4 Symbol Names and Function Definitions
+=========================================
+
+We can articulate another characteristic of Lisp based on what we have
+discussed so far--an important characteristic: a symbol, like `+', is
+not itself the set of instructions for the computer to carry out.
+Instead, the symbol is used, perhaps temporarily, as a way of locating
+the definition or set of instructions.  What we see is the name through
+which the instructions can be found.  Names of people work the same
+way.  I can be referred to as `Bob'; however, I am not the letters `B',
+`o', `b' but am, or was, the consciousness consistently associated with
+a particular life-form.  The name is not me, but it can be used to
+refer to me.
+
+In Lisp, one set of instructions can be attached to several names.  For
+example, the computer instructions for adding numbers can be linked to
+the symbol `plus' as well as to the symbol `+' (and are in some
+dialects of Lisp).  Among humans, I can be referred to as `Robert' as
+well as `Bob' and by other words as well.
+
+On the other hand, a symbol can have only one function definition
+attached to it at a time.  Otherwise, the computer would be confused as
+to which definition to use.  If this were the case among people, only
+one person in the world could be named `Bob'.  However, the function
+definition to which the name refers can be changed readily.  (*Note
+Install a Function Definition: Install.)
+
+Since Emacs Lisp is large, it is customary to name symbols in a way
+that identifies the part of Emacs to which the function belongs.  Thus,
+all the names for functions that deal with Texinfo start with
+`texinfo-' and those for functions that deal with reading mail start
+with `rmail-'.
+
+
+File: eintr,  Node: Lisp Interpreter,  Next: Evaluation,  Prev: Names & Definitions,  Up: List Processing
+
+1.5 The Lisp Interpreter
+========================
+
+Based on what we have seen, we can now start to figure out what the
+Lisp interpreter does when we command it to evaluate a list.  First, it
+looks to see whether there is a quote before the list; if there is, the
+interpreter just gives us the list.  On the other hand, if there is no
+quote, the interpreter looks at the first element in the list and sees
+whether it has a function definition.  If it does, the interpreter
+carries out the instructions in the function definition.  Otherwise,
+the interpreter prints an error message.
+
+This is how Lisp works.  Simple.  There are added complications which we
+will get to in a minute, but these are the fundamentals.  Of course, to
+write Lisp programs, you need to know how to write function definitions
+and attach them to names, and how to do this without confusing either
+yourself or the computer.
+
+* Menu:
+
+* Complications::
+* Byte Compiling::
+
+
+File: eintr,  Node: Complications,  Next: Byte Compiling,  Prev: Lisp Interpreter,  Up: Lisp Interpreter
+
+Complications
+-------------
+
+Now, for the first complication.  In addition to lists, the Lisp
+interpreter can evaluate a symbol that is not quoted and does not have
+parentheses around it.  The Lisp interpreter will attempt to determine
+the symbol's value as a "variable".  This situation is described in the
+section on variables.  (*Note Variables::.)
+
+The second complication occurs because some functions are unusual and do
+not work in the usual manner.  Those that don't are called "special
+forms".  They are used for special jobs, like defining a function, and
+there are not many of them.  In the next few chapters, you will be
+introduced to several of the more important special forms.
+
+The third and final complication is this: if the function that the Lisp
+interpreter is looking at is not a special form, and if it is part of a
+list, the Lisp interpreter looks to see whether the list has a list
+inside of it.  If there is an inner list, the Lisp interpreter first
+figures out what it should do with the inside list, and then it works on
+the outside list.  If there is yet another list embedded inside the
+inner list, it works on that one first, and so on.  It always works on
+the innermost list first.  The interpreter works on the innermost list
+first, to evaluate the result of that list.  The result may be used by
+the enclosing expression.
+
+Otherwise, the interpreter works left to right, from one expression to
+the next.
+
+
+File: eintr,  Node: Byte Compiling,  Prev: Complications,  Up: Lisp Interpreter
+
+1.5.1 Byte Compiling
+--------------------
+
+One other aspect of interpreting: the Lisp interpreter is able to
+interpret two kinds of entity: humanly readable code, on which we will
+focus exclusively, and specially processed code, called "byte compiled"
+code, which is not humanly readable.  Byte compiled code runs faster
+than humanly readable code.
+
+You can transform humanly readable code into byte compiled code by
+running one of the compile commands such as `byte-compile-file'.  Byte
+compiled code is usually stored in a file that ends with a `.elc'
+extension rather than a `.el' extension.  You will see both kinds of
+file in the `emacs/lisp' directory; the files to read are those with
+`.el' extensions.
+
+As a practical matter, for most things you might do to customize or
+extend Emacs, you do not need to byte compile; and I will not discuss
+the topic here.  *Note Byte Compilation: (elisp)Byte Compilation, for a
+full description of byte compilation.
+
+
+File: eintr,  Node: Evaluation,  Next: Variables,  Prev: Lisp Interpreter,  Up: List Processing
+
+1.6 Evaluation
+==============
+
+When the Lisp interpreter works on an expression, the term for the
+activity is called "evaluation".  We say that the interpreter
+`evaluates the expression'.  I've used this term several times before.
+The word comes from its use in everyday language, `to ascertain the
+value or amount of; to appraise', according to `Webster's New
+Collegiate Dictionary'.
+
+After evaluating an expression, the Lisp interpreter will most likely
+"return" the value that the computer produces by carrying out the
+instructions it found in the function definition, or perhaps it will
+give up on that function and produce an error message.  (The interpreter
+may also find itself tossed, so to speak, to a different function or it
+may attempt to repeat continually what it is doing for ever and ever in
+what is called an `infinite loop'.  These actions are less common; and
+we can ignore them.)  Most frequently, the interpreter returns a value.
+
+At the same time the interpreter returns a value, it may do something
+else as well, such as move a cursor or copy a file; this other kind of
+action is called a "side effect".  Actions that we humans think are
+important, such as printing results, are often "side effects" to the
+Lisp interpreter.  The jargon can sound peculiar, but it turns out that
+it is fairly easy to learn to use side effects.
+
+In summary, evaluating a symbolic expression most commonly causes the
+Lisp interpreter to return a value and perhaps carry out a side effect;
+or else produce an error.
+
+* Menu:
+
+* Evaluating Inner Lists::
+
+
+File: eintr,  Node: Evaluating Inner Lists,  Prev: Evaluation,  Up: Evaluation
+
+1.6.1 Evaluating Inner Lists
+----------------------------
+
+If evaluation applies to a list that is inside another list, the outer
+list may use the value returned by the first evaluation as information
+when the outer list is evaluated.  This explains why inner expressions
+are evaluated first: the values they return are used by the outer
+expressions.
+
+We can investigate this process by evaluating another addition example.
+Place your cursor after the following expression and type `C-x C-e':
+
+     (+ 2 (+ 3 3))
+
+The number 8 will appear in the echo area.
+
+What happens is that the Lisp interpreter first evaluates the inner
+expression, `(+ 3 3)', for which the value 6 is returned; then it
+evaluates the outer expression as if it were written `(+ 2 6)', which
+returns the value 8.  Since there are no more enclosing expressions to
+evaluate, the interpreter prints that value in the echo area.
+
+Now it is easy to understand the name of the command invoked by the
+keystrokes `C-x C-e': the name is `eval-last-sexp'.  The letters `sexp'
+are an abbreviation for `symbolic expression', and `eval' is an
+abbreviation for `evaluate'.  The command means `evaluate last symbolic
+expression'.
+
+As an experiment, you can try evaluating the expression by putting the
+cursor at the beginning of the next line immediately following the
+expression, or inside the expression.
+
+Here is another copy of the expression:
+
+     (+ 2 (+ 3 3))
+
+If you place the cursor at the beginning of the blank line that
+immediately follows the expression and type `C-x C-e', you will still
+get the value 8 printed in the echo area.  Now try putting the cursor
+inside the expression.  If you put it right after the next to last
+parenthesis (so it appears to sit on top of the last parenthesis), you
+will get a 6 printed in the echo area!  This is because the command
+evaluates the expression `(+ 3 3)'.
+
+Now put the cursor immediately after a number.  Type `C-x C-e' and you
+will get the number itself.  In Lisp, if you evaluate a number, you get
+the number itself--this is how numbers differ from symbols.  If you
+evaluate a list starting with a symbol like `+', you will get a value
+returned that is the result of the computer carrying out the
+instructions in the function definition attached to that name.  If a
+symbol by itself is evaluated, something different happens, as we will
+see in the next section.
+
+
+File: eintr,  Node: Variables,  Next: Arguments,  Prev: Evaluation,  Up: List Processing
+
+1.7 Variables
+=============
+
+In Emacs Lisp, a symbol can have a value attached to it just as it can
+have a function definition attached to it.  The two are different.  The
+function definition is a set of instructions that a computer will obey.
+A value, on the other hand, is something, such as number or a name,
+that can vary (which is why such a symbol is called a variable).  The
+value of a symbol can be any expression in Lisp, such as a symbol,
+number, list, or string.  A symbol that has a value is often called a
+"variable".
+
+A symbol can have both a function definition and a value attached to it
+at the same time.  Or it can have just one or the other.  The two are
+separate.  This is somewhat similar to the way the name Cambridge can
+refer to the city in Massachusetts and have some information attached
+to the name as well, such as "great programming center".
+
+Another way to think about this is to imagine a symbol as being a chest
+of drawers.  The function definition is put in one drawer, the value in
+another, and so on.  What is put in the drawer holding the value can be
+changed without affecting the contents of the drawer holding the
+function definition, and vice-verse.
+
+* Menu:
+
+* fill-column Example::
+* Void Function::
+* Void Variable::
+
+
+File: eintr,  Node: fill-column Example,  Next: Void Function,  Prev: Variables,  Up: Variables
+
+`fill-column', an Example Variable
+----------------------------------
+
+The variable `fill-column' illustrates a symbol with a value attached
+to it: in every GNU Emacs buffer, this symbol is set to some value,
+usually 72 or 70, but sometimes to some other value.  To find the value
+of this symbol, evaluate it by itself.  If you are reading this in Info
+inside of GNU Emacs, you can do this by putting the cursor after the
+symbol and typing `C-x C-e':
+
+     fill-column
+
+After I typed `C-x C-e', Emacs printed the number 72 in my echo area.
+This is the value for which `fill-column' is set for me as I write
+this.  It may be different for you in your Info buffer.  Notice that
+the value returned as a variable is printed in exactly the same way as
+the value returned by a function carrying out its instructions.  From
+the point of view of the Lisp interpreter, a value returned is a value
+returned.  What kind of expression it came from ceases to matter once
+the value is known.
+
+A symbol can have any value attached to it or, to use the jargon, we can
+"bind" the variable to a value: to a number, such as 72; to a string,
+`"such as this"'; to a list, such as `(spruce pine oak)'; we can even
+bind a variable to a function definition.
+
+A symbol can be bound to a value in several ways.  *Note Setting the
+Value of a Variable: set & setq, for information about one way to do
+this.
+
+
+File: eintr,  Node: Void Function,  Next: Void Variable,  Prev: fill-column Example,  Up: Variables
+
+1.7.1 Error Message for a Symbol Without a Function
+---------------------------------------------------
+
+When we evaluated `fill-column' to find its value as a variable, we did
+not place parentheses around the word.  This is because we did not
+intend to use it as a function name.
+
+If `fill-column' were the first or only element of a list, the Lisp
+interpreter would attempt to find the function definition attached to
+it.  But `fill-column' has no function definition.  Try evaluating this:
+
+     (fill-column)
+
+In GNU Emacs version 22, you will create a `*Backtrace*' buffer that
+says:
+
+     ---------- Buffer: *Backtrace* ----------
+     Debugger entered--Lisp error: (void-function fill-column)
+       (fill-column)
+       eval((fill-column))
+       eval-last-sexp-1(nil)
+       eval-last-sexp(nil)
+       call-interactively(eval-last-sexp)
+     ---------- Buffer: *Backtrace* ----------
+
+(Remember, to quit the debugger and make the debugger window go away,
+type `q' in the `*Backtrace*' buffer.)
+
+
+File: eintr,  Node: Void Variable,  Prev: Void Function,  Up: Variables
+
+1.7.2 Error Message for a Symbol Without a Value
+------------------------------------------------
+
+If you attempt to evaluate a symbol that does not have a value bound to
+it, you will receive an error message.  You can see this by
+experimenting with our 2 plus 2 addition.  In the following expression,
+put your cursor right after the `+', before the first number 2, type
+`C-x C-e':
+
+     (+ 2 2)
+
+In GNU Emacs 22, you will create a `*Backtrace*' buffer that says:
+
+     ---------- Buffer: *Backtrace* ----------
+     Debugger entered--Lisp error: (void-variable +)
+       eval(+)
+       eval-last-sexp-1(nil)
+       eval-last-sexp(nil)
+       call-interactively(eval-last-sexp)
+     ---------- Buffer: *Backtrace* ----------
+
+(As with the other times we entered the debugger, you can quit by
+typing `q' in the `*Backtrace*' buffer.)
+
+This backtrace is different from the very first error message we saw,
+which said, `Debugger entered--Lisp error: (void-function this)'.  In
+this case, the function does not have a value as a variable; while in
+the other error message, the function (the word `this') did not have a
+definition.
+
+In this experiment with the `+', what we did was cause the Lisp
+interpreter to evaluate the `+' and look for the value of the variable
+instead of the function definition.  We did this by placing the cursor
+right after the symbol rather than after the parenthesis of the
+enclosing list as we did before.  As a consequence, the Lisp interpreter
+evaluated the preceding s-expression, which in this case was the `+' by
+itself.
+
+Since `+' does not have a value bound to it, just the function
+definition, the error message reported that the symbol's value as a
+variable was void.
+
+
+File: eintr,  Node: Arguments,  Next: set & setq,  Prev: Variables,  Up: List Processing
+
+1.8 Arguments
+=============
+
+To see how information is passed to functions, let's look again at our
+old standby, the addition of two plus two.  In Lisp, this is written as
+follows:
+
+     (+ 2 2)
+
+If you evaluate this expression, the number 4 will appear in your echo
+area.  What the Lisp interpreter does is add the numbers that follow
+the `+'.
+
+The numbers added by `+' are called the "arguments" of the function
+`+'.  These numbers are the information that is given to or "passed" to
+the function.
+
+The word `argument' comes from the way it is used in mathematics and
+does not refer to a disputation between two people; instead it refers to
+the information presented to the function, in this case, to the `+'.
+In Lisp, the arguments to a function are the atoms or lists that follow
+the function.  The values returned by the evaluation of these atoms or
+lists are passed to the function.  Different functions require
+different numbers of arguments; some functions require none at all.(1)
+
+* Menu:
+
+* Data types::
+* Args as Variable or List::
+* Variable Number of Arguments::
+* Wrong Type of Argument::
+* message::
+
+---------- Footnotes ----------
+
+(1) It is curious to track the path by which the word `argument' came
+to have two different meanings, one in mathematics and the other in
+everyday English.  According to the `Oxford English Dictionary', the
+word derives from the Latin for `to make clear, prove'; thus it came to
+mean, by one thread of derivation, `the evidence offered as proof',
+which is to say, `the information offered', which led to its meaning in
+Lisp.  But in the other thread of derivation, it came to mean `to
+assert in a manner against which others may make counter assertions',
+which led to the meaning of the word as a disputation.  (Note here that
+the English word has two different definitions attached to it at the
+same time.  By contrast, in Emacs Lisp, a symbol cannot have two
+different function definitions at the same time.)
+
+
+File: eintr,  Node: Data types,  Next: Args as Variable or List,  Prev: Arguments,  Up: Arguments
+
+1.8.1 Arguments' Data Types
+---------------------------
+
+The type of data that should be passed to a function depends on what
+kind of information it uses.  The arguments to a function such as `+'
+must have values that are numbers, since `+' adds numbers.  Other
+functions use different kinds of data for their arguments.
+
+For example, the `concat' function links together or unites two or more
+strings of text to produce a string.  The arguments are strings.
+Concatenating the two character strings `abc', `def' produces the
+single string `abcdef'.  This can be seen by evaluating the following:
+
+     (concat "abc" "def")
+
+The value produced by evaluating this expression is `"abcdef"'.
+
+A function such as `substring' uses both a string and numbers as
+arguments.  The function returns a part of the string, a substring of
+the first argument.  This function takes three arguments.  Its first
+argument is the string of characters, the second and third arguments are
+numbers that indicate the beginning and end of the substring.  The
+numbers are a count of the number of characters (including spaces and
+punctuations) from the beginning of the string.
+
+For example, if you evaluate the following:
+
+     (substring "The quick brown fox jumped." 16 19)
+
+you will see `"fox"' appear in the echo area.  The arguments are the
+string and the two numbers.
+
+Note that the string passed to `substring' is a single atom even though
+it is made up of several words separated by spaces.  Lisp counts
+everything between the two quotation marks as part of the string,
+including the spaces.  You can think of the `substring' function as a
+kind of `atom smasher' since it takes an otherwise indivisible atom and
+extracts a part.  However, `substring' is only able to extract a
+substring from an argument that is a string, not from another type of
+atom such as a number or symbol.
+
+
+File: eintr,  Node: Args as Variable or List,  Next: Variable Number of Arguments,  Prev: Data types,  Up: Arguments
+
+1.8.2 An Argument as the Value of a Variable or List
+----------------------------------------------------
+
+An argument can be a symbol that returns a value when it is evaluated.
+For example, when the symbol `fill-column' by itself is evaluated, it
+returns a number.  This number can be used in an addition.
+
+Position the cursor after the following expression and type `C-x C-e':
+
+     (+ 2 fill-column)
+
+The value will be a number two more than what you get by evaluating
+`fill-column' alone.  For me, this is 74, because my value of
+`fill-column' is 72.
+
+As we have just seen, an argument can be a symbol that returns a value
+when evaluated.  In addition, an argument can be a list that returns a
+value when it is evaluated.  For example, in the following expression,
+the arguments to the function `concat' are the strings `"The "' and
+`" red foxes."' and the list `(number-to-string (+ 2 fill-column))'.
+
+     (concat "The " (number-to-string (+ 2 fill-column)) " red foxes.")
+
+If you evaluate this expression--and if, as with my Emacs,
+`fill-column' evaluates to 72--`"The 74 red foxes."' will appear in the
+echo area.  (Note that you must put spaces after the word `The' and
+before the word `red' so they will appear in the final string.  The
+function `number-to-string' converts the integer that the addition
+function returns to a string.  `number-to-string' is also known as
+`int-to-string'.)
+
+
+File: eintr,  Node: Variable Number of Arguments,  Next: Wrong Type of Argument,  Prev: Args as Variable or List,  Up: Arguments
+
+1.8.3 Variable Number of Arguments
+----------------------------------
+
+Some functions, such as `concat', `+' or `*', take any number of
+arguments.  (The `*' is the symbol for multiplication.)  This can be
+seen by evaluating each of the following expressions in the usual way.
+What you will see in the echo area is printed in this text after `=>',
+which you may read as `evaluates to'.
+
+In the first set, the functions have no arguments:
+
+     (+)       => 0
+
+     (*)       => 1
+
+In this set, the functions have one argument each:
+
+     (+ 3)     => 3
+
+     (* 3)     => 3
+
+In this set, the functions have three arguments each:
+
+     (+ 3 4 5) => 12
+
+     (* 3 4 5) => 60
+
+
+File: eintr,  Node: Wrong Type of Argument,  Next: message,  Prev: Variable Number of Arguments,  Up: Arguments
+
+1.8.4 Using the Wrong Type Object as an Argument
+------------------------------------------------
+
+When a function is passed an argument of the wrong type, the Lisp
+interpreter produces an error message.  For example, the `+' function
+expects the values of its arguments to be numbers.  As an experiment we
+can pass it the quoted symbol `hello' instead of a number.  Position
+the cursor after the following expression and type `C-x C-e':
+
+     (+ 2 'hello)
+
+When you do this you will generate an error message.  What has happened
+is that `+' has tried to add the 2 to the value returned by `'hello',
+but the value returned by `'hello' is the symbol `hello', not a number.
+Only numbers can be added.  So `+' could not carry out its addition.
+
+In GNU Emacs version 22, you will create and enter a `*Backtrace*'
+buffer that says:
+
+
+     ---------- Buffer: *Backtrace* ----------
+     Debugger entered--Lisp error:
+              (wrong-type-argument number-or-marker-p hello)
+       +(2 hello)
+       eval((+ 2 (quote hello)))
+       eval-last-sexp-1(nil)
+       eval-last-sexp(nil)
+       call-interactively(eval-last-sexp)
+     ---------- Buffer: *Backtrace* ----------
+
+As usual, the error message tries to be helpful and makes sense after
+you learn how to read it.(1)
+
+The first part of the error message is straightforward; it says `wrong
+type argument'.  Next comes the mysterious jargon word
+`number-or-marker-p'.  This word is trying to tell you what kind of
+argument the `+' expected.
+
+The symbol `number-or-marker-p' says that the Lisp interpreter is
+trying to determine whether the information presented it (the value of
+the argument) is a number or a marker (a special object representing a
+buffer position).  What it does is test to see whether the `+' is being
+given numbers to add.  It also tests to see whether the argument is
+something called a marker, which is a specific feature of Emacs Lisp.
+(In Emacs, locations in a buffer are recorded as markers.  When the
+mark is set with the `C-@' or `C-<SPC>' command, its position is kept
+as a marker.  The mark can be considered a number--the number of
+characters the location is from the beginning of the buffer.)  In Emacs
+Lisp, `+' can be used to add the numeric value of marker positions as
+numbers.
+
+The `p' of `number-or-marker-p' is the embodiment of a practice started
+in the early days of Lisp programming.  The `p' stands for `predicate'.
+In the jargon used by the early Lisp researchers, a predicate refers
+to a function to determine whether some property is true or false.  So
+the `p' tells us that `number-or-marker-p' is the name of a function
+that determines whether it is true or false that the argument supplied
+is a number or a marker.  Other Lisp symbols that end in `p' include
+`zerop', a function that tests whether its argument has the value of
+zero, and `listp', a function that tests whether its argument is a list.
+
+Finally, the last part of the error message is the symbol `hello'.
+This is the value of the argument that was passed to `+'.  If the
+addition had been passed the correct type of object, the value passed
+would have been a number, such as 37, rather than a symbol like
+`hello'.  But then you would not have got the error message.
+
+---------- Footnotes ----------
+
+(1) `(quote hello)' is an expansion of the abbreviation `'hello'.
+
+
+File: eintr,  Node: message,  Prev: Wrong Type of Argument,  Up: Arguments
+
+1.8.5 The `message' Function
+----------------------------
+
+Like `+', the `message' function takes a variable number of arguments.
+It is used to send messages to the user and is so useful that we will
+describe it here.
+
+A message is printed in the echo area.  For example, you can print a
+message in your echo area by evaluating the following list:
+
+     (message "This message appears in the echo area!")
+
+The whole string between double quotation marks is a single argument
+and is printed in toto.  (Note that in this example, the message itself
+will appear in the echo area within double quotes; that is because you
+see the value returned by the `message' function.  In most uses of
+`message' in programs that you write, the text will be printed in the
+echo area as a side-effect, without the quotes.  *Note
+`multiply-by-seven' in detail: multiply-by-seven in detail, for an
+example of this.)
+
+However, if there is a `%s' in the quoted string of characters, the
+`message' function does not print the `%s' as such, but looks to the
+argument that follows the string.  It evaluates the second argument and
+prints the value at the location in the string where the `%s' is.
+
+You can see this by positioning the cursor after the following
+expression and typing `C-x C-e':
+
+     (message "The name of this buffer is: %s." (buffer-name))
+
+In Info, `"The name of this buffer is: *info*."' will appear in the
+echo area.  The function `buffer-name' returns the name of the buffer
+as a string, which the `message' function inserts in place of `%s'.
+
+To print a value as an integer, use `%d' in the same way as `%s'.  For
+example, to print a message in the echo area that states the value of
+the `fill-column', evaluate the following:
+
+     (message "The value of fill-column is %d." fill-column)
+
+On my system, when I evaluate this list, `"The value of fill-column is
+72."' appears in my echo area(1).
+
+If there is more than one `%s' in the quoted string, the value of the
+first argument following the quoted string is printed at the location
+of the first `%s' and the value of the second argument is printed at
+the location of the second `%s', and so on.
+
+For example, if you evaluate the following,
+
+     (message "There are %d %s in the office!"
+              (- fill-column 14) "pink elephants")
+
+a rather whimsical message will appear in your echo area.  On my system
+it says, `"There are 58 pink elephants in the office!"'.
+
+The expression `(- fill-column 14)' is evaluated and the resulting
+number is inserted in place of the `%d'; and the string in double
+quotes, `"pink elephants"', is treated as a single argument and
+inserted in place of the `%s'.  (That is to say, a string between
+double quotes evaluates to itself, like a number.)
+
+Finally, here is a somewhat complex example that not only illustrates
+the computation of a number, but also shows how you can use an
+expression within an expression to generate the text that is substituted
+for `%s':
+
+     (message "He saw %d %s"
+              (- fill-column 32)
+              (concat "red "
+                      (substring
+                       "The quick brown foxes jumped." 16 21)
+                      " leaping."))
+
+In this example, `message' has three arguments: the string, `"He saw %d
+%s"', the expression, `(- fill-column 32)', and the expression
+beginning with the function `concat'.  The value resulting from the
+evaluation of `(- fill-column 32)' is inserted in place of the `%d';
+and the value returned by the expression beginning with `concat' is
+inserted in place of the `%s'.
+
+When your fill column is 70 and you evaluate the expression, the
+message `"He saw 38 red foxes leaping."' appears in your echo area.
+
+---------- Footnotes ----------
+
+(1) Actually, you can use `%s' to print a number.  It is non-specific.
+`%d' prints only the part of a number left of a decimal point, and not
+anything that is not a number.
+
+
+File: eintr,  Node: set & setq,  Next: Summary,  Prev: Arguments,  Up: List Processing
+
+1.9 Setting the Value of a Variable
+===================================
+
+There are several ways by which a variable can be given a value.  One of
+the ways is to use either the function `set' or the function `setq'.
+Another way is to use `let' (*note let::).  (The jargon for this
+process is to "bind" a variable to a value.)
+
+The following sections not only describe how `set' and `setq' work but
+also illustrate how arguments are passed.
+
+* Menu:
+
+* Using set::
+* Using setq::
+* Counting::
+
+
+File: eintr,  Node: Using set,  Next: Using setq,  Prev: set & setq,  Up: set & setq
+
+1.9.1 Using `set'
+-----------------
+
+To set the value of the symbol `flowers' to the list `'(rose violet
+daisy buttercup)', evaluate the following expression by positioning the
+cursor after the expression and typing `C-x C-e'.
+
+     (set 'flowers '(rose violet daisy buttercup))
+
+The list `(rose violet daisy buttercup)' will appear in the echo area.
+This is what is _returned_ by the `set' function.  As a side effect,
+the symbol `flowers' is bound to the list; that is, the symbol
+`flowers', which can be viewed as a variable, is given the list as its
+value.  (This process, by the way, illustrates how a side effect to the
+Lisp interpreter, setting the value, can be the primary effect that we
+humans are interested in.  This is because every Lisp function must
+return a value if it does not get an error, but it will only have a
+side effect if it is designed to have one.)
+
+After evaluating the `set' expression, you can evaluate the symbol
+`flowers' and it will return the value you just set.  Here is the
+symbol.  Place your cursor after it and type `C-x C-e'.
+
+     flowers
+
+When you evaluate `flowers', the list `(rose violet daisy buttercup)'
+appears in the echo area.
+
+Incidentally, if you evaluate `'flowers', the variable with a quote in
+front of it, what you will see in the echo area is the symbol itself,
+`flowers'.  Here is the quoted symbol, so you can try this:
+
+     'flowers
+
+Note also, that when you use `set', you need to quote both arguments to
+`set', unless you want them evaluated.  Since we do not want either
+argument evaluated, neither the variable `flowers' nor the list `(rose
+violet daisy buttercup)', both are quoted.  (When you use `set' without
+quoting its first argument, the first argument is evaluated before
+anything else is done.  If you did this and `flowers' did not have a
+value already, you would get an error message that the `Symbol's value
+as variable is void'; on the other hand, if `flowers' did return a
+value after it was evaluated, the `set' would attempt to set the value
+that was returned.  There are situations where this is the right thing
+for the function to do; but such situations are rare.)
+
+
+File: eintr,  Node: Using setq,  Next: Counting,  Prev: Using set,  Up: set & setq
+
+1.9.2 Using `setq'
+------------------
+
+As a practical matter, you almost always quote the first argument to
+`set'.  The combination of `set' and a quoted first argument is so
+common that it has its own name: the special form `setq'.  This special
+form is just like `set' except that the first argument is quoted
+automatically, so you don't need to type the quote mark yourself.
+Also, as an added convenience, `setq' permits you to set several
+different variables to different values, all in one expression.
+
+To set the value of the variable `carnivores' to the list `'(lion tiger
+leopard)' using `setq', the following expression is used:
+
+     (setq carnivores '(lion tiger leopard))
+
+This is exactly the same as using `set' except the first argument is
+automatically quoted by `setq'.  (The `q' in `setq' means `quote'.)
+
+With `set', the expression would look like this:
+
+     (set 'carnivores '(lion tiger leopard))
+
+Also, `setq' can be used to assign different values to different
+variables.  The first argument is bound to the value of the second
+argument, the third argument is bound to the value of the fourth
+argument, and so on.  For example, you could use the following to
+assign a list of trees to the symbol `trees' and a list of herbivores
+to the symbol `herbivores':
+
+     (setq trees '(pine fir oak maple)
+           herbivores '(gazelle antelope zebra))
+
+(The expression could just as well have been on one line, but it might
+not have fit on a page; and humans find it easier to read nicely
+formatted lists.)
+
+Although I have been using the term `assign', there is another way of
+thinking about the workings of `set' and `setq'; and that is to say
+that `set' and `setq' make the symbol _point_ to the list.  This latter
+way of thinking is very common and in forthcoming chapters we shall
+come upon at least one symbol that has `pointer' as part of its name.
+The name is chosen because the symbol has a value, specifically a list,
+attached to it; or, expressed another way, the symbol is set to "point"
+to the list.
+
+
+File: eintr,  Node: Counting,  Prev: Using setq,  Up: set & setq
+
+1.9.3 Counting
+--------------
+
+Here is an example that shows how to use `setq' in a counter.  You
+might use this to count how many times a part of your program repeats
+itself.  First set a variable to zero; then add one to the number each
+time the program repeats itself.  To do this, you need a variable that
+serves as a counter, and two expressions: an initial `setq' expression
+that sets the counter variable to zero; and a second `setq' expression
+that increments the counter each time it is evaluated.
+
+     (setq counter 0)                ; Let's call this the initializer.
+
+     (setq counter (+ counter 1))    ; This is the incrementer.
+
+     counter                         ; This is the counter.
+
+(The text following the `;' are comments.  *Note Change a Function
+Definition: Change a defun.)
+
+If you evaluate the first of these expressions, the initializer, `(setq
+counter 0)', and then evaluate the third expression, `counter', the
+number `0' will appear in the echo area.  If you then evaluate the
+second expression, the incrementer, `(setq counter (+ counter 1))', the
+counter will get the value 1.  So if you again evaluate `counter', the
+number `1' will appear in the echo area.  Each time you evaluate the
+second expression, the value of the counter will be incremented.
+
+When you evaluate the incrementer, `(setq counter (+ counter 1))', the
+Lisp interpreter first evaluates the innermost list; this is the
+addition.  In order to evaluate this list, it must evaluate the variable
+`counter' and the number `1'.  When it evaluates the variable
+`counter', it receives its current value.  It passes this value and the
+number `1' to the `+' which adds them together.  The sum is then
+returned as the value of the inner list and passed to the `setq' which
+sets the variable `counter' to this new value.  Thus, the value of the
+variable, `counter', is changed.
+
+
+File: eintr,  Node: Summary,  Next: Error Message Exercises,  Prev: set & setq,  Up: List Processing
+
+1.10 Summary
+============
+
+Learning Lisp is like climbing a hill in which the first part is the
+steepest.  You have now climbed the most difficult part; what remains
+becomes easier as you progress onwards.
+
+In summary,
+
+   * Lisp programs are made up of expressions, which are lists or
+     single atoms.
+
+   * Lists are made up of zero or more atoms or inner lists, separated
+     by whitespace and surrounded by parentheses.  A list can be empty.
+
+   * Atoms are multi-character symbols, like `forward-paragraph', single
+     character symbols like `+', strings of characters between double
+     quotation marks, or numbers.
+
+   * A number evaluates to itself.
+
+   * A string between double quotes also evaluates to itself.
+
+   * When you evaluate a symbol by itself, its value is returned.
+
+   * When you evaluate a list, the Lisp interpreter looks at the first
+     symbol in the list and then at the function definition bound to
+     that symbol.  Then the instructions in the function definition are
+     carried out.
+
+   * A single quotation mark, ' , tells the Lisp interpreter that it
+     should return the following expression as written, and not
+     evaluate it as it would if the quote were not there.
+
+   * Arguments are the information passed to a function.  The arguments
+     to a function are computed by evaluating the rest of the elements
+     of the list of which the function is the first element.
+
+   * A function always returns a value when it is evaluated (unless it
+     gets an error); in addition, it may also carry out some action
+     called a "side effect".  In many cases, a function's primary
+     purpose is to create a side effect.
+
+
+File: eintr,  Node: Error Message Exercises,  Prev: Summary,  Up: List Processing
+
+1.11 Exercises
+==============
+
+A few simple exercises:
+
+   * Generate an error message by evaluating an appropriate symbol that
+     is not within parentheses.
+
+   * Generate an error message by evaluating an appropriate symbol that
+     is between parentheses.
+
+   * Create a counter that increments by two rather than one.
+
+   * Write an expression that prints a message in the echo area when
+     evaluated.
+
+
+File: eintr,  Node: Practicing Evaluation,  Next: Writing Defuns,  Prev: List Processing,  Up: Top
+
+2 Practicing Evaluation
+***********************
+
+Before learning how to write a function definition in Emacs Lisp, it is
+useful to spend a little time evaluating various expressions that have
+already been written.  These expressions will be lists with the
+functions as their first (and often only) element.  Since some of the
+functions associated with buffers are both simple and interesting, we
+will start with those.  In this section, we will evaluate a few of
+these.  In another section, we will study the code of several other
+buffer-related functions, to see how they were written.
+
+* Menu:
+
+* How to Evaluate::
+* Buffer Names::
+* Getting Buffers::
+* Switching Buffers::
+* Buffer Size & Locations::
+* Evaluation Exercise::
+
+
+File: eintr,  Node: How to Evaluate,  Next: Buffer Names,  Prev: Practicing Evaluation,  Up: Practicing Evaluation
+
+How to Evaluate
+===============
+
+Whenever you give an editing command to Emacs Lisp, such as the command
+to move the cursor or to scroll the screen, you are evaluating an
+expression, the first element of which is a function.  This is how
+Emacs works.
+
+When you type keys, you cause the Lisp interpreter to evaluate an
+expression and that is how you get your results.  Even typing plain text
+involves evaluating an Emacs Lisp function, in this case, one that uses
+`self-insert-command', which simply inserts the character you typed.
+The functions you evaluate by typing keystrokes are called
+"interactive" functions, or "commands"; how you make a function
+interactive will be illustrated in the chapter on how to write function
+definitions.  *Note Making a Function Interactive: Interactive.
+
+In addition to typing keyboard commands, we have seen a second way to
+evaluate an expression: by positioning the cursor after a list and
+typing `C-x C-e'.  This is what we will do in the rest of this section.
+There are other ways to evaluate an expression as well; these will be
+described as we come to them.
+
+Besides being used for practicing evaluation, the functions shown in the
+next few sections are important in their own right.  A study of these
+functions makes clear the distinction between buffers and files, how to
+switch to a buffer, and how to determine a location within it.
+
+
+File: eintr,  Node: Buffer Names,  Next: Getting Buffers,  Prev: How to Evaluate,  Up: Practicing Evaluation
+
+2.1 Buffer Names
+================
+
+The two functions, `buffer-name' and `buffer-file-name', show the
+difference between a file and a buffer.  When you evaluate the
+following expression, `(buffer-name)', the name of the buffer appears
+in the echo area.  When you evaluate `(buffer-file-name)', the name of
+the file to which the buffer refers appears in the echo area.  Usually,
+the name returned by `(buffer-name)' is the same as the name of the
+file to which it refers, and the name returned by `(buffer-file-name)'
+is the full path-name of the file.
+
+A file and a buffer are two different entities.  A file is information
+recorded permanently in the computer (unless you delete it).  A buffer,
+on the other hand, is information inside of Emacs that will vanish at
+the end of the editing session (or when you kill the buffer).  Usually,
+a buffer contains information that you have copied from a file; we say
+the buffer is "visiting" that file.  This copy is what you work on and
+modify.  Changes to the buffer do not change the file, until you save
+the buffer.  When you save the buffer, the buffer is copied to the file
+and is thus saved permanently.
+
+If you are reading this in Info inside of GNU Emacs, you can evaluate
+each of the following expressions by positioning the cursor after it and
+typing `C-x C-e'.
+
+     (buffer-name)
+
+     (buffer-file-name)
+
+When I do this in Info, the value returned by evaluating
+`(buffer-name)' is `"*info*"', and the value returned by evaluating
+`(buffer-file-name)' is `nil'.
+
+On the other hand, while I am writing this Introduction, the value
+returned by evaluating `(buffer-name)' is `"introduction.texinfo"', and
+the value returned by evaluating `(buffer-file-name)' is
+`"/gnu/work/intro/introduction.texinfo"'.
+
+The former is the name of the buffer and the latter is the name of the
+file.  In Info, the buffer name is `"*info*"'.  Info does not point to
+any file, so the result of evaluating `(buffer-file-name)' is `nil'.
+The symbol `nil' is from the Latin word for `nothing'; in this case, it
+means that the buffer is not associated with any file.  (In Lisp, `nil'
+is also used to mean `false' and is a synonym for the empty list, `()'.)
+
+When I am writing, the name of my buffer is `"introduction.texinfo"'.
+The name of the file to which it points is
+`"/gnu/work/intro/introduction.texinfo"'.
+
+(In the expressions, the parentheses tell the Lisp interpreter to treat
+`buffer-name' and `buffer-file-name' as functions; without the
+parentheses, the interpreter would attempt to evaluate the symbols as
+variables.  *Note Variables::.)
+
+In spite of the distinction between files and buffers, you will often
+find that people refer to a file when they mean a buffer and vice-verse.
+Indeed, most people say, "I am editing a file," rather than saying, "I
+am editing a buffer which I will soon save to a file."  It is almost
+always clear from context what people mean.  When dealing with computer
+programs, however, it is important to keep the distinction in mind,
+since the computer is not as smart as a person.
+
+The word `buffer', by the way, comes from the meaning of the word as a
+cushion that deadens the force of a collision.  In early computers, a
+buffer cushioned the interaction between files and the computer's
+central processing unit.  The drums or tapes that held a file and the
+central processing unit were pieces of equipment that were very
+different from each other, working at their own speeds, in spurts.  The
+buffer made it possible for them to work together effectively.
+Eventually, the buffer grew from being an intermediary, a temporary
+holding place, to being the place where work is done.  This
+transformation is rather like that of a small seaport that grew into a
+great city: once it was merely the place where cargo was warehoused
+temporarily before being loaded onto ships; then it became a business
+and cultural center in its own right.
+
+Not all buffers are associated with files.  For example, a `*scratch*'
+buffer does not visit any file.  Similarly, a `*Help*' buffer is not
+associated with any file.
+
+In the old days, when you lacked a `~/.emacs' file and started an Emacs
+session by typing the command `emacs' alone, without naming any files,
+Emacs started with the `*scratch*' buffer visible.  Nowadays, you will
+see a splash screen.  You can follow one of the commands suggested on
+the splash screen, visit a file, or press the spacebar to reach the
+`*scratch*' buffer.
+
+If you switch to the `*scratch*' buffer, type `(buffer-name)', position
+the cursor after it, and then type `C-x C-e' to evaluate the
+expression.  The name `"*scratch*"' will be returned and will appear in
+the echo area.  `"*scratch*"' is the name of the buffer.  When you type
+`(buffer-file-name)' in the `*scratch*' buffer and evaluate that, `nil'
+will appear in the echo area, just as it does when you evaluate
+`(buffer-file-name)' in Info.
+
+Incidentally, if you are in the `*scratch*' buffer and want the value
+returned by an expression to appear in the `*scratch*' buffer itself
+rather than in the echo area, type `C-u C-x C-e' instead of `C-x C-e'.
+This causes the value returned to appear after the expression.  The
+buffer will look like this:
+
+     (buffer-name)"*scratch*"
+
+You cannot do this in Info since Info is read-only and it will not allow
+you to change the contents of the buffer.  But you can do this in any
+buffer you can edit; and when you write code or documentation (such as
+this book), this feature is very useful.
+
+
+File: eintr,  Node: Getting Buffers,  Next: Switching Buffers,  Prev: Buffer Names,  Up: Practicing Evaluation
+
+2.2 Getting Buffers
+===================
+
+The `buffer-name' function returns the _name_ of the buffer; to get the
+buffer _itself_, a different function is needed: the `current-buffer'
+function.  If you use this function in code, what you get is the buffer
+itself.
+
+A name and the object or entity to which the name refers are different
+from each other.  You are not your name.  You are a person to whom
+others refer by name.  If you ask to speak to George and someone hands
+you a card with the letters `G', `e', `o', `r', `g', and `e' written on
+it, you might be amused, but you would not be satisfied.  You do not
+want to speak to the name, but to the person to whom the name refers.
+A buffer is similar: the name of the scratch buffer is `*scratch*', but
+the name is not the buffer.  To get a buffer itself, you need to use a
+function such as `current-buffer'.
+
+However, there is a slight complication: if you evaluate
+`current-buffer' in an expression on its own, as we will do here, what
+you see is a printed representation of the name of the buffer without
+the contents of the buffer.  Emacs works this way for two reasons: the
+buffer may be thousands of lines long--too long to be conveniently
+displayed; and, another buffer may have the same contents but a
+different name, and it is important to distinguish between them.
+
+Here is an expression containing the function:
+
+     (current-buffer)
+
+If you evaluate this expression in Info in Emacs in the usual way,
+`#<buffer *info*>' will appear in the echo area.  The special format
+indicates that the buffer itself is being returned, rather than just
+its name.
+
+Incidentally, while you can type a number or symbol into a program, you
+cannot do that with the printed representation of a buffer: the only way
+to get a buffer itself is with a function such as `current-buffer'.
+
+A related function is `other-buffer'.  This returns the most recently
+selected buffer other than the one you are in currently, not a printed
+representation of its name.  If you have recently switched back and
+forth from the `*scratch*' buffer, `other-buffer' will return that
+buffer.
+
+You can see this by evaluating the expression:
+
+     (other-buffer)
+
+You should see `#<buffer *scratch*>' appear in the echo area, or the
+name of whatever other buffer you switched back from most recently(1).
+
+---------- Footnotes ----------
+
+(1) Actually, by default, if the buffer from which you just switched is
+visible to you in another window, `other-buffer' will choose the most
+recent buffer that you cannot see; this is a subtlety that I often
+forget.
+
+
+File: eintr,  Node: Switching Buffers,  Next: Buffer Size & Locations,  Prev: Getting Buffers,  Up: Practicing Evaluation
+
+2.3 Switching Buffers
+=====================
+
+The `other-buffer' function actually provides a buffer when it is used
+as an argument to a function that requires one.  We can see this by
+using `other-buffer' and `switch-to-buffer' to switch to a different
+buffer.
+
+But first, a brief introduction to the `switch-to-buffer' function.
+When you switched back and forth from Info to the `*scratch*' buffer to
+evaluate `(buffer-name)', you most likely typed `C-x b' and then typed
+`*scratch*'(1) when prompted in the minibuffer for the name of the
+buffer to which you wanted to switch.  The keystrokes, `C-x b', cause
+the Lisp interpreter to evaluate the interactive function
+`switch-to-buffer'.  As we said before, this is how Emacs works:
+different keystrokes call or run different functions.  For example,
+`C-f' calls `forward-char', `M-e' calls `forward-sentence', and so on.
+
+By writing `switch-to-buffer' in an expression, and giving it a buffer
+to switch to, we can switch buffers just the way `C-x b' does.
+
+Here is the Lisp expression:
+
+     (switch-to-buffer (other-buffer))
+
+The symbol `switch-to-buffer' is the first element of the list, so the
+Lisp interpreter will treat it as a function and carry out the
+instructions that are attached to it.  But before doing that, the
+interpreter will note that `other-buffer' is inside parentheses and
+work on that symbol first.  `other-buffer' is the first (and in this
+case, the only) element of this list, so the Lisp interpreter calls or
+runs the function.  It returns another buffer.  Next, the interpreter
+runs `switch-to-buffer', passing to it, as an argument, the other
+buffer, which is what Emacs will switch to.  If you are reading this in
+Info, try this now.  Evaluate the expression.  (To get back, type `C-x
+b <RET>'.)(2)
+
+In the programming examples in later sections of this document, you will
+see the function `set-buffer' more often than `switch-to-buffer'.  This
+is because of a difference between computer programs and humans: humans
+have eyes and expect to see the buffer on which they are working on
+their computer terminals.  This is so obvious, it almost goes without
+saying.  However, programs do not have eyes.  When a computer program
+works on a buffer, that buffer does not need to be visible on the
+screen.
+
+`switch-to-buffer' is designed for humans and does two different
+things: it switches the buffer to which Emacs' attention is directed;
+and it switches the buffer displayed in the window to the new buffer.
+`set-buffer', on the other hand, does only one thing: it switches the
+attention of the computer program to a different buffer.  The buffer on
+the screen remains unchanged (of course, normally nothing happens there
+until the command finishes running).
+
+Also, we have just introduced another jargon term, the word "call".
+When you evaluate a list in which the first symbol is a function, you
+are calling that function.  The use of the term comes from the notion of
+the function as an entity that can do something for you if you `call'
+it--just as a plumber is an entity who can fix a leak if you call him
+or her.
+
+---------- Footnotes ----------
+
+(1) Or rather, to save typing, you probably only typed `RET' if the
+default buffer was `*scratch*', or if it was different, then you typed
+just part of the name, such as `*sc', pressed your `TAB' key to cause
+it to expand to the full name, and then typed your `RET' key.
+
+(2) Remember, this expression will move you to your most recent other
+buffer that you cannot see.  If you really want to go to your most
+recently selected buffer, even if you can still see it, you need to
+evaluate the following more complex expression:
+
+     (switch-to-buffer (other-buffer (current-buffer) t))
+
+In this case, the first argument to `other-buffer' tells it which
+buffer to skip--the current one--and the second argument tells
+`other-buffer' it is OK to switch to a visible buffer.  In regular use,
+`switch-to-buffer' takes you to an invisible window since you would
+most likely use `C-x o' (`other-window') to go to another visible
+buffer.
+
+
+File: eintr,  Node: Buffer Size & Locations,  Next: Evaluation Exercise,  Prev: Switching Buffers,  Up: Practicing Evaluation
+
+2.4 Buffer Size and the Location of Point
+=========================================
+
+Finally, let's look at several rather simple functions, `buffer-size',
+`point', `point-min', and `point-max'.  These give information about
+the size of a buffer and the location of point within it.
+
+The function `buffer-size' tells you the size of the current buffer;
+that is, the function returns a count of the number of characters in
+the buffer.
+
+     (buffer-size)
+
+You can evaluate this in the usual way, by positioning the cursor after
+the expression and typing `C-x C-e'.
+
+In Emacs, the current  position of the cursor is called "point".  The
+expression `(point)' returns a number that tells you where the cursor
+is located as a count of the number of characters from the beginning of
+the buffer up to point.
+
+You can see the character count for point in this buffer by evaluating
+the following expression in the usual way:
+
+     (point)
+
+As I write this, the value of `point' is 65724.  The `point' function
+is frequently used in some of the examples later in this book.
+
+The value of point depends, of course, on its location within the
+buffer.  If you evaluate point in this spot, the number will be larger:
+
+     (point)
+
+For me, the value of point in this location is 66043, which means that
+there are 319 characters (including spaces) between the two expressions.
+
+The function `point-min' is somewhat similar to `point', but it returns
+the value of the minimum permissible value of point in the current
+buffer.  This is the number 1 unless "narrowing" is in effect.
+(Narrowing is a mechanism whereby you can restrict yourself, or a
+program, to operations on just a part of a buffer.  *Note Narrowing and
+Widening: Narrowing & Widening.)  Likewise, the function `point-max'
+returns the value of the maximum permissible value of point in the
+current buffer.
+
+
+File: eintr,  Node: Evaluation Exercise,  Prev: Buffer Size & Locations,  Up: Practicing Evaluation
+
+2.5 Exercise
+============
+
+Find a file with which you are working and move towards its middle.
+Find its buffer name, file name, length, and your position in the file.
+
+
+File: eintr,  Node: Writing Defuns,  Next: Buffer Walk Through,  Prev: Practicing Evaluation,  Up: Top
+
+3 How To Write Function Definitions
+***********************************
+
+When the Lisp interpreter evaluates a list, it looks to see whether the
+first symbol on the list has a function definition attached to it; or,
+put another way, whether the symbol points to a function definition.  If
+it does, the computer carries out the instructions in the definition.  A
+symbol that has a function definition is called, simply, a function
+(although, properly speaking, the definition is the function and the
+symbol refers to it.)
+
+* Menu:
+
+* Primitive Functions::
+* defun::
+* Install::
+* Interactive::
+* Interactive Options::
+* Permanent Installation::
+* let::
+* if::
+* else::
+* Truth & Falsehood::
+* save-excursion::
+* Review::
+* defun Exercises::
+
+
+File: eintr,  Node: Primitive Functions,  Next: defun,  Prev: Writing Defuns,  Up: Writing Defuns
+
+An Aside about Primitive Functions
+==================================
+
+All functions are defined in terms of other functions, except for a few
+"primitive" functions that are written in the C programming language.
+When you write functions' definitions, you will write them in Emacs
+Lisp and use other functions as your building blocks.  Some of the
+functions you will use will themselves be written in Emacs Lisp (perhaps
+by you) and some will be primitives written in C.  The primitive
+functions are used exactly like those written in Emacs Lisp and behave
+like them.  They are written in C so we can easily run GNU Emacs on any
+computer that has sufficient power and can run C.
+
+Let me re-emphasize this: when you write code in Emacs Lisp, you do not
+distinguish between the use of functions written in C and the use of
+functions written in Emacs Lisp.  The difference is irrelevant.  I
+mention the distinction only because it is interesting to know.  Indeed,
+unless you investigate, you won't know whether an already-written
+function is written in Emacs Lisp or C.
+
+
+File: eintr,  Node: defun,  Next: Install,  Prev: Primitive Functions,  Up: Writing Defuns
+
+3.1 The `defun' Special Form
+============================
+
+In Lisp, a symbol such as `mark-whole-buffer' has code attached to it
+that tells the computer what to do when the function is called.  This
+code is called the "function definition" and is created by evaluating a
+Lisp expression that starts with the symbol `defun' (which is an
+abbreviation for _define function_).  Because `defun' does not evaluate
+its arguments in the usual way, it is called a "special form".
+
+In subsequent sections, we will look at function definitions from the
+Emacs source code, such as `mark-whole-buffer'.  In this section, we
+will describe a simple function definition so you can see how it looks.
+This function definition uses arithmetic because it makes for a simple
+example.  Some people dislike examples using arithmetic; however, if
+you are such a person, do not despair.  Hardly any of the code we will
+study in the remainder of this introduction involves arithmetic or
+mathematics.  The examples mostly involve text in one way or another.
+
+A function definition has up to five parts following the word `defun':
+
+  1. The name of the symbol to which the function definition should be
+     attached.
+
+  2. A list of the arguments that will be passed to the function.  If no
+     arguments will be passed to the function, this is an empty list,
+     `()'.
+
+  3. Documentation describing the function.  (Technically optional, but
+     strongly recommended.)
+
+  4. Optionally, an expression to make the function interactive so you
+     can use it by typing `M-x' and then the name of the function; or by
+     typing an appropriate key or keychord.
+
+  5. The code that instructs the computer what to do: the "body" of the
+     function definition.
+
+It is helpful to think of the five parts of a function definition as
+being organized in a template, with slots for each part:
+
+     (defun FUNCTION-NAME (ARGUMENTS...)
+       "OPTIONAL-DOCUMENTATION..."
+       (interactive ARGUMENT-PASSING-INFO)     ; optional
+       BODY...)
+
+As an example, here is the code for a function that multiplies its
+argument by 7.  (This example is not interactive.  *Note Making a
+Function Interactive: Interactive, for that information.)
+
+     (defun multiply-by-seven (number)
+       "Multiply NUMBER by seven."
+       (* 7 number))
+
+This definition begins with a parenthesis and the symbol `defun',
+followed by the name of the function.
+
+The name of the function is followed by a list that contains the
+arguments that will be passed to the function.  This list is called the
+"argument list".  In this example, the list has only one element, the
+symbol, `number'.  When the function is used, the symbol will be bound
+to the value that is used as the argument to the function.
+
+Instead of choosing the word `number' for the name of the argument, I
+could have picked any other name.  For example, I could have chosen the
+word `multiplicand'.  I picked the word `number' because it tells what
+kind of value is intended for this slot; but I could just as well have
+chosen the word `multiplicand' to indicate the role that the value
+placed in this slot will play in the workings of the function.  I could
+have called it `foogle', but that would have been a bad choice because
+it would not tell humans what it means.  The choice of name is up to
+the programmer and should be chosen to make the meaning of the function
+clear.
+
+Indeed, you can choose any name you wish for a symbol in an argument
+list, even the name of a symbol used in some other function: the name
+you use in an argument list is private to that particular definition.
+In that definition, the name refers to a different entity than any use
+of the same name outside the function definition.  Suppose you have a
+nick-name `Shorty' in your family; when your family members refer to
+`Shorty', they mean you.  But outside your family, in a movie, for
+example, the name `Shorty' refers to someone else.  Because a name in an
+argument list is private to the function definition, you can change the
+value of such a symbol inside the body of a function without changing
+its value outside the function.  The effect is similar to that produced
+by a `let' expression.  (*Note `let': let.)
+
+The argument list is followed by the documentation string that
+describes the function.  This is what you see when you type `C-h f' and
+the name of a function.  Incidentally, when you write a documentation
+string like this, you should make the first line a complete sentence
+since some commands, such as `apropos', print only the first line of a
+multi-line documentation string.  Also, you should not indent the
+second line of a documentation string, if you have one, because that
+looks odd when you use `C-h f' (`describe-function').  The
+documentation string is optional, but it is so useful, it should be
+included in almost every function you write.
+
+The third line of the example consists of the body of the function
+definition.  (Most functions' definitions, of course, are longer than
+this.)  In this function, the body is the list, `(* 7 number)', which
+says to multiply the value of NUMBER by 7.  (In Emacs Lisp, `*' is the
+function for multiplication, just as `+' is the function for addition.)
+
+When you use the `multiply-by-seven' function, the argument `number'
+evaluates to the actual number you want used.  Here is an example that
+shows how `multiply-by-seven' is used; but don't try to evaluate this
+yet!
+
+     (multiply-by-seven 3)
+
+The symbol `number', specified in the function definition in the next
+section, is given or "bound to" the value 3 in the actual use of the
+function.  Note that although `number' was inside parentheses in the
+function definition, the argument passed to the `multiply-by-seven'
+function is not in parentheses.  The parentheses are written in the
+function definition so the computer can figure out where the argument
+list ends and the rest of the function definition begins.
+
+If you evaluate this example, you are likely to get an error message.
+(Go ahead, try it!)  This is because we have written the function
+definition, but not yet told the computer about the definition--we have
+not yet installed (or `loaded') the function definition in Emacs.
+Installing a function is the process that tells the Lisp interpreter the
+definition of the function.  Installation is described in the next
+section.
+
+
+File: eintr,  Node: Install,  Next: Interactive,  Prev: defun,  Up: Writing Defuns
+
+3.2 Install a Function Definition
+=================================
+
+If you are reading this inside of Info in Emacs, you can try out the
+`multiply-by-seven' function by first evaluating the function
+definition and then evaluating `(multiply-by-seven 3)'.  A copy of the
+function definition follows.  Place the cursor after the last
+parenthesis of the function definition and type `C-x C-e'.  When you do
+this, `multiply-by-seven' will appear in the echo area.  (What this
+means is that when a function definition is evaluated, the value it
+returns is the name of the defined function.)  At the same time, this
+action installs the function definition.
+
+     (defun multiply-by-seven (number)
+       "Multiply NUMBER by seven."
+       (* 7 number))
+
+By evaluating this `defun', you have just installed `multiply-by-seven'
+in Emacs.  The function is now just as much a part of Emacs as
+`forward-word' or any other editing function you use.
+(`multiply-by-seven' will stay installed until you quit Emacs.  To
+reload code automatically whenever you start Emacs, see *Note
+Installing Code Permanently: Permanent Installation.)
+
+* Menu:
+
+* Effect of installation::
+* Change a defun::
+
+
+File: eintr,  Node: Effect of installation,  Next: Change a defun,  Prev: Install,  Up: Install
+
+The effect of installation
+--------------------------
+
+You can see the effect of installing `multiply-by-seven' by evaluating
+the following sample.  Place the cursor after the following expression
+and type `C-x C-e'.  The number 21 will appear in the echo area.
+
+     (multiply-by-seven 3)
+
+If you wish, you can read the documentation for the function by typing
+`C-h f' (`describe-function') and then the name of the function,
+`multiply-by-seven'.  When you do this, a `*Help*' window will appear
+on your screen that says:
+
+     multiply-by-seven is a Lisp function.
+     (multiply-by-seven NUMBER)
+
+     Multiply NUMBER by seven.
+
+(To return to a single window on your screen, type `C-x 1'.)
+
+
+File: eintr,  Node: Change a defun,  Prev: Effect of installation,  Up: Install
+
+3.2.1 Change a Function Definition
+----------------------------------
+
+If you want to change the code in `multiply-by-seven', just rewrite it.
+To install the new version in place of the old one, evaluate the
+function definition again.  This is how you modify code in Emacs.  It is
+very simple.
+
+As an example, you can change the `multiply-by-seven' function to add
+the number to itself seven times instead of multiplying the number by
+seven.  It produces the same answer, but by a different path.  At the
+same time, we will add a comment to the code; a comment is text that
+the Lisp interpreter ignores, but that a human reader may find useful
+or enlightening.  The comment is that this is the "second version".
+
+     (defun multiply-by-seven (number)       ; Second version.
+       "Multiply NUMBER by seven."
+       (+ number number number number number number number))
+
+The comment follows a semicolon, `;'.  In Lisp, everything on a line
+that follows a semicolon is a comment.  The end of the line is the end
+of the comment.  To stretch a comment over two or more lines, begin
+each line with a semicolon.
+
+*Note Beginning a `.emacs' File: Beginning a .emacs File, and *Note
+Comments: (elisp)Comments, for more about comments.
+
+You can install this version of the `multiply-by-seven' function by
+evaluating it in the same way you evaluated the first function: place
+the cursor after the last parenthesis and type `C-x C-e'.
+
+In summary, this is how you write code in Emacs Lisp: you write a
+function; install it; test it; and then make fixes or enhancements and
+install it again.
+
+
+File: eintr,  Node: Interactive,  Next: Interactive Options,  Prev: Install,  Up: Writing Defuns
+
+3.3 Make a Function Interactive
+===============================
+
+You make a function interactive by placing a list that begins with the
+special form `interactive' immediately after the documentation.  A user
+can invoke an interactive function by typing `M-x' and then the name of
+the function; or by typing the keys to which it is bound, for example,
+by typing `C-n' for `next-line' or `C-x h' for `mark-whole-buffer'.
+
+Interestingly, when you call an interactive function interactively, the
+value returned is not automatically displayed in the echo area.  This
+is because you often call an interactive function for its side effects,
+such as moving forward by a word or line, and not for the value
+returned.  If the returned value were displayed in the echo area each
+time you typed a key, it would be very distracting.
+
+* Menu:
+
+* Interactive multiply-by-seven::
+* multiply-by-seven in detail::
+
+
+File: eintr,  Node: Interactive multiply-by-seven,  Next: multiply-by-seven in detail,  Prev: Interactive,  Up: Interactive
+
+An Interactive `multiply-by-seven', An Overview
+-----------------------------------------------
+
+Both the use of the special form `interactive' and one way to display a
+value in the echo area can be illustrated by creating an interactive
+version of `multiply-by-seven'.
+
+Here is the code:
+
+     (defun multiply-by-seven (number)       ; Interactive version.
+       "Multiply NUMBER by seven."
+       (interactive "p")
+       (message "The result is %d" (* 7 number)))
+
+You can install this code by placing your cursor after it and typing
+`C-x C-e'.  The name of the function will appear in your echo area.
+Then, you can use this code by typing `C-u' and a number and then
+typing `M-x multiply-by-seven' and pressing <RET>.  The phrase `The
+result is ...' followed by the product will appear in the echo area.
+
+Speaking more generally, you invoke a function like this in either of
+two ways:
+
+  1. By typing a prefix argument that contains the number to be passed,
+     and then typing `M-x' and the name of the function, as with `C-u 3
+     M-x forward-sentence'; or,
+
+  2. By typing whatever key or keychord the function is bound to, as
+     with `C-u 3 M-e'.
+
+Both the examples just mentioned work identically to move point forward
+three sentences.  (Since `multiply-by-seven' is not bound to a key, it
+could not be used as an example of key binding.)
+
+(*Note Some Keybindings: Keybindings, to learn how to bind a command to
+a key.)
+
+A prefix argument is passed to an interactive function by typing the
+<META> key followed by a number, for example, `M-3 M-e', or by typing
+`C-u' and then a number, for example, `C-u 3 M-e' (if you type `C-u'
+without a number, it defaults to 4).
+
+
+File: eintr,  Node: multiply-by-seven in detail,  Prev: Interactive multiply-by-seven,  Up: Interactive
+
+3.3.1 An Interactive `multiply-by-seven'
+----------------------------------------
+
+Let's look at the use of the special form `interactive' and then at the
+function `message' in the interactive version of `multiply-by-seven'.
+You will recall that the function definition looks like this:
+
+     (defun multiply-by-seven (number)       ; Interactive version.
+       "Multiply NUMBER by seven."
+       (interactive "p")
+       (message "The result is %d" (* 7 number)))
+
+In this function, the expression, `(interactive "p")', is a list of two
+elements.  The `"p"' tells Emacs to pass the prefix argument to the
+function and use its value for the argument of the function.
+
+The argument will be a number.  This means that the symbol `number'
+will be bound to a number in the line:
+
+     (message "The result is %d" (* 7 number))
+
+For example, if your prefix argument is 5, the Lisp interpreter will
+evaluate the line as if it were:
+
+     (message "The result is %d" (* 7 5))
+
+(If you are reading this in GNU Emacs, you can evaluate this expression
+yourself.)  First, the interpreter will evaluate the inner list, which
+is `(* 7 5)'.  This returns a value of 35.  Next, it will evaluate the
+outer list, passing the values of the second and subsequent elements of
+the list to the function `message'.
+
+As we have seen, `message' is an Emacs Lisp function especially
+designed for sending a one line message to a user.  (*Note The
+`message' function: message.)  In summary, the `message' function
+prints its first argument in the echo area as is, except for
+occurrences of `%d' or `%s' (and various other %-sequences which we
+have not mentioned).  When it sees a control sequence, the function
+looks to the second or subsequent arguments and prints the value of the
+argument in the location in the string where the control sequence is
+located.
+
+In the interactive `multiply-by-seven' function, the control string is
+`%d', which requires a number, and the value returned by evaluating `(*
+7 5)' is the number 35.  Consequently, the number 35 is printed in
+place of the `%d' and the message is `The result is 35'.
+
+(Note that when you call the function `multiply-by-seven', the message
+is printed without quotes, but when you call `message', the text is
+printed in double quotes.  This is because the value returned by
+`message' is what appears in the echo area when you evaluate an
+expression whose first element is `message'; but when embedded in a
+function, `message' prints the text as a side effect without quotes.)
+
+
+File: eintr,  Node: Interactive Options,  Next: Permanent Installation,  Prev: Interactive,  Up: Writing Defuns
+
+3.4 Different Options for `interactive'
+=======================================
+
+In the example, `multiply-by-seven' used `"p"' as the argument to
+`interactive'.  This argument told Emacs to interpret your typing
+either `C-u' followed by a number or <META> followed by a number as a
+command to pass that number to the function as its argument.  Emacs has
+more than twenty characters predefined for use with `interactive'.  In
+almost every case, one of these options will enable you to pass the
+right information interactively to a function.  (*Note Code Characters
+for `interactive': (elisp)Interactive Codes.)
+
+Consider the function `zap-to-char'.  Its interactive expression is
+
+     (interactive "p\ncZap to char: ")
+
+The first part of the argument to `interactive' is `p', with which you
+are already familiar.  This argument tells Emacs to interpret a
+`prefix', as a number to be passed to the function.  You can specify a
+prefix either by typing `C-u' followed by a number or by typing <META>
+followed by a number.  The prefix is the number of specified
+characters.  Thus, if your prefix is three and the specified character
+is `x', then you will delete all the text up to and including the third
+next `x'.  If you do not set a prefix, then you delete all the text up
+to and including the specified character, but no more.
+
+The `c' tells the function the name of the character to which to delete.
+
+More formally, a function with two or more arguments can have
+information passed to each argument by adding parts to the string that
+follows `interactive'.  When you do this, the information is passed to
+each argument in the same order it is specified in the `interactive'
+list.  In the string, each part is separated from the next part by a
+`\n', which is a newline.  For example, you can follow `p' with a `\n'
+and an `cZap to char: '.  This causes Emacs to pass the value of the
+prefix argument (if there is one) and the character.
+
+In this case, the function definition looks like the following, where
+`arg' and `char' are the symbols to which `interactive' binds the
+prefix argument and the specified character:
+
+     (defun NAME-OF-FUNCTION (arg char)
+       "DOCUMENTATION..."
+       (interactive "p\ncZap to char: ")
+       BODY-OF-FUNCTION...)
+
+(The space after the colon in the prompt makes it look better when you
+are prompted.  *Note The Definition of `copy-to-buffer':
+copy-to-buffer, for an example.)
+
+When a function does not take arguments, `interactive' does not require
+any.  Such a function contains the simple expression `(interactive)'.
+The `mark-whole-buffer' function is like this.
+
+Alternatively, if the special letter-codes are not right for your
+application, you can pass your own arguments to `interactive' as a list.
+
+*Note The Definition of `append-to-buffer': append-to-buffer, for an
+example.  *Note Using `Interactive': (elisp)Using Interactive, for a
+more complete explanation about this technique.
+
+
+File: eintr,  Node: Permanent Installation,  Next: let,  Prev: Interactive Options,  Up: Writing Defuns
+
+3.5 Install Code Permanently
+============================
+
+When you install a function definition by evaluating it, it will stay
+installed until you quit Emacs.  The next time you start a new session
+of Emacs, the function will not be installed unless you evaluate the
+function definition again.
+
+At some point, you may want to have code installed automatically
+whenever you start a new session of Emacs.  There are several ways of
+doing this:
+
+   * If you have code that is just for yourself, you can put the code
+     for the function definition in your `.emacs' initialization file.
+     When you start Emacs, your `.emacs' file is automatically
+     evaluated and all the function definitions within it are installed.
+     *Note Your `.emacs' File: Emacs Initialization.
+
+   * Alternatively, you can put the function definitions that you want
+     installed in one or more files of their own and use the `load'
+     function to cause Emacs to evaluate and thereby install each of the
+     functions in the files.  *Note Loading Files: Loading Files.
+
+   * Thirdly, if you have code that your whole site will use, it is
+     usual to put it in a file called `site-init.el' that is loaded when
+     Emacs is built.  This makes the code available to everyone who uses
+     your machine.  (See the `INSTALL' file that is part of the Emacs
+     distribution.)
+
+Finally, if you have code that everyone who uses Emacs may want, you
+can post it on a computer network or send a copy to the Free Software
+Foundation.  (When you do this, please license the code and its
+documentation under a license that permits other people to run, copy,
+study, modify, and redistribute the code and which protects you from
+having your work taken from you.)  If you send a copy of your code to
+the Free Software Foundation, and properly protect yourself and others,
+it may be included in the next release of Emacs.  In large part, this
+is how Emacs has grown over the past years, by donations.
+
+
+File: eintr,  Node: let,  Next: if,  Prev: Permanent Installation,  Up: Writing Defuns
+
+3.6 `let'
+=========
+
+The `let' expression is a special form in Lisp that you will need to
+use in most function definitions.
+
+`let' is used to attach or bind a symbol to a value in such a way that
+the Lisp interpreter will not confuse the variable with a variable of
+the same name that is not part of the function.
+
+To understand why the `let' special form is necessary, consider the
+situation in which you own a home that you generally refer to as `the
+house', as in the sentence, "The house needs painting."  If you are
+visiting a friend and your host refers to `the house', he is likely to
+be referring to _his_ house, not yours, that is, to a different house.
+
+If your friend is referring to his house and you think he is referring
+to your house, you may be in for some confusion.  The same thing could
+happen in Lisp if a variable that is used inside of one function has
+the same name as a variable that is used inside of another function,
+and the two are not intended to refer to the same value.  The `let'
+special form prevents this kind of confusion.
+
+* Menu:
+
+* Prevent confusion::
+* Parts of let Expression::
+* Sample let Expression::
+* Uninitialized let Variables::
+
+
+File: eintr,  Node: Prevent confusion,  Next: Parts of let Expression,  Prev: let,  Up: let
+
+`let' Prevents Confusion
+------------------------
+
+The `let' special form prevents confusion.  `let' creates a name for a
+"local variable" that overshadows any use of the same name outside the
+`let' expression.  This is like understanding that whenever your host
+refers to `the house', he means his house, not yours.  (Symbols used in
+argument lists work the same way.  *Note The `defun' Special Form:
+defun.)
+
+Local variables created by a `let' expression retain their value _only_
+within the `let' expression itself (and within expressions called
+within the `let' expression); the local variables have no effect
+outside the `let' expression.
+
+Another way to think about `let' is that it is like a `setq' that is
+temporary and local.  The values set by `let' are automatically undone
+when the `let' is finished.  The setting only affects expressions that
+are inside the bounds of the `let' expression.  In computer science
+jargon, we would say "the binding of a symbol is visible only in
+functions called in the `let' form; in Emacs Lisp, scoping is dynamic,
+not lexical."
+
+`let' can create more than one variable at once.  Also, `let' gives
+each variable it creates an initial value, either a value specified by
+you, or `nil'.  (In the jargon, this is called `binding the variable to
+the value'.)  After `let' has created and bound the variables, it
+executes the code in the body of the `let', and returns the value of
+the last expression in the body, as the value of the whole `let'
+expression.  (`Execute' is a jargon term that means to evaluate a list;
+it comes from the use of the word meaning `to give practical effect to'
+(`Oxford English Dictionary').  Since you evaluate an expression to
+perform an action, `execute' has evolved as a synonym to `evaluate'.)
+
+
+File: eintr,  Node: Parts of let Expression,  Next: Sample let Expression,  Prev: Prevent confusion,  Up: let
+
+3.6.1 The Parts of a `let' Expression
+-------------------------------------
+
+A `let' expression is a list of three parts.  The first part is the
+symbol `let'.  The second part is a list, called a "varlist", each
+element of which is either a symbol by itself or a two-element list,
+the first element of which is a symbol.  The third part of the `let'
+expression is the body of the `let'.  The body usually consists of one
+or more lists.
+
+A template for a `let' expression looks like this:
+
+     (let VARLIST BODY...)
+
+The symbols in the varlist are the variables that are given initial
+values by the `let' special form.  Symbols by themselves are given the
+initial value of `nil'; and each symbol that is the first element of a
+two-element list is bound to the value that is returned when the Lisp
+interpreter evaluates the second element.
+
+Thus, a varlist might look like this: `(thread (needles 3))'.  In this
+case, in a `let' expression, Emacs binds the symbol `thread' to an
+initial value of `nil', and binds the symbol `needles' to an initial
+value of 3.
+
+When you write a `let' expression, what you do is put the appropriate
+expressions in the slots of the `let' expression template.
+
+If the varlist is composed of two-element lists, as is often the case,
+the template for the `let' expression looks like this:
+
+     (let ((VARIABLE VALUE)
+           (VARIABLE VALUE)
+           ...)
+       BODY...)
+
+
+File: eintr,  Node: Sample let Expression,  Next: Uninitialized let Variables,  Prev: Parts of let Expression,  Up: let
+
+3.6.2 Sample `let' Expression
+-----------------------------
+
+The following expression creates and gives initial values to the two
+variables `zebra' and `tiger'.  The body of the `let' expression is a
+list which calls the `message' function.
+
+     (let ((zebra 'stripes)
+           (tiger 'fierce))
+       (message "One kind of animal has %s and another is %s."
+                zebra tiger))
+
+Here, the varlist is `((zebra 'stripes) (tiger 'fierce))'.
+
+The two variables are `zebra' and `tiger'.  Each variable is the first
+element of a two-element list and each value is the second element of
+its two-element list.  In the varlist, Emacs binds the variable `zebra'
+to the value `stripes'(1), and binds the variable `tiger' to the value
+`fierce'.  In this example, both values are symbols preceded by a
+quote.  The values could just as well have been another list or a
+string.  The body of the `let' follows after the list holding the
+variables.  In this example, the body is a list that uses the `message'
+function to print a string in the echo area.
+
+You may evaluate the example in the usual fashion, by placing the
+cursor after the last parenthesis and typing `C-x C-e'.  When you do
+this, the following will appear in the echo area:
+
+     "One kind of animal has stripes and another is fierce."
+
+As we have seen before, the `message' function prints its first
+argument, except for `%s'.  In this example, the value of the variable
+`zebra' is printed at the location of the first `%s' and the value of
+the variable `tiger' is printed at the location of the second `%s'.
+
+---------- Footnotes ----------
+
+(1) According to Jared Diamond in `Guns, Germs, and Steel', "... zebras
+become impossibly dangerous as they grow older" but the claim here is
+that they do not become fierce like a tiger.  (1997, W. W. Norton and
+Co., ISBN 0-393-03894-2, page 171)
+
+
+File: eintr,  Node: Uninitialized let Variables,  Prev: Sample let Expression,  Up: let
+
+3.6.3 Uninitialized Variables in a `let' Statement
+--------------------------------------------------
+
+If you do not bind the variables in a `let' statement to specific
+initial values, they will automatically be bound to an initial value of
+`nil', as in the following expression:
+
+     (let ((birch 3)
+           pine
+           fir
+           (oak 'some))
+       (message
+        "Here are %d variables with %s, %s, and %s value."
+        birch pine fir oak))
+
+Here, the varlist is `((birch 3) pine fir (oak 'some))'.
+
+If you evaluate this expression in the usual way, the following will
+appear in your echo area:
+
+     "Here are 3 variables with nil, nil, and some value."
+
+In this example, Emacs binds the symbol `birch' to the number 3, binds
+the symbols `pine' and `fir' to `nil', and binds the symbol `oak' to
+the value `some'.
+
+Note that in the first part of the `let', the variables `pine' and
+`fir' stand alone as atoms that are not surrounded by parentheses; this
+is because they are being bound to `nil', the empty list.  But `oak' is
+bound to `some' and so is a part of the list `(oak 'some)'.  Similarly,
+`birch' is bound to the number 3 and so is in a list with that number.
+(Since a number evaluates to itself, the number does not need to be
+quoted.  Also, the number is printed in the message using a `%d' rather
+than a `%s'.)  The four variables as a group are put into a list to
+delimit them from the body of the `let'.
+
+
+File: eintr,  Node: if,  Next: else,  Prev: let,  Up: Writing Defuns
+
+3.7 The `if' Special Form
+=========================
+
+A third special form, in addition to `defun' and `let', is the
+conditional `if'.  This form is used to instruct the computer to make
+decisions.  You can write function definitions without using `if', but
+it is used often enough, and is important enough, to be included here.
+It is used, for example, in the code for the function
+`beginning-of-buffer'.
+
+The basic idea behind an `if', is that "_if_ a test is true, _then_ an
+expression is evaluated."  If the test is not true, the expression is
+not evaluated.  For example, you might make a decision such as, "if it
+is warm and sunny, then go to the beach!"
+
+* Menu:
+
+* if in more detail::
+* type-of-animal in detail::
+
+
+File: eintr,  Node: if in more detail,  Next: type-of-animal in detail,  Prev: if,  Up: if
+
+`if' in more detail
+-------------------
+
+An `if' expression written in Lisp does not use the word `then'; the
+test and the action are the second and third elements of the list whose
+first element is `if'.  Nonetheless, the test part of an `if'
+expression is often called the "if-part" and the second argument is
+often called the "then-part".
+
+Also, when an `if' expression is written, the true-or-false-test is
+usually written on the same line as the symbol `if', but the action to
+carry out if the test is true, the "then-part", is written on the
+second and subsequent lines.  This makes the `if' expression easier to
+read.
+
+     (if TRUE-OR-FALSE-TEST
+         ACTION-TO-CARRY-OUT-IF-TEST-IS-TRUE)
+
+The true-or-false-test will be an expression that is evaluated by the
+Lisp interpreter.
+
+Here is an example that you can evaluate in the usual manner.  The test
+is whether the number 5 is greater than the number 4.  Since it is, the
+message `5 is greater than 4!' will be printed.
+
+     (if (> 5 4)                             ; if-part
+         (message "5 is greater than 4!"))   ; then-part
+
+(The function `>' tests whether its first argument is greater than its
+second argument and returns true if it is.)  
+
+Of course, in actual use, the test in an `if' expression will not be
+fixed for all time as it is by the expression `(> 5 4)'.  Instead, at
+least one of the variables used in the test will be bound to a value
+that is not known ahead of time.  (If the value were known ahead of
+time, we would not need to run the test!)
+
+For example, the value may be bound to an argument of a function
+definition.  In the following function definition, the character of the
+animal is a value that is passed to the function.  If the value bound to
+`characteristic' is `fierce', then the message, `It's a tiger!' will be
+printed; otherwise, `nil' will be returned.
+
+     (defun type-of-animal (characteristic)
+       "Print message in echo area depending on CHARACTERISTIC.
+     If the CHARACTERISTIC is the symbol `fierce',
+     then warn of a tiger."
+       (if (equal characteristic 'fierce)
+           (message "It's a tiger!")))
+
+If you are reading this inside of GNU Emacs, you can evaluate the
+function definition in the usual way to install it in Emacs, and then
+you can evaluate the following two expressions to see the results:
+
+     (type-of-animal 'fierce)
+
+     (type-of-animal 'zebra)
+
+When you evaluate `(type-of-animal 'fierce)', you will see the
+following message printed in the echo area: `"It's a tiger!"'; and when
+you evaluate `(type-of-animal 'zebra)' you will see `nil' printed in
+the echo area.
+
+
+File: eintr,  Node: type-of-animal in detail,  Prev: if in more detail,  Up: if
+
+3.7.1 The `type-of-animal' Function in Detail
+---------------------------------------------
+
+Let's look at the `type-of-animal' function in detail.
+
+The function definition for `type-of-animal' was written by filling the
+slots of two templates, one for a function definition as a whole, and a
+second for an `if' expression.
+
+The template for every function that is not interactive is:
+
+     (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
+       "DOCUMENTATION..."
+       BODY...)
+
+The parts of the function that match this template look like this:
+
+     (defun type-of-animal (characteristic)
+       "Print message in echo area depending on CHARACTERISTIC.
+     If the CHARACTERISTIC is the symbol `fierce',
+     then warn of a tiger."
+       BODY: THE `if' EXPRESSION)
+
+The name of function is `type-of-animal'; it is passed the value of one
+argument.  The argument list is followed by a multi-line documentation
+string.  The documentation string is included in the example because it
+is a good habit to write documentation string for every function
+definition.  The body of the function definition consists of the `if'
+expression.
+
+The template for an `if' expression looks like this:
+
+     (if TRUE-OR-FALSE-TEST
+         ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE)
+
+In the `type-of-animal' function, the code for the `if' looks like this:
+
+     (if (equal characteristic 'fierce)
+         (message "It's a tiger!")))
+
+Here, the true-or-false-test is the expression:
+
+     (equal characteristic 'fierce)
+
+In Lisp, `equal' is a function that determines whether its first
+argument is equal to its second argument.  The second argument is the
+quoted symbol `'fierce' and the first argument is the value of the
+symbol `characteristic'--in other words, the argument passed to this
+function.
+
+In the first exercise of `type-of-animal', the argument `fierce' is
+passed to `type-of-animal'.  Since `fierce' is equal to `fierce', the
+expression, `(equal characteristic 'fierce)', returns a value of true.
+When this happens, the `if' evaluates the second argument or then-part
+of the `if': `(message "It's tiger!")'.
+
+On the other hand, in the second exercise of `type-of-animal', the
+argument `zebra' is passed to `type-of-animal'.  `zebra' is not equal
+to `fierce', so the then-part is not evaluated and `nil' is returned by
+the `if' expression.
+
+
+File: eintr,  Node: else,  Next: Truth & Falsehood,  Prev: if,  Up: Writing Defuns
+
+3.8 If-then-else Expressions
+============================
+
+An `if' expression may have an optional third argument, called the
+"else-part", for the case when the true-or-false-test returns false.
+When this happens, the second argument or then-part of the overall `if'
+expression is _not_ evaluated, but the third or else-part _is_
+evaluated.  You might think of this as the cloudy day alternative for
+the decision "if it is warm and sunny, then go to the beach, else read
+a book!".
+
+The word "else" is not written in the Lisp code; the else-part of an
+`if' expression comes after the then-part.  In the written Lisp, the
+else-part is usually written to start on a line of its own and is
+indented less than the then-part:
+
+     (if TRUE-OR-FALSE-TEST
+         ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE
+       ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-FALSE)
+
+For example, the following `if' expression prints the message `4 is not
+greater than 5!' when you evaluate it in the usual way:
+
+     (if (> 4 5)                             ; if-part
+         (message "5 is greater than 4!")    ; then-part
+       (message "4 is not greater than 5!")) ; else-part
+
+Note that the different levels of indentation make it easy to
+distinguish the then-part from the else-part.  (GNU Emacs has several
+commands that automatically indent `if' expressions correctly.  *Note
+GNU Emacs Helps You Type Lists: Typing Lists.)
+
+We can extend the `type-of-animal' function to include an else-part by
+simply incorporating an additional part to the `if' expression.
+
+You can see the consequences of doing this if you evaluate the following
+version of the `type-of-animal' function definition to install it and
+then evaluate the two subsequent expressions to pass different
+arguments to the function.
+
+     (defun type-of-animal (characteristic)  ; Second version.
+       "Print message in echo area depending on CHARACTERISTIC.
+     If the CHARACTERISTIC is the symbol `fierce',
+     then warn of a tiger;
+     else say it's not fierce."
+       (if (equal characteristic 'fierce)
+           (message "It's a tiger!")
+         (message "It's not fierce!")))
+
+
+     (type-of-animal 'fierce)
+
+     (type-of-animal 'zebra)
+
+When you evaluate `(type-of-animal 'fierce)', you will see the
+following message printed in the echo area: `"It's a tiger!"'; but when
+you evaluate `(type-of-animal 'zebra)', you will see `"It's not
+fierce!"'.
+
+(Of course, if the CHARACTERISTIC were `ferocious', the message `"It's
+not fierce!"' would be printed; and it would be misleading!  When you
+write code, you need to take into account the possibility that some
+such argument will be tested by the `if' and write your program
+accordingly.)
+
+
+File: eintr,  Node: Truth & Falsehood,  Next: save-excursion,  Prev: else,  Up: Writing Defuns
+
+3.9 Truth and Falsehood in Emacs Lisp
+=====================================
+
+There is an important aspect to the truth test in an `if' expression.
+So far, we have spoken of `true' and `false' as values of predicates as
+if they were new kinds of Emacs Lisp objects.  In fact, `false' is just
+our old friend `nil'.  Anything else--anything at all--is `true'.
+
+The expression that tests for truth is interpreted as "true" if the
+result of evaluating it is a value that is not `nil'.  In other words,
+the result of the test is considered true if the value returned is a
+number such as 47, a string such as `"hello"', or a symbol (other than
+`nil') such as `flowers', or a list (so long as it is not empty), or
+even a buffer!
+
+* Menu:
+
+* nil explained::
+
+
+File: eintr,  Node: nil explained,  Prev: Truth & Falsehood,  Up: Truth & Falsehood
+
+An explanation of `nil'
+-----------------------
+
+Before illustrating a test for truth, we need an explanation of `nil'.
+
+In Emacs Lisp, the symbol `nil' has two meanings.  First, it means the
+empty list.  Second, it means false and is the value returned when a
+true-or-false-test tests false.  `nil' can be written as an empty list,
+`()', or as `nil'.  As far as the Lisp interpreter is concerned, `()'
+and `nil' are the same.  Humans, however, tend to use `nil' for false
+and `()' for the empty list.
+
+In Emacs Lisp, any value that is not `nil'--is not the empty list--is
+considered true.  This means that if an evaluation returns something
+that is not an empty list, an `if' expression will test true.  For
+example, if a number is put in the slot for the test, it will be
+evaluated and will return itself, since that is what numbers do when
+evaluated.  In this conditional, the `if' expression will test true.
+The expression tests false only when `nil', an empty list, is returned
+by evaluating the expression.
+
+You can see this by evaluating the two expressions in the following
+examples.
+
+In the first example, the number 4 is evaluated as the test in the `if'
+expression and returns itself; consequently, the then-part of the
+expression is evaluated and returned: `true' appears in the echo area.
+In the second example, the `nil' indicates false; consequently, the
+else-part of the expression is evaluated and returned: `false' appears
+in the echo area.
+
+     (if 4
+         'true
+       'false)
+
+     (if nil
+         'true
+       'false)
+
+Incidentally, if some other useful value is not available for a test
+that returns true, then the Lisp interpreter will return the symbol `t'
+for true.  For example, the expression `(> 5 4)' returns `t' when
+evaluated, as you can see by evaluating it in the usual way:
+
+     (> 5 4)
+
+On the other hand, this function returns `nil' if the test is false.
+
+     (> 4 5)
+
+
+File: eintr,  Node: save-excursion,  Next: Review,  Prev: Truth & Falsehood,  Up: Writing Defuns
+
+3.10 `save-excursion'
+=====================
+
+The `save-excursion' function is the fourth and final special form that
+we will discuss in this chapter.
+
+In Emacs Lisp programs used for editing, the `save-excursion' function
+is very common.  It saves the location of point and mark, executes the
+body of the function, and then restores point and mark to their
+previous positions if their locations were changed.  Its primary
+purpose is to keep the user from being surprised and disturbed by
+unexpected movement of point or mark.
+
+* Menu:
+
+* Point and mark::
+* Template for save-excursion::
+
+
+File: eintr,  Node: Point and mark,  Next: Template for save-excursion,  Prev: save-excursion,  Up: save-excursion
+
+Point and Mark
+--------------
+
+Before discussing `save-excursion', however, it may be useful first to
+review what point and mark are in GNU Emacs.  "Point" is the current
+location of the cursor.  Wherever the cursor is, that is point.  More
+precisely, on terminals where the cursor appears to be on top of a
+character, point is immediately before the character.  In Emacs Lisp,
+point is an integer.  The first character in a buffer is number one,
+the second is number two, and so on.  The function `point' returns the
+current position of the cursor as a number.  Each buffer has its own
+value for point.
+
+The "mark" is another position in the buffer; its value can be set with
+a command such as `C-<SPC>' (`set-mark-command').  If a mark has been
+set, you can use the command `C-x C-x' (`exchange-point-and-mark') to
+cause the cursor to jump to the mark and set the mark to be the
+previous position of point.  In addition, if you set another mark, the
+position of the previous mark is saved in the mark ring.  Many mark
+positions can be saved this way.  You can jump the cursor to a saved
+mark by typing `C-u C-<SPC>' one or more times.
+
+The part of the buffer between point and mark is called "the region".
+Numerous commands work on the region, including `center-region',
+`count-lines-region', `kill-region', and `print-region'.
+
+The `save-excursion' special form saves the locations of point and mark
+and restores those positions after the code within the body of the
+special form is evaluated by the Lisp interpreter.  Thus, if point were
+in the beginning of a piece of text and some code moved point to the end
+of the buffer, the `save-excursion' would put point back to where it
+was before, after the expressions in the body of the function were
+evaluated.
+
+In Emacs, a function frequently moves point as part of its internal
+workings even though a user would not expect this.  For example,
+`count-lines-region' moves point.  To prevent the user from being
+bothered by jumps that are both unexpected and (from the user's point of
+view) unnecessary, `save-excursion' is often used to keep point and
+mark in the location expected by the user.  The use of `save-excursion'
+is good housekeeping.
+
+To make sure the house stays clean, `save-excursion' restores the
+values of point and mark even if something goes wrong in the code inside
+of it (or, to be more precise and to use the proper jargon, "in case of
+abnormal exit").  This feature is very helpful.
+
+In addition to recording the values of point and mark, `save-excursion'
+keeps track of the current buffer, and restores it, too.  This means
+you can write code that will change the buffer and have
+`save-excursion' switch you back to the original buffer.  This is how
+`save-excursion' is used in `append-to-buffer'.  (*Note The Definition
+of `append-to-buffer': append-to-buffer.)
+
+
+File: eintr,  Node: Template for save-excursion,  Prev: Point and mark,  Up: save-excursion
+
+3.10.1 Template for a `save-excursion' Expression
+-------------------------------------------------
+
+The template for code using `save-excursion' is simple:
+
+     (save-excursion
+       BODY...)
+
+The body of the function is one or more expressions that will be
+evaluated in sequence by the Lisp interpreter.  If there is more than
+one expression in the body, the value of the last one will be returned
+as the value of the `save-excursion' function.  The other expressions
+in the body are evaluated only for their side effects; and
+`save-excursion' itself is used only for its side effect (which is
+restoring the positions of point and mark).
+
+In more detail, the template for a `save-excursion' expression looks
+like this:
+
+     (save-excursion
+       FIRST-EXPRESSION-IN-BODY
+       SECOND-EXPRESSION-IN-BODY
+       THIRD-EXPRESSION-IN-BODY
+        ...
+       LAST-EXPRESSION-IN-BODY)
+
+An expression, of course, may be a symbol on its own or a list.
+
+In Emacs Lisp code, a `save-excursion' expression often occurs within
+the body of a `let' expression.  It looks like this:
+
+     (let VARLIST
+       (save-excursion
+         BODY...))
+
+
+File: eintr,  Node: Review,  Next: defun Exercises,  Prev: save-excursion,  Up: Writing Defuns
+
+3.11 Review
+===========
+
+In the last few chapters we have introduced a fair number of functions
+and special forms.  Here they are described in brief, along with a few
+similar functions that have not been mentioned yet.
+
+`eval-last-sexp'
+     Evaluate the last symbolic expression before the current location
+     of point.  The value is printed in the echo area unless the
+     function is invoked with an argument; in that case, the output is
+     printed in the current buffer.  This command is normally bound to
+     `C-x C-e'.
+
+`defun'
+     Define function.  This special form has up to five parts: the name,
+     a template for the arguments that will be passed to the function,
+     documentation, an optional interactive declaration, and the body
+     of the definition.
+
+     For example, in an early version of Emacs, the function definition
+     was as follows.  (It is slightly more complex now that it seeks
+     the first non-whitespace character rather than the first visible
+     character.)
+
+          (defun back-to-indentation ()
+            "Move point to first visible character on line."
+            (interactive)
+            (beginning-of-line 1)
+            (skip-chars-forward " \t"))
+
+`interactive'
+     Declare to the interpreter that the function can be used
+     interactively.  This special form may be followed by a string with
+     one or more parts that pass the information to the arguments of the
+     function, in sequence.  These parts may also tell the interpreter
+     to prompt for information.  Parts of the string are separated by
+     newlines, `\n'.
+
+     Common code characters are:
+
+    `b'
+          The name of an existing buffer.
+
+    `f'
+          The name of an existing file.
+
+    `p'
+          The numeric prefix argument.  (Note that this `p' is lower
+          case.)
+
+    `r'
+          Point and the mark, as two numeric arguments, smallest first.
+          This is the only code letter that specifies two successive
+          arguments rather than one.
+
+     *Note Code Characters for `interactive': (elisp)Interactive Codes,
+     for a complete list of code characters.
+
+`let'
+     Declare that a list of variables is for use within the body of the
+     `let' and give them an initial value, either `nil' or a specified
+     value; then evaluate the rest of the expressions in the body of
+     the `let' and return the value of the last one.  Inside the body
+     of the `let', the Lisp interpreter does not see the values of the
+     variables of the same names that are bound outside of the `let'.
+
+     For example,
+
+          (let ((foo (buffer-name))
+                (bar (buffer-size)))
+            (message
+             "This buffer is %s and has %d characters."
+             foo bar))
+
+`save-excursion'
+     Record the values of point and mark and the current buffer before
+     evaluating the body of this special form.  Restore the values of
+     point and mark and buffer afterward.
+
+     For example,
+
+          (message "We are %d characters into this buffer."
+                   (- (point)
+                      (save-excursion
+                        (goto-char (point-min)) (point))))
+
+`if'
+     Evaluate the first argument to the function; if it is true,
+     evaluate the second argument; else evaluate the third argument, if
+     there is one.
+
+     The `if' special form is called a "conditional".  There are other
+     conditionals in Emacs Lisp, but `if' is perhaps the most commonly
+     used.
+
+     For example,
+
+          (if (string-equal
+               (number-to-string 22)
+               (substring (emacs-version) 10 12))
+              (message "This is version 22 Emacs")
+            (message "This is not version 22 Emacs"))
+
+`equal'
+`eq'
+     Test whether two objects are the same.  `equal' uses one meaning
+     of the word `same' and `eq' uses another:  `equal' returns true if
+     the two objects have a similar structure and contents, such as two
+     copies of the same book.  On the other hand, `eq', returns true if
+     both arguments are actually the same object.  
+
+`<'
+`>'
+`<='
+`>='
+     The `<' function tests whether its first argument is smaller than
+     its second argument.  A corresponding function, `>', tests whether
+     the first argument is greater than the second.  Likewise, `<='
+     tests whether the first argument is less than or equal to the
+     second and `>=' tests whether the first argument is greater than
+     or equal to the second.  In all cases, both arguments must be
+     numbers or markers (markers indicate positions in buffers).
+
+`string<'
+`string-lessp'
+`string='
+`string-equal'
+     The `string-lessp' function tests whether its first argument is
+     smaller than the second argument.  A shorter, alternative name for
+     the same function (a `defalias') is `string<'.
+
+     The arguments to `string-lessp' must be strings or symbols; the
+     ordering is lexicographic, so case is significant.  The print
+     names of symbols are used instead of the symbols themselves.
+
+     An empty string, `""', a string with no characters in it, is
+     smaller than any string of characters.
+
+     `string-equal' provides the corresponding test for equality.  Its
+     shorter, alternative name is `string='.  There are no string test
+     functions that correspond to >, `>=', or `<='.
+
+`message'
+     Print a message in the echo area. The first argument is a string
+     that can contain `%s', `%d', or `%c' to print the value of
+     arguments that follow the string.  The argument used by `%s' must
+     be a string or a symbol; the argument used by `%d' must be a
+     number.  The argument used by `%c' must be an ASCII code number;
+     it will be printed as the character with that ASCII code.
+     (Various other %-sequences have not been mentioned.)
+
+`setq'
+`set'
+     The `setq' function sets the value of its first argument to the
+     value of the second argument.  The first argument is automatically
+     quoted by `setq'.  It does the same for succeeding pairs of
+     arguments.  Another function, `set', takes only two arguments and
+     evaluates both of them before setting the value returned by its
+     first argument to the value returned by its second argument.
+
+`buffer-name'
+     Without an argument, return the name of the buffer, as a string.
+
+`buffer-file-name'
+     Without an argument, return the name of the file the buffer is
+     visiting.
+
+`current-buffer'
+     Return the buffer in which Emacs is active; it may not be the
+     buffer that is visible on the screen.
+
+`other-buffer'
+     Return the most recently selected buffer (other than the buffer
+     passed to `other-buffer' as an argument and other than the current
+     buffer).
+
+`switch-to-buffer'
+     Select a buffer for Emacs to be active in and display it in the
+     current window so users can look at it.  Usually bound to `C-x b'.
+
+`set-buffer'
+     Switch Emacs' attention to a buffer on which programs will run.
+     Don't alter what the window is showing.
+
+`buffer-size'
+     Return the number of characters in the current buffer.
+
+`point'
+     Return the value of the current position of the cursor, as an
+     integer counting the number of characters from the beginning of the
+     buffer.
+
+`point-min'
+     Return the minimum permissible value of point in the current
+     buffer.  This is 1, unless narrowing is in effect.
+
+`point-max'
+     Return the value of the maximum permissible value of point in the
+     current buffer.  This is the end of the buffer, unless narrowing
+     is in effect.
+
+
+File: eintr,  Node: defun Exercises,  Prev: Review,  Up: Writing Defuns
+
+3.12 Exercises
+==============
+
+   * Write a non-interactive function that doubles the value of its
+     argument, a number.  Make that function interactive.
+
+   * Write a function that tests whether the current value of
+     `fill-column' is greater than the argument passed to the function,
+     and if so, prints an appropriate message.
+
+
+File: eintr,  Node: Buffer Walk Through,  Next: More Complex,  Prev: Writing Defuns,  Up: Top
+
+4 A Few Buffer-Related Functions
+********************************
+
+In this chapter we study in detail several of the functions used in GNU
+Emacs.  This is called a "walk-through".  These functions are used as
+examples of Lisp code, but are not imaginary examples; with the
+exception of the first, simplified function definition, these functions
+show the actual code used in GNU Emacs.  You can learn a great deal from
+these definitions.  The functions described here are all related to
+buffers.  Later, we will study other functions.
+
+* Menu:
+
+* Finding More::
+* simplified-beginning-of-buffer::
+* mark-whole-buffer::
+* append-to-buffer::
+* Buffer Related Review::
+* Buffer Exercises::
+
+
+File: eintr,  Node: Finding More,  Next: simplified-beginning-of-buffer,  Prev: Buffer Walk Through,  Up: Buffer Walk Through
+
+4.1 Finding More Information
+============================
+
+In this walk-through, I will describe each new function as we come to
+it, sometimes in detail and sometimes briefly.  If you are interested,
+you can get the full documentation of any Emacs Lisp function at any
+time by typing `C-h f' and then the name of the function (and then
+<RET>).  Similarly, you can get the full documentation for a variable
+by typing `C-h v' and then the name of the variable (and then <RET>).
+
+When a function is written in Emacs Lisp, `describe-function' will also
+tell you the location of the function definition.
+
+Put point into the name of the file that contains the function and
+press the <RET> key.  In this case, <RET> means `push-button' rather
+than `return' or `enter'.  Emacs will take you directly to the function
+definition.
+
+More generally, if you want to see a function in its original source
+file, you can use the `find-tags' function to jump to it.  `find-tags'
+works with a wide variety of languages, not just Lisp, and C, and it
+works with non-programming text as well.  For example, `find-tags' will
+jump to the various nodes in the Texinfo source file of this document.
+
+The `find-tags' function depends on `tags tables' that record the
+locations of the functions, variables, and other items to which
+`find-tags' jumps.
+
+To use the `find-tags' command, type `M-.'  (i.e., press the period key
+while holding down the <META> key, or else type the <ESC> key and then
+type the period key), and then, at the prompt, type in the name of the
+function whose source code you want to see, such as
+`mark-whole-buffer', and then type <RET>.  Emacs will switch buffers
+and display the source code for the function on your screen.  To switch
+back to your current buffer, type `C-x b <RET>'.  (On some keyboards,
+the <META> key is labelled <ALT>.)
+
+Depending on how the initial default values of your copy of Emacs are
+set, you may also need to specify the location of your `tags table',
+which is a file called `TAGS'.  For example, if you are interested in
+Emacs sources, the tags table you will most likely want, if it has
+already been created for you, will be in a subdirectory of the
+`/usr/local/share/emacs/' directory; thus you would use the `M-x
+visit-tags-table' command and specify a pathname such as
+`/usr/local/share/emacs/22.0.100/lisp/TAGS'.  If the tags table has not
+already been created, you will have to create it yourself.  It will in
+a file such as `/usr/local/src/emacs/src/TAGS'.
+
+To create a `TAGS' file in a specific directory, switch to that
+directory in Emacs using `M-x cd' command, or list the directory with
+`C-x d' (`dired').  Then run the compile command, with `etags *.el' as
+the command to execute:
+
+     M-x compile RET etags *.el RET
+
+For more information, see *Note Create Your Own `TAGS' File: etags.
+
+After you become more familiar with Emacs Lisp, you will find that you
+will frequently use `find-tags' to navigate your way around source code;
+and you will create your own `TAGS' tables.
+
+Incidentally, the files that contain Lisp code are conventionally
+called "libraries".  The metaphor is derived from that of a specialized
+library, such as a law library or an engineering library, rather than a
+general library.  Each library, or file, contains functions that relate
+to a particular topic or activity, such as `abbrev.el' for handling
+abbreviations and other typing shortcuts, and `help.el' for on-line
+help.  (Sometimes several libraries provide code for a single activity,
+as the various `rmail...' files provide code for reading electronic
+mail.)  In `The GNU Emacs Manual', you will see sentences such as "The
+`C-h p' command lets you search the standard Emacs Lisp libraries by
+topic keywords."
+
+
+File: eintr,  Node: simplified-beginning-of-buffer,  Next: mark-whole-buffer,  Prev: Finding More,  Up: Buffer Walk Through
+
+4.2 A Simplified `beginning-of-buffer' Definition
+=================================================
+
+The `beginning-of-buffer' command is a good function to start with
+since you are likely to be familiar with it and it is easy to
+understand.  Used as an interactive command, `beginning-of-buffer'
+moves the cursor to the beginning of the buffer, leaving the mark at the
+previous position.  It is generally bound to `M-<'.
+
+In this section, we will discuss a shortened version of the function
+that shows how it is most frequently used.  This shortened function
+works as written, but it does not contain the code for a complex option.
+In another section, we will describe the entire function.  (*Note
+Complete Definition of `beginning-of-buffer': beginning-of-buffer.)
+
+Before looking at the code, let's consider what the function definition
+has to contain: it must include an expression that makes the function
+interactive so it can be called by typing `M-x beginning-of-buffer' or
+by typing a keychord such as `M-<'; it must include code to leave a
+mark at the original position in the buffer; and it must include code
+to move the cursor to the beginning of the buffer.
+
+Here is the complete text of the shortened version of the function:
+
+     (defun simplified-beginning-of-buffer ()
+       "Move point to the beginning of the buffer;
+     leave mark at previous position."
+       (interactive)
+       (push-mark)
+       (goto-char (point-min)))
+
+Like all function definitions, this definition has five parts following
+the special form `defun':
+
+  1. The name: in this example, `simplified-beginning-of-buffer'.
+
+  2. A list of the arguments: in this example, an empty list, `()',
+
+  3. The documentation string.
+
+  4. The interactive expression.
+
+  5. The body.
+
+In this function definition, the argument list is empty; this means that
+this function does not require any arguments.  (When we look at the
+definition for the complete function, we will see that it may be passed
+an optional argument.)
+
+The interactive expression tells Emacs that the function is intended to
+be used interactively.  In this example, `interactive' does not have an
+argument because `simplified-beginning-of-buffer' does not require one.
+
+The body of the function consists of the two lines:
+
+     (push-mark)
+     (goto-char (point-min))
+
+The first of these lines is the expression, `(push-mark)'.  When this
+expression is evaluated by the Lisp interpreter, it sets a mark at the
+current position of the cursor, wherever that may be.  The position of
+this mark is saved in the mark ring.
+
+The next line is `(goto-char (point-min))'.  This expression jumps the
+cursor to the minimum point in the buffer, that is, to the beginning of
+the buffer (or to the beginning of the accessible portion of the buffer
+if it is narrowed.  *Note Narrowing and Widening: Narrowing & Widening.)
+
+The `push-mark' command sets a mark at the place where the cursor was
+located before it was moved to the beginning of the buffer by the
+`(goto-char (point-min))' expression.  Consequently, you can, if you
+wish, go back to where you were originally by typing `C-x C-x'.
+
+That is all there is to the function definition!
+
+When you are reading code such as this and come upon an unfamiliar
+function, such as `goto-char', you can find out what it does by using
+the `describe-function' command.  To use this command, type `C-h f' and
+then type in the name of the function and press <RET>.  The
+`describe-function' command will print the function's documentation
+string in a `*Help*' window.  For example, the documentation for
+`goto-char' is:
+
+     Set point to POSITION, a number or marker.
+     Beginning of buffer is position (point-min), end is (point-max).
+
+The function's one argument is the desired position.
+
+(The prompt for `describe-function' will offer you the symbol under or
+preceding the cursor, so you can save typing by positioning the cursor
+right over or after the function and then typing `C-h f <RET>'.)
+
+The `end-of-buffer' function definition is written in the same way as
+the `beginning-of-buffer' definition except that the body of the
+function contains the expression `(goto-char (point-max))' in place of
+`(goto-char (point-min))'.
+
+
+File: eintr,  Node: mark-whole-buffer,  Next: append-to-buffer,  Prev: simplified-beginning-of-buffer,  Up: Buffer Walk Through
+
+4.3 The Definition of `mark-whole-buffer'
+=========================================
+
+The `mark-whole-buffer' function is no harder to understand than the
+`simplified-beginning-of-buffer' function.  In this case, however, we
+will look at the complete function, not a shortened version.
+
+The `mark-whole-buffer' function is not as commonly used as the
+`beginning-of-buffer' function, but is useful nonetheless: it marks a
+whole buffer as a region by putting point at the beginning and a mark
+at the end of the buffer.  It is generally bound to `C-x h'.
+
+* Menu:
+
+* mark-whole-buffer overview::
+* Body of mark-whole-buffer::
+
+
+File: eintr,  Node: mark-whole-buffer overview,  Next: Body of mark-whole-buffer,  Prev: mark-whole-buffer,  Up: mark-whole-buffer
+
+An overview of `mark-whole-buffer'
+----------------------------------
+
+In GNU Emacs 22, the code for the complete function looks like this:
+
+     (defun mark-whole-buffer ()
+       "Put point at beginning and mark at end of buffer.
+     You probably should not use this function in Lisp programs;
+     it is usually a mistake for a Lisp function to use any subroutine
+     that uses or sets the mark."
+       (interactive)
+       (push-mark (point))
+       (push-mark (point-max) nil t)
+       (goto-char (point-min)))
+
+Like all other functions, the `mark-whole-buffer' function fits into
+the template for a function definition.  The template looks like this:
+
+     (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
+       "DOCUMENTATION..."
+       (INTERACTIVE-EXPRESSION...)
+       BODY...)
+
+Here is how the function works: the name of the function is
+`mark-whole-buffer'; it is followed by an empty argument list, `()',
+which means that the function does not require arguments.  The
+documentation comes next.
+
+The next line is an `(interactive)' expression that tells Emacs that
+the function will be used interactively.  These details are similar to
+the `simplified-beginning-of-buffer' function described in the previous
+section.
+
+
+File: eintr,  Node: Body of mark-whole-buffer,  Prev: mark-whole-buffer overview,  Up: mark-whole-buffer
+
+4.3.1 Body of `mark-whole-buffer'
+---------------------------------
+
+The body of the `mark-whole-buffer' function consists of three lines of
+code:
+
+     (push-mark (point))
+     (push-mark (point-max) nil t)
+     (goto-char (point-min))
+
+The first of these lines is the expression, `(push-mark (point))'.
+
+This line does exactly the same job as the first line of the body of
+the `simplified-beginning-of-buffer' function, which is written
+`(push-mark)'.  In both cases, the Lisp interpreter sets a mark at the
+current position of the cursor.
+
+I don't know why the expression in `mark-whole-buffer' is written
+`(push-mark (point))' and the expression in `beginning-of-buffer' is
+written `(push-mark)'.  Perhaps whoever wrote the code did not know
+that the arguments for `push-mark' are optional and that if `push-mark'
+is not passed an argument, the function automatically sets mark at the
+location of point by default.  Or perhaps the expression was written so
+as to parallel the structure of the next line.  In any case, the line
+causes Emacs to determine the position of point and set a mark there.
+
+In earlier versions of GNU Emacs, the next line of `mark-whole-buffer'
+was `(push-mark (point-max))'.  This expression sets a mark at the
+point in the buffer that has the highest number.  This will be the end
+of the buffer (or, if the buffer is narrowed, the end of the accessible
+portion of the buffer.  *Note Narrowing and Widening: Narrowing &
+Widening, for more about narrowing.)  After this mark has been set, the
+previous mark, the one set at point, is no longer set, but Emacs
+remembers its position, just as all other recent marks are always
+remembered.  This means that you can, if you wish, go back to that
+position by typing `C-u C-<SPC>' twice.
+
+In GNU Emacs 22, the `(point-max)' is slightly more complicated.  The
+line reads
+
+     (push-mark (point-max) nil t)
+
+The expression works nearly the same as before.  It sets a mark at the
+highest numbered place in the buffer that it can.  However, in this
+version, `push-mark' has two additional arguments.  The second argument
+to `push-mark' is `nil'.  This tells the function it _should_ display a
+message that says `Mark set' when it pushes the mark.  The third
+argument is `t'.  This tells `push-mark' to activate the mark when
+Transient Mark mode is turned on.  Transient Mark mode highlights the
+currently active region.  It is often turned off.
+
+Finally, the last line of the function is `(goto-char (point-min)))'.
+This is written exactly the same way as it is written in
+`beginning-of-buffer'.  The expression moves the cursor to the minimum
+point in the buffer, that is, to the beginning of the buffer (or to the
+beginning of the accessible portion of the buffer).  As a result of
+this, point is placed at the beginning of the buffer and mark is set at
+the end of the buffer.  The whole buffer is, therefore, the region.
+
+
+File: eintr,  Node: append-to-buffer,  Next: Buffer Related Review,  Prev: mark-whole-buffer,  Up: Buffer Walk Through
+
+4.4 The Definition of `append-to-buffer'
+========================================
+
+The `append-to-buffer' command is more complex than the
+`mark-whole-buffer' command.  What it does is copy the region (that is,
+the part of the buffer between point and mark) from the current buffer
+to a specified buffer.
+
+* Menu:
+
+* append-to-buffer overview::
+* append interactive::
+* append-to-buffer body::
+* append save-excursion::
+
+
+File: eintr,  Node: append-to-buffer overview,  Next: append interactive,  Prev: append-to-buffer,  Up: append-to-buffer
+
+An Overview of `append-to-buffer'
+---------------------------------
+
+The `append-to-buffer' command uses the `insert-buffer-substring'
+function to copy the region.  `insert-buffer-substring' is described by
+its name: it takes a string of characters from part of a buffer, a
+"substring", and inserts them into another buffer.
+
+Most of `append-to-buffer' is concerned with setting up the conditions
+for `insert-buffer-substring' to work: the code must specify both the
+buffer to which the text will go, the window it comes from and goes to,
+and the region that will be copied.
+
+Here is the complete text of the function:
+
+     (defun append-to-buffer (buffer start end)
+       "Append to specified buffer the text of the region.
+     It is inserted into that buffer before its point.
+
+     When calling from a program, give three arguments:
+     BUFFER (or buffer name), START and END.
+     START and END specify the portion of the current buffer to be copied."
+       (interactive
+        (list (read-buffer "Append to buffer: " (other-buffer
+                                                 (current-buffer) t))
+     	 (region-beginning) (region-end)))
+       (let ((oldbuf (current-buffer)))
+         (save-excursion
+           (let* ((append-to (get-buffer-create buffer))
+     	     (windows (get-buffer-window-list append-to t t))
+     	     point)
+     	(set-buffer append-to)
+     	(setq point (point))
+     	(barf-if-buffer-read-only)
+     	(insert-buffer-substring oldbuf start end)
+     	(dolist (window windows)
+     	  (when (= (window-point window) point)
+     	    (set-window-point window (point))))))))
+
+The function can be understood by looking at it as a series of
+filled-in templates.
+
+The outermost template is for the function definition.  In this
+function, it looks like this (with several slots filled in):
+
+     (defun append-to-buffer (buffer start end)
+       "DOCUMENTATION..."
+       (interactive ...)
+       BODY...)
+
+The first line of the function includes its name and three arguments.
+The arguments are the `buffer' to which the text will be copied, and
+the `start' and `end' of the region in the current buffer that will be
+copied.
+
+The next part of the function is the documentation, which is clear and
+complete.  As is conventional, the three arguments are written in upper
+case so you will notice them easily.  Even better, they are described
+in the same order as in the argument list.
+
+Note that the documentation distinguishes between a buffer and its
+name.  (The function can handle either.)
+
+
+File: eintr,  Node: append interactive,  Next: append-to-buffer body,  Prev: append-to-buffer overview,  Up: append-to-buffer
+
+4.4.1 The `append-to-buffer' Interactive Expression
+---------------------------------------------------
+
+Since the `append-to-buffer' function will be used interactively, the
+function must have an `interactive' expression.  (For a review of
+`interactive', see *Note Making a Function Interactive: Interactive.)
+The expression reads as follows:
+
+     (interactive
+        (list (read-buffer
+               "Append to buffer: "
+               (other-buffer (current-buffer) t))
+     	 (region-beginning)
+              (region-end)))
+
+This expression is not one with letters standing for parts, as
+described earlier.  Instead, it starts a list with thee parts.
+
+The first part of the list is an expression to read the name of a
+buffer and return it as a string.  That is `read-buffer'.  The function
+requires a prompt as its first argument, `"Append to buffer: "'.  Its
+second argument tells the command what value to provide if you don't
+specify anything.
+
+In this case that second argument is an expression containing the
+function `other-buffer', an exception, and a `t', standing for true.
+
+The first argument to `other-buffer', the exception, is yet another
+function, `current-buffer'.  That is not going to be returned.  The
+second argument is the symbol for true, `t'. that tells `other-buffer'
+that it may show visible buffers (except in this case, it will not show
+the current buffer, which makes sense).
+
+The expression looks like this:
+
+     (other-buffer (current-buffer) t)
+
+The second and third arguments to the `list' expression are
+`(region-beginning)' and `(region-end)'.  These two functions specify
+the beginning and end of the text to be appended.
+
+Originally, the command used the letters `B' and `r'.  The whole
+`interactive' expression looked like this:
+
+     (interactive "BAppend to buffer: \nr")
+
+But when that was done, the default value of the buffer switched to was
+invisible.  That was not wanted.
+
+(The prompt was separated from the second argument with a newline,
+`\n'.  It was followed by an `r' that told Emacs to bind the two
+arguments that follow the symbol `buffer' in the function's argument
+list (that is, `start' and `end') to the values of point and mark.
+That argument worked fine.)
+
+
+File: eintr,  Node: append-to-buffer body,  Next: append save-excursion,  Prev: append interactive,  Up: append-to-buffer
+
+4.4.2 The Body of `append-to-buffer'
+------------------------------------
+
+The body of the `append-to-buffer' function begins with `let'.
+
+As we have seen before (*note `let': let.), the purpose of a `let'
+expression is to create and give initial values to one or more
+variables that will only be used within the body of the `let'.  This
+means that such a variable will not be confused with any variable of
+the same name outside the `let' expression.
+
+We can see how the `let' expression fits into the function as a whole
+by showing a template for `append-to-buffer' with the `let' expression
+in outline:
+
+     (defun append-to-buffer (buffer start end)
+       "DOCUMENTATION..."
+       (interactive ...)
+       (let ((VARIABLE VALUE))
+             BODY...)
+
+The `let' expression has three elements:
+
+  1. The symbol `let';
+
+  2. A varlist containing, in this case, a single two-element list,
+     `(VARIABLE VALUE)';
+
+  3. The body of the `let' expression.
+
+In the `append-to-buffer' function, the varlist looks like this:
+
+     (oldbuf (current-buffer))
+
+In this part of the `let' expression, the one variable, `oldbuf', is
+bound to the value returned by the `(current-buffer)' expression.  The
+variable, `oldbuf', is used to keep track of the buffer in which you
+are working and from which you will copy.
+
+The element or elements of a varlist are surrounded by a set of
+parentheses so the Lisp interpreter can distinguish the varlist from
+the body of the `let'.  As a consequence, the two-element list within
+the varlist is surrounded by a circumscribing set of parentheses.  The
+line looks like this:
+
+     (let ((oldbuf (current-buffer)))
+       ... )
+
+The two parentheses before `oldbuf' might surprise you if you did not
+realize that the first parenthesis before `oldbuf' marks the boundary
+of the varlist and the second parenthesis marks the beginning of the
+two-element list, `(oldbuf (current-buffer))'.
+
+
+File: eintr,  Node: append save-excursion,  Prev: append-to-buffer body,  Up: append-to-buffer
+
+4.4.3 `save-excursion' in `append-to-buffer'
+--------------------------------------------
+
+The body of the `let' expression in `append-to-buffer' consists of a
+`save-excursion' expression.
+
+The `save-excursion' function saves the locations of point and mark,
+and restores them to those positions after the expressions in the body
+of the `save-excursion' complete execution.  In addition,
+`save-excursion' keeps track of the original buffer, and restores it.
+This is how `save-excursion' is used in `append-to-buffer'.
+
+Incidentally, it is worth noting here that a Lisp function is normally
+formatted so that everything that is enclosed in a multi-line spread is
+indented more to the right than the first symbol.  In this function
+definition, the `let' is indented more than the `defun', and the
+`save-excursion' is indented more than the `let', like this:
+
+     (defun ...
+       ...
+       ...
+       (let...
+         (save-excursion
+           ...
+
+This formatting convention makes it easy to see that the lines in the
+body of the `save-excursion' are enclosed by the parentheses associated
+with `save-excursion', just as the `save-excursion' itself is enclosed
+by the parentheses associated with the `let':
+
+     (let ((oldbuf (current-buffer)))
+       (save-excursion
+         ...
+         (set-buffer ...)
+         (insert-buffer-substring oldbuf start end)
+         ...))
+
+The use of the `save-excursion' function can be viewed as a process of
+filling in the slots of a template:
+
+     (save-excursion
+       FIRST-EXPRESSION-IN-BODY
+       SECOND-EXPRESSION-IN-BODY
+        ...
+       LAST-EXPRESSION-IN-BODY)
+
+In this function, the body of the `save-excursion' contains only one
+expression, the `let*' expression.  You know about a `let' function.
+The `let*' function is different.  It has a `*' in its name.  It
+enables Emacs to set each variable in its varlist in sequence, one
+after another.
+
+Its critical feature is that variables later in the varlist can make
+use of the values to which Emacs set variables earlier in the varlist.
+*Note The `let*' expression: fwd-para let.
+
+We will skip functions like `let*' and focus on two: the `set-buffer'
+function and the `insert-buffer-substring' function.
+
+In the old days, the `set-buffer' expression was simply
+
+     (set-buffer (get-buffer-create buffer))
+
+but now it is
+
+     (set-buffer append-to)
+
+`append-to' is bound to `(get-buffer-create buffer)' earlier on in the
+`let*' expression.  That extra binding would not be necessary except
+for that `append-to' is used later in the varlist as an argument to
+`get-buffer-window-list'.
+
+The `append-to-buffer' function definition inserts text from the buffer
+in which you are currently to a named buffer.  It happens that
+`insert-buffer-substring' copies text from another buffer to the
+current buffer, just the reverse--that is why the `append-to-buffer'
+definition starts out with a `let' that binds the local symbol `oldbuf'
+to the value returned by `current-buffer'.
+
+The `insert-buffer-substring' expression looks like this:
+
+     (insert-buffer-substring oldbuf start end)
+
+The `insert-buffer-substring' function copies a string _from_ the
+buffer specified as its first argument and inserts the string into the
+present buffer.  In this case, the argument to
+`insert-buffer-substring' is the value of the variable created and
+bound by the `let', namely the value of `oldbuf', which was the current
+buffer when you gave the `append-to-buffer' command.
+
+After `insert-buffer-substring' has done its work, `save-excursion'
+will restore the action to the original buffer and `append-to-buffer'
+will have done its job.
+
+Written in skeletal form, the workings of the body look like this:
+
+     (let (BIND-`oldbuf'-TO-VALUE-OF-`current-buffer')
+       (save-excursion                       ; Keep track of buffer.
+         CHANGE-BUFFER
+         INSERT-SUBSTRING-FROM-`oldbuf'-INTO-BUFFER)
+
+       CHANGE-BACK-TO-ORIGINAL-BUFFER-WHEN-FINISHED
+     LET-THE-LOCAL-MEANING-OF-`oldbuf'-DISAPPEAR-WHEN-FINISHED
+
+In summary, `append-to-buffer' works as follows: it saves the value of
+the current buffer in the variable called `oldbuf'.  It gets the new
+buffer (creating one if need be) and switches Emacs' attention to it.
+Using the value of `oldbuf', it inserts the region of text from the old
+buffer into the new buffer; and then using `save-excursion', it brings
+you back to your original buffer.
+
+In looking at `append-to-buffer', you have explored a fairly complex
+function.  It shows how to use `let' and `save-excursion', and how to
+change to and come back from another buffer.  Many function definitions
+use `let', `save-excursion', and `set-buffer' this way.
+
+
+File: eintr,  Node: Buffer Related Review,  Next: Buffer Exercises,  Prev: append-to-buffer,  Up: Buffer Walk Through
+
+4.5 Review
+==========
+
+Here is a brief summary of the various functions discussed in this
+chapter.
+
+`describe-function'
+`describe-variable'
+     Print the documentation for a function or variable.
+     Conventionally bound to `C-h f' and `C-h v'.
+
+`find-tag'
+     Find the file containing the source for a function or variable and
+     switch buffers to it, positioning point at the beginning of the
+     item.  Conventionally bound to `M-.' (that's a period following the
+     <META> key).
+
+`save-excursion'
+     Save the location of point and mark and restore their values after
+     the arguments to `save-excursion' have been evaluated.  Also,
+     remember the current buffer and return to it.
+
+`push-mark'
+     Set mark at a location and record the value of the previous mark
+     on the mark ring.  The mark is a location in the buffer that will
+     keep its relative position even if text is added to or removed
+     from the buffer.
+
+`goto-char'
+     Set point to the location specified by the value of the argument,
+     which can be a number, a marker,  or an expression that returns
+     the number of a position, such as `(point-min)'.
+
+`insert-buffer-substring'
+     Copy a region of text from a buffer that is passed to the function
+     as an argument and insert the region into the current buffer.
+
+`mark-whole-buffer'
+     Mark the whole buffer as a region.  Normally bound to `C-x h'.
+
+`set-buffer'
+     Switch the attention of Emacs to another buffer, but do not change
+     the window being displayed.  Used when the program rather than a
+     human is to work on a different buffer.
+
+`get-buffer-create'
+`get-buffer'
+     Find a named buffer or create one if a buffer of that name does not
+     exist.  The `get-buffer' function returns `nil' if the named
+     buffer does not exist.
+
+
+File: eintr,  Node: Buffer Exercises,  Prev: Buffer Related Review,  Up: Buffer Walk Through
+
+4.6 Exercises
+=============
+
+   * Write your own `simplified-end-of-buffer' function definition;
+     then test it to see whether it works.
+
+   * Use `if' and `get-buffer' to write a function that prints a
+     message telling you whether a buffer exists.
+
+   * Using `find-tag', find the source for the `copy-to-buffer'
+     function.
+
+
+File: eintr,  Node: More Complex,  Next: Narrowing & Widening,  Prev: Buffer Walk Through,  Up: Top
+
+5 A Few More Complex Functions
+******************************
+
+In this chapter, we build on what we have learned in previous chapters
+by looking at more complex functions.  The `copy-to-buffer' function
+illustrates use of two `save-excursion' expressions in one definition,
+while the `insert-buffer' function illustrates use of an asterisk in an
+`interactive' expression, use of `or', and the important distinction
+between a name and the object to which the name refers.
+
+* Menu:
+
+* copy-to-buffer::
+* insert-buffer::
+* beginning-of-buffer::
+* Second Buffer Related Review::
+* optional Exercise::
+
+
+File: eintr,  Node: copy-to-buffer,  Next: insert-buffer,  Prev: More Complex,  Up: More Complex
+
+5.1 The Definition of `copy-to-buffer'
+======================================
+
+After understanding how `append-to-buffer' works, it is easy to
+understand `copy-to-buffer'.  This function copies text into a buffer,
+but instead of adding to the second buffer, it replaces all the
+previous text in the second buffer.
+
+The body of `copy-to-buffer' looks like this,
+
+     ...
+     (interactive "BCopy to buffer: \nr")
+     (let ((oldbuf (current-buffer)))
+       (with-current-buffer (get-buffer-create buffer)
+         (barf-if-buffer-read-only)
+         (erase-buffer)
+         (save-excursion
+           (insert-buffer-substring oldbuf start end)))))
+
+The `copy-to-buffer' function has a simpler `interactive' expression
+than `append-to-buffer'.
+
+The definition then says
+
+     (with-current-buffer (get-buffer-create buffer) ...
+
+First, look at the earliest inner expression; that is evaluated first.
+That expression starts with `get-buffer-create buffer'.  The function
+tells the computer to use the buffer with the name specified as the one
+to which you are copying, or if such a buffer does not exist, to create
+it.  Then, the `with-current-buffer' function evaluates its body with
+that buffer temporarily current.
+
+(This demonstrates another way to shift the computer's attention but
+not the user's.  The `append-to-buffer' function showed how to do the
+same with `save-excursion' and `set-buffer'.  `with-current-buffer' is
+a newer, and arguably easier, mechanism.)
+
+The `barf-if-buffer-read-only' function sends you an error message
+saying the buffer is read-only if you cannot modify it.
+
+The next line has the `erase-buffer' function as its sole contents.
+That function erases the buffer.
+
+Finally, the last two lines contain the `save-excursion' expression
+with `insert-buffer-substring' as its body.  The
+`insert-buffer-substring' expression copies the text from the buffer
+you are in (and you have not seen the computer shift its attention, so
+you don't know that that buffer is now called `oldbuf').
+
+Incidentally, this is what is meant by `replacement'.  To replace text,
+Emacs erases the previous text and then inserts new text.
+
+In outline, the body of `copy-to-buffer' looks like this:
+
+     (let (BIND-`oldbuf'-TO-VALUE-OF-`current-buffer')
+         (WITH-THE-BUFFER-YOU-ARE-COPYING-TO
+           (BUT-DO-NOT-ERASE-OR-COPY-TO-A-READ-ONLY-BUFFER)
+           (erase-buffer)
+           (save-excursion
+             INSERT-SUBSTRING-FROM-`oldbuf'-INTO-BUFFER)))
+
+
+File: eintr,  Node: insert-buffer,  Next: beginning-of-buffer,  Prev: copy-to-buffer,  Up: More Complex
+
+5.2 The Definition of `insert-buffer'
+=====================================
+
+`insert-buffer' is yet another buffer-related function.  This command
+copies another buffer _into_ the current buffer.  It is the reverse of
+`append-to-buffer' or `copy-to-buffer', since they copy a region of
+text _from_ the current buffer to another buffer.
+
+Here is a discussion based on the original code.  The code was
+simplified in 2003 and is harder to understand.
+
+*Note New Body for `insert-buffer': New insert-buffer, to see a
+discussion of the new body.)
+
+In addition, this code illustrates the use of `interactive' with a
+buffer that might be "read-only" and the important distinction between
+the name of an object and the object actually referred to.
+
+* Menu:
+
+* insert-buffer code::
+* insert-buffer interactive::
+* insert-buffer body::
+* if & or::
+* Insert or::
+* Insert let::
+* New insert-buffer ::
+
+
+File: eintr,  Node: insert-buffer code,  Next: insert-buffer interactive,  Prev: insert-buffer,  Up: insert-buffer
+
+The Code for `insert-buffer'
+----------------------------
+
+Here is the earlier code:
+
+     (defun insert-buffer (buffer)
+       "Insert after point the contents of BUFFER.
+     Puts mark after the inserted text.
+     BUFFER may be a buffer or a buffer name."
+       (interactive "*bInsert buffer: ")
+       (or (bufferp buffer)
+           (setq buffer (get-buffer buffer)))
+       (let (start end newmark)
+         (save-excursion
+           (save-excursion
+             (set-buffer buffer)
+             (setq start (point-min) end (point-max)))
+           (insert-buffer-substring buffer start end)
+           (setq newmark (point)))
+         (push-mark newmark)))
+
+As with other function definitions, you can use a template to see an
+outline of the function:
+
+     (defun insert-buffer (buffer)
+       "DOCUMENTATION..."
+       (interactive "*bInsert buffer: ")
+       BODY...)
+
+
+File: eintr,  Node: insert-buffer interactive,  Next: insert-buffer body,  Prev: insert-buffer code,  Up: insert-buffer
+
+5.2.1 The Interactive Expression in `insert-buffer'
+---------------------------------------------------
+
+In `insert-buffer', the argument to the `interactive' declaration has
+two parts, an asterisk, `*', and `bInsert buffer: '.
+
+* Menu:
+
+* Read-only buffer::
+* b for interactive::
+
+
+File: eintr,  Node: Read-only buffer,  Next: b for interactive,  Prev: insert-buffer interactive,  Up: insert-buffer interactive
+
+A Read-only Buffer
+..................
+
+The asterisk is for the situation when the current buffer is a
+read-only buffer--a buffer that cannot be modified.  If `insert-buffer'
+is called when the current buffer is read-only, a message to this
+effect is printed in the echo area and the terminal may beep or blink
+at you; you will not be permitted to insert anything into current
+buffer.  The asterisk does not need to be followed by a newline to
+separate it from the next argument.
+
+
+File: eintr,  Node: b for interactive,  Prev: Read-only buffer,  Up: insert-buffer interactive
+
+`b' in an Interactive Expression
+................................
+
+The next argument in the interactive expression starts with a lower
+case `b'.  (This is different from the code for `append-to-buffer',
+which uses an upper-case `B'.  *Note The Definition of
+`append-to-buffer': append-to-buffer.)  The lower-case `b' tells the
+Lisp interpreter that the argument for `insert-buffer' should be an
+existing buffer or else its name.  (The upper-case `B' option provides
+for the possibility that the buffer does not exist.)  Emacs will prompt
+you for the name of the buffer, offering you a default buffer, with
+name completion enabled.  If the buffer does not exist, you receive a
+message that says "No match"; your terminal may beep at you as well.
+
+The new and simplified code generates a list for `interactive'.  It
+uses the `barf-if-buffer-read-only' and `read-buffer' functions with
+which we are already familiar and the `progn' special form with which
+we are not.  (It will be described later.)
+
+
+File: eintr,  Node: insert-buffer body,  Next: if & or,  Prev: insert-buffer interactive,  Up: insert-buffer
+
+5.2.2 The Body of the `insert-buffer' Function
+----------------------------------------------
+
+The body of the `insert-buffer' function has two major parts: an `or'
+expression and a `let' expression.  The purpose of the `or' expression
+is to ensure that the argument `buffer' is bound to a buffer and not
+just the name of a buffer.  The body of the `let' expression contains
+the code which copies the other buffer into the current buffer.
+
+In outline, the two expressions fit into the `insert-buffer' function
+like this:
+
+     (defun insert-buffer (buffer)
+       "DOCUMENTATION..."
+       (interactive "*bInsert buffer: ")
+       (or ...
+           ...
+       (let (VARLIST)
+           BODY-OF-`let'... )
+
+To understand how the `or' expression ensures that the argument
+`buffer' is bound to a buffer and not to the name of a buffer, it is
+first necessary to understand the `or' function.
+
+Before doing this, let me rewrite this part of the function using `if'
+so that you can see what is done in a manner that will be familiar.
+
+
+File: eintr,  Node: if & or,  Next: Insert or,  Prev: insert-buffer body,  Up: insert-buffer
+
+5.2.3 `insert-buffer' With an `if' Instead of an `or'
+-----------------------------------------------------
+
+The job to be done is to make sure the value of `buffer' is a buffer
+itself and not the name of a buffer.  If the value is the name, then
+the buffer itself must be got.
+
+You can imagine yourself at a conference where an usher is wandering
+around holding a list with your name on it and looking for you: the
+usher is "bound" to your name, not to you; but when the usher finds you
+and takes your arm, the usher becomes "bound" to you.
+
+In Lisp, you might describe this situation like this:
+
+     (if (not (holding-on-to-guest))
+         (find-and-take-arm-of-guest))
+
+We want to do the same thing with a buffer--if we do not have the
+buffer itself, we want to get it.
+
+Using a predicate called `bufferp' that tells us whether we have a
+buffer (rather than its name), we can write the code like this:
+
+     (if (not (bufferp buffer))              ; if-part
+         (setq buffer (get-buffer buffer)))  ; then-part
+
+Here, the true-or-false-test of the `if' expression is
+`(not (bufferp buffer))'; and the then-part is the expression
+`(setq buffer (get-buffer buffer))'.
+
+In the test, the function `bufferp' returns true if its argument is a
+buffer--but false if its argument is the name of the buffer.  (The last
+character of the function name `bufferp' is the character `p'; as we
+saw earlier, such use of `p' is a convention that indicates that the
+function is a predicate, which is a term that means that the function
+will determine whether some property is true or false.  *Note Using the
+Wrong Type Object as an Argument: Wrong Type of Argument.)
+
+The function `not' precedes the expression `(bufferp buffer)', so the
+true-or-false-test looks like this:
+
+     (not (bufferp buffer))
+
+`not' is a function that returns true if its argument is false and
+false if its argument is true.  So if `(bufferp buffer)' returns true,
+the `not' expression returns false and vice-verse: what is "not true"
+is false and what is "not false" is true.
+
+Using this test, the `if' expression works as follows: when the value
+of the variable `buffer' is actually a buffer rather than its name, the
+true-or-false-test returns false and the `if' expression does not
+evaluate the then-part.  This is fine, since we do not need to do
+anything to the variable `buffer' if it really is a buffer.
+
+On the other hand, when the value of `buffer' is not a buffer itself,
+but the name of a buffer, the true-or-false-test returns true and the
+then-part of the expression is evaluated.  In this case, the then-part
+is `(setq buffer (get-buffer buffer))'.  This expression uses the
+`get-buffer' function to return an actual buffer itself, given its
+name.  The `setq' then sets the variable `buffer' to the value of the
+buffer itself, replacing its previous value (which was the name of the
+buffer).
+
+
+File: eintr,  Node: Insert or,  Next: Insert let,  Prev: if & or,  Up: insert-buffer
+
+5.2.4 The `or' in the Body
+--------------------------
+
+The purpose of the `or' expression in the `insert-buffer' function is
+to ensure that the argument `buffer' is bound to a buffer and not just
+to the name of a buffer.  The previous section shows how the job could
+have been done using an `if' expression.  However, the `insert-buffer'
+function actually uses `or'.  To understand this, it is necessary to
+understand how `or' works.
+
+An `or' function can have any number of arguments.  It evaluates each
+argument in turn and returns the value of the first of its arguments
+that is not `nil'.  Also, and this is a crucial feature of `or', it
+does not evaluate any subsequent arguments after returning the first
+non-`nil' value.
+
+The `or' expression looks like this:
+
+     (or (bufferp buffer)
+         (setq buffer (get-buffer buffer)))
+
+The first argument to `or' is the expression `(bufferp buffer)'.  This
+expression returns true (a non-`nil' value) if the buffer is actually a
+buffer, and not just the name of a buffer.  In the `or' expression, if
+this is the case, the `or' expression returns this true value and does
+not evaluate the next expression--and this is fine with us, since we do
+not want to do anything to the value of `buffer' if it really is a
+buffer.
+
+On the other hand, if the value of `(bufferp buffer)' is `nil', which
+it will be if the value of `buffer' is the name of a buffer, the Lisp
+interpreter evaluates the next element of the `or' expression.  This is
+the expression `(setq buffer (get-buffer buffer))'.  This expression
+returns a non-`nil' value, which is the value to which it sets the
+variable `buffer'--and this value is a buffer itself, not the name of a
+buffer.
+
+The result of all this is that the symbol `buffer' is always bound to a
+buffer itself rather than to the name of a buffer.  All this is
+necessary because the `set-buffer' function in a following line only
+works with a buffer itself, not with the name to a buffer.
+
+Incidentally, using `or', the situation with the usher would be written
+like this:
+
+     (or (holding-on-to-guest) (find-and-take-arm-of-guest))
+
+
+File: eintr,  Node: Insert let,  Next: New insert-buffer,  Prev: Insert or,  Up: insert-buffer
+
+5.2.5 The `let' Expression in `insert-buffer'
+---------------------------------------------
+
+After ensuring that the variable `buffer' refers to a buffer itself and
+not just to the name of a buffer, the `insert-buffer function'
+continues with a `let' expression.  This specifies three local
+variables, `start', `end', and `newmark' and binds them to the initial
+value `nil'.  These variables are used inside the remainder of the
+`let' and temporarily hide any other occurrence of variables of the
+same name in Emacs until the end of the `let'.
+
+The body of the `let' contains two `save-excursion' expressions.
+First, we will look at the inner `save-excursion' expression in detail.
+The expression looks like this:
+
+     (save-excursion
+       (set-buffer buffer)
+       (setq start (point-min) end (point-max)))
+
+The expression `(set-buffer buffer)' changes Emacs' attention from the
+current buffer to the one from which the text will copied.  In that
+buffer, the variables `start' and `end' are set to the beginning and
+end of the buffer, using the commands `point-min' and `point-max'.
+Note that we have here an illustration of how `setq' is able to set two
+variables in the same expression.  The first argument of `setq' is set
+to the value of its second, and its third argument is set to the value
+of its fourth.
+
+After the body of the inner `save-excursion' is evaluated, the
+`save-excursion' restores the original buffer, but `start' and `end'
+remain set to the values of the beginning and end of the buffer from
+which the text will be copied.
+
+The outer `save-excursion' expression looks like this:
+
+     (save-excursion
+       (INNER-`save-excursion'-EXPRESSION
+          (GO-TO-NEW-BUFFER-AND-SET-`start'-AND-`end')
+       (insert-buffer-substring buffer start end)
+       (setq newmark (point)))
+
+The `insert-buffer-substring' function copies the text _into_ the
+current buffer _from_ the region indicated by `start' and `end' in
+`buffer'.  Since the whole of the second buffer lies between `start'
+and `end', the whole of the second buffer is copied into the buffer you
+are editing.  Next, the value of point, which will be at the end of the
+inserted text, is recorded in the variable `newmark'.
+
+After the body of the outer `save-excursion' is evaluated, point and
+mark are relocated to their original places.
+
+However, it is convenient to locate a mark at the end of the newly
+inserted text and locate point at its beginning.  The `newmark'
+variable records the end of the inserted text.  In the last line of the
+`let' expression, the `(push-mark newmark)' expression function sets a
+mark to this location.  (The previous location of the mark is still
+accessible; it is recorded on the mark ring and you can go back to it
+with `C-u C-<SPC>'.)  Meanwhile, point is located at the beginning of
+the inserted text, which is where it was before you called the insert
+function, the position of which was saved by the first `save-excursion'.
+
+The whole `let' expression looks like this:
+
+     (let (start end newmark)
+       (save-excursion
+         (save-excursion
+           (set-buffer buffer)
+           (setq start (point-min) end (point-max)))
+         (insert-buffer-substring buffer start end)
+         (setq newmark (point)))
+       (push-mark newmark))
+
+Like the `append-to-buffer' function, the `insert-buffer' function uses
+`let', `save-excursion', and `set-buffer'.  In addition, the function
+illustrates one way to use `or'.  All these functions are building
+blocks that we will find and use again and again.
+
+
+File: eintr,  Node: New insert-buffer,  Prev: Insert let,  Up: insert-buffer
+
+5.2.6 New Body for `insert-buffer'
+----------------------------------
+
+The body in the GNU Emacs 22 version is more confusing than the
+original.
+
+It consists of two expressions,
+
+       (push-mark
+        (save-excursion
+          (insert-buffer-substring (get-buffer buffer))
+          (point)))
+
+        nil
+
+except, and this is what confuses novices, very important work is done
+inside the `push-mark' expression.
+
+The `get-buffer' function returns a buffer with the name provided.  You
+will note that the function is _not_ called `get-buffer-create'; it
+does not create a buffer if one does not already exist.  The buffer
+returned by `get-buffer', an existing buffer, is passed to
+`insert-buffer-substring', which inserts the whole of the buffer (since
+you did not specify anything else).
+
+The location into which the buffer is inserted is recorded by
+`push-mark'.  Then the function returns `nil', the value of its last
+command.  Put another way, the `insert-buffer' function exists only to
+produce a side effect, inserting another buffer, not to return any
+value.
+
+
+File: eintr,  Node: beginning-of-buffer,  Next: Second Buffer Related Review,  Prev: insert-buffer,  Up: More Complex
+
+5.3 Complete Definition of `beginning-of-buffer'
+================================================
+
+The basic structure of the `beginning-of-buffer' function has already
+been discussed.  (*Note A Simplified `beginning-of-buffer' Definition:
+simplified-beginning-of-buffer.)  This section describes the complex
+part of the definition.
+
+As previously described, when invoked without an argument,
+`beginning-of-buffer' moves the cursor to the beginning of the buffer
+(in truth, the accessible portion of the buffer), leaving the mark at
+the previous position.  However, when the command is invoked with a
+number between one and ten, the function considers that number to be a
+fraction of the length of the buffer, measured in tenths, and Emacs
+moves the cursor that fraction of the way from the beginning of the
+buffer.  Thus, you can either call this function with the key command
+`M-<', which will move the cursor to the beginning of the buffer, or
+with a key command such as `C-u 7 M-<' which will move the cursor to a
+point 70% of the way through the buffer.  If a number bigger than ten
+is used for the argument, it moves to the end of the buffer.
+
+The `beginning-of-buffer' function can be called with or without an
+argument.  The use of the argument is optional.
+
+* Menu:
+
+* Optional Arguments::
+* beginning-of-buffer opt arg::
+* beginning-of-buffer complete::
+
+
+File: eintr,  Node: Optional Arguments,  Next: beginning-of-buffer opt arg,  Prev: beginning-of-buffer,  Up: beginning-of-buffer
+
+5.3.1 Optional Arguments
+------------------------
+
+Unless told otherwise, Lisp expects that a function with an argument in
+its function definition will be called with a value for that argument.
+If that does not happen, you get an error and a message that says
+`Wrong number of arguments'.
+
+However, optional arguments are a feature of Lisp: a particular
+"keyword" is used to tell the Lisp interpreter that an argument is
+optional.  The keyword is `&optional'.  (The `&' in front of `optional'
+is part of the keyword.)  In a function definition, if an argument
+follows the keyword `&optional', no value need be passed to that
+argument when the function is called.
+
+The first line of the function definition of `beginning-of-buffer'
+therefore looks like this:
+
+     (defun beginning-of-buffer (&optional arg)
+
+In outline, the whole function looks like this:
+
+     (defun beginning-of-buffer (&optional arg)
+       "DOCUMENTATION..."
+       (interactive "P")
+       (or (IS-THE-ARGUMENT-A-CONS-CELL arg)
+           (and ARE-BOTH-TRANSIENT-MARK-MODE-AND-MARK-ACTIVE-TRUE)
+           (push-mark))
+       (let (DETERMINE-SIZE-AND-SET-IT)
+       (goto-char
+         (IF-THERE-IS-AN-ARGUMENT
+             FIGURE-OUT-WHERE-TO-GO
+           ELSE-GO-TO
+           (point-min))))
+        DO-NICETY
+
+The function is similar to the `simplified-beginning-of-buffer'
+function except that the `interactive' expression has `"P"' as an
+argument and the `goto-char' function is followed by an if-then-else
+expression that figures out where to put the cursor if there is an
+argument that is not a cons cell.
+
+(Since I do not explain a cons cell for many more chapters, please
+consider ignoring the function `consp'.  *Note How Lists are
+Implemented: List Implementation, and *Note Cons Cell and List Types:
+(elisp)Cons Cell Type.)
+
+The `"P"' in the `interactive' expression tells Emacs to pass a prefix
+argument, if there is one, to the function in raw form.  A prefix
+argument is made by typing the <META> key followed by a number, or by
+typing `C-u' and then a number.  (If you don't type a number, `C-u'
+defaults to a cons cell with a 4.  A lowercase `"p"' in the
+`interactive' expression causes the function to convert a prefix arg to
+a number.)
+
+The true-or-false-test of the `if' expression looks complex, but it is
+not: it checks whether `arg' has a value that is not `nil' and whether
+it is a cons cell.  (That is what `consp' does; it checks whether its
+argument is a cons cell.)  If `arg' has a value that is not `nil' (and
+is not a cons cell), which will be the case if `beginning-of-buffer' is
+called with a numeric argument, then this true-or-false-test will
+return true and the then-part of the `if' expression will be evaluated.
+On the other hand, if `beginning-of-buffer' is not called with an
+argument, the value of `arg' will be `nil' and the else-part of the
+`if' expression will be evaluated.  The else-part is simply
+`point-min', and when this is the outcome, the whole `goto-char'
+expression is `(goto-char (point-min))', which is how we saw the
+`beginning-of-buffer' function in its simplified form.
+
+
+File: eintr,  Node: beginning-of-buffer opt arg,  Next: beginning-of-buffer complete,  Prev: Optional Arguments,  Up: beginning-of-buffer
+
+5.3.2 `beginning-of-buffer' with an Argument
+--------------------------------------------
+
+When `beginning-of-buffer' is called with an argument, an expression is
+evaluated which calculates what value to pass to `goto-char'.  This
+expression is rather complicated at first sight.  It includes an inner
+`if' expression and much arithmetic.  It looks like this:
+
+     (if (> (buffer-size) 10000)
+         ;; Avoid overflow for large buffer sizes!
+     			  (* (prefix-numeric-value arg)
+     			     (/ size 10))
+       (/
+        (+ 10
+           (*
+            size (prefix-numeric-value arg))) 10)))
+
+* Menu:
+
+* Disentangle beginning-of-buffer::
+* Large buffer case::
+* Small buffer case::
+
+
+File: eintr,  Node: Disentangle beginning-of-buffer,  Next: Large buffer case,  Prev: beginning-of-buffer opt arg,  Up: beginning-of-buffer opt arg
+
+Disentangle `beginning-of-buffer'
+.................................
+
+Like other complex-looking expressions, the conditional expression
+within `beginning-of-buffer' can be disentangled by looking at it as
+parts of a template, in this case, the template for an if-then-else
+expression.  In skeletal form, the expression looks like this:
+
+     (if (BUFFER-IS-LARGE
+         DIVIDE-BUFFER-SIZE-BY-10-AND-MULTIPLY-BY-ARG
+       ELSE-USE-ALTERNATE-CALCULATION
+
+The true-or-false-test of this inner `if' expression checks the size of
+the buffer.  The reason for this is that the old Version 18 Emacs used
+numbers that are no bigger than eight million or so and in the
+computation that followed, the programmer feared that Emacs might try
+to use over-large numbers if the buffer were large.  The term
+`overflow', mentioned in the comment, means numbers that are over
+large.  Version 21 Emacs uses larger numbers, but this code has not
+been touched, if only because people now look at buffers that are far,
+far larger than ever before.
+
+There are two cases:  if the buffer is large and if it is not.
+
+
+File: eintr,  Node: Large buffer case,  Next: Small buffer case,  Prev: Disentangle beginning-of-buffer,  Up: beginning-of-buffer opt arg
+
+What happens in a large buffer
+..............................
+
+In `beginning-of-buffer', the inner `if' expression tests whether the
+size of the buffer is greater than 10,000 characters.  To do this, it
+uses the `>' function and the computation of `size' that comes from the
+let expression.
+
+In the old days, the function `buffer-size' was used.  Not only was
+that function called several times, it gave the size of the whole
+buffer, not the accessible part.  The computation makes much more sense
+when it handles just the accessible part.  (*Note Narrowing and
+Widening: Narrowing & Widening, for more information on focusing
+attention to an `accessible' part.)
+
+The line looks like this:
+
+     (if (> size 10000)
+
+When the buffer is large, the then-part of the `if' expression is
+evaluated.  It reads like this (after formatting for easy reading):
+
+     (*
+       (prefix-numeric-value arg)
+       (/ size 10))
+
+This expression is a multiplication, with two arguments to the function
+`*'.
+
+The first argument is `(prefix-numeric-value arg)'.  When `"P"' is used
+as the argument for `interactive', the value passed to the function as
+its argument is passed a "raw prefix argument", and not a number.  (It
+is a number in a list.)  To perform the arithmetic, a conversion is
+necessary, and `prefix-numeric-value' does the job.
+
+The second argument is `(/ size 10)'.  This expression divides the
+numeric value by ten -- the numeric value of the size of the accessible
+portion of the buffer.  This produces a number that tells how many
+characters make up one tenth of the buffer size.  (In Lisp, `/' is used
+for division, just as `*' is used for multiplication.)
+
+In the multiplication expression as a whole, this amount is multiplied
+by the value of the prefix argument--the multiplication looks like this:
+
+     (* NUMERIC-VALUE-OF-PREFIX-ARG
+        NUMBER-OF-CHARACTERS-IN-ONE-TENTH-OF-THE-ACCESSIBLE-BUFFER)
+
+If, for example, the prefix argument is `7', the one-tenth value will
+be multiplied by 7 to give a position 70% of the way through.
+
+The result of all this is that if the accessible portion of the buffer
+is large, the `goto-char' expression reads like this:
+
+     (goto-char (* (prefix-numeric-value arg)
+                   (/ size 10)))
+
+This puts the cursor where we want it.
+
+
+File: eintr,  Node: Small buffer case,  Prev: Large buffer case,  Up: beginning-of-buffer opt arg
+
+What happens in a small buffer
+..............................
+
+If the buffer contains fewer than 10,000 characters, a slightly
+different computation is performed.  You might think this is not
+necessary, since the first computation could do the job.  However, in a
+small buffer, the first method may not put the cursor on exactly the
+desired line; the second method does a better job.
+
+The code looks like this:
+
+     (/ (+ 10 (* size (prefix-numeric-value arg))) 10))
+
+This is code in which you figure out what happens by discovering how the
+functions are embedded in parentheses.  It is easier to read if you
+reformat it with each expression indented more deeply than its
+enclosing expression:
+
+       (/
+        (+ 10
+           (*
+            size
+            (prefix-numeric-value arg)))
+        10))
+
+Looking at parentheses, we see that the innermost operation is
+`(prefix-numeric-value arg)', which converts the raw argument to a
+number.  In the following expression, this number is multiplied by the
+size of the accessible portion of the buffer:
+
+     (* size (prefix-numeric-value arg))
+
+This multiplication creates a number that may be larger than the size of
+the buffer--seven times larger if the argument is 7, for example.  Ten
+is then added to this number and finally the large number is divided by
+ten to provide a value that is one character larger than the percentage
+position in the buffer.
+
+The number that results from all this is passed to `goto-char' and the
+cursor is moved to that point.
+
+
+File: eintr,  Node: beginning-of-buffer complete,  Prev: beginning-of-buffer opt arg,  Up: beginning-of-buffer
+
+5.3.3 The Complete `beginning-of-buffer'
+----------------------------------------
+
+Here is the complete text of the `beginning-of-buffer' function:
+
+     (defun beginning-of-buffer (&optional arg)
+       "Move point to the beginning of the buffer;
+     leave mark at previous position.
+     With \\[universal-argument] prefix,
+     do not set mark at previous position.
+     With numeric arg N,
+     put point N/10 of the way from the beginning.
+
+     If the buffer is narrowed,
+     this command uses the beginning and size
+     of the accessible part of the buffer.
+
+     Don't use this command in Lisp programs!
+     \(goto-char (point-min)) is faster
+     and avoids clobbering the mark."
+       (interactive "P")
+       (or (consp arg)
+           (and transient-mark-mode mark-active)
+           (push-mark))
+       (let ((size (- (point-max) (point-min))))
+         (goto-char (if (and arg (not (consp arg)))
+     		   (+ (point-min)
+     		      (if (> size 10000)
+     			  ;; Avoid overflow for large buffer sizes!
+     			  (* (prefix-numeric-value arg)
+     			     (/ size 10))
+     			(/ (+ 10 (* size (prefix-numeric-value arg))) 10)))
+     		 (point-min))))
+       (if arg (forward-line 1)))
+
+Except for two small points, the previous discussion shows how this
+function works.  The first point deals with a detail in the
+documentation string, and the second point concerns the last line of
+the function.
+
+In the documentation string, there is reference to an expression:
+
+     \\[universal-argument]
+
+A `\\' is used before the first square bracket of this expression.
+This `\\' tells the Lisp interpreter to substitute whatever key is
+currently bound to the `[...]'.  In the case of `universal-argument',
+that is usually `C-u', but it might be different.  (*Note Tips for
+Documentation Strings: (elisp)Documentation Tips, for more information.)
+
+Finally, the last line of the `beginning-of-buffer' command says to
+move point to the beginning of the next line if the command is invoked
+with an argument:
+
+     (if arg (forward-line 1)))
+
+This puts the cursor at the beginning of the first line after the
+appropriate tenths position in the buffer.  This is a flourish that
+means that the cursor is always located _at least_ the requested tenths
+of the way through the buffer, which is a nicety that is, perhaps, not
+necessary, but which, if it did not occur, would be sure to draw
+complaints.
+
+On the other hand, it also means that if you specify the command with a
+`C-u', but without a number, that is to say, if the `raw prefix
+argument' is simply a cons cell, then the command puts you at the
+beginning of the second line ...  I don't know whether this is intended
+or whether no one has dealt with the code to avoid this happening.
+
+
+File: eintr,  Node: Second Buffer Related Review,  Next: optional Exercise,  Prev: beginning-of-buffer,  Up: More Complex
+
+5.4 Review
+==========
+
+Here is a brief summary of some of the topics covered in this chapter.
+
+`or'
+     Evaluate each argument in sequence, and return the value of the
+     first argument that is not `nil'; if none return a value that is
+     not `nil', return `nil'.  In brief, return the first true value of
+     the arguments; return a true value if one _or_ any of the others
+     are true.
+
+`and'
+     Evaluate each argument in sequence, and if any are `nil', return
+     `nil'; if none are `nil', return the value of the last argument.
+     In brief, return a true value only if all the arguments are true;
+     return a true value if one _and_ each of the others is true.
+
+`&optional'
+     A keyword used to indicate that an argument to a function
+     definition is optional; this means that the function can be
+     evaluated without the argument, if desired.
+
+`prefix-numeric-value'
+     Convert the `raw prefix argument' produced by `(interactive "P")'
+     to a numeric value.
+
+`forward-line'
+     Move point forward to the beginning of the next line, or if the
+     argument is greater than one, forward that many lines.  If it
+     can't move as far forward as it is supposed to, `forward-line'
+     goes forward as far as it can and then returns a count of the
+     number of additional lines it was supposed to move but couldn't.
+
+`erase-buffer'
+     Delete the entire contents of the current buffer.
+
+`bufferp'
+     Return `t' if its argument is a buffer; otherwise return `nil'.
+
+
+File: eintr,  Node: optional Exercise,  Prev: Second Buffer Related Review,  Up: More Complex
+
+5.5 `optional' Argument Exercise
+================================
+
+Write an interactive function with an optional argument that tests
+whether its argument, a number, is greater than or equal to, or else,
+less than the value of `fill-column', and tells you which, in a
+message.  However, if you do not pass an argument to the function, use
+56 as a default value.
+
+
+File: eintr,  Node: Narrowing & Widening,  Next: car cdr & cons,  Prev: More Complex,  Up: Top
+
+6 Narrowing and Widening
+************************
+
+Narrowing is a feature of Emacs that makes it possible for you to focus
+on a specific part of a buffer, and work without accidentally changing
+other parts.  Narrowing is normally disabled since it can confuse
+novices.
+
+* Menu:
+
+* Narrowing advantages::
+* save-restriction::
+* what-line::
+* narrow Exercise::
+
+
+File: eintr,  Node: Narrowing advantages,  Next: save-restriction,  Prev: Narrowing & Widening,  Up: Narrowing & Widening
+
+The Advantages of Narrowing
+===========================
+
+With narrowing, the rest of a buffer is made invisible, as if it weren't
+there.  This is an advantage if, for example, you want to replace a word
+in one part of a buffer but not in another: you narrow to the part you
+want and the replacement is carried out only in that section, not in
+the rest of the buffer.  Searches will only work within a narrowed
+region, not outside of one, so if you are fixing a part of a document,
+you can keep yourself from accidentally finding parts you do not need
+to fix by narrowing just to the region you want.  (The key binding for
+`narrow-to-region' is `C-x n n'.)
+
+However, narrowing does make the rest of the buffer invisible, which
+can scare people who inadvertently invoke narrowing and think they have
+deleted a part of their file.  Moreover, the `undo' command (which is
+usually bound to `C-x u') does not turn off narrowing (nor should it),
+so people can become quite desperate if they do not know that they can
+return the rest of a buffer to visibility with the `widen' command.
+(The key binding for `widen' is `C-x n w'.)
+
+Narrowing is just as useful to the Lisp interpreter as to a human.
+Often, an Emacs Lisp function is designed to work on just part of a
+buffer; or conversely, an Emacs Lisp function needs to work on all of a
+buffer that has been narrowed.  The `what-line' function, for example,
+removes the narrowing from a buffer, if it has any narrowing and when
+it has finished its job, restores the narrowing to what it was.  On the
+other hand, the `count-lines' function, which is called by `what-line',
+uses narrowing to restrict itself to just that portion of the buffer in
+which it is interested and then restores the previous situation.
+
+
+File: eintr,  Node: save-restriction,  Next: what-line,  Prev: Narrowing advantages,  Up: Narrowing & Widening
+
+6.1 The `save-restriction' Special Form
+=======================================
+
+In Emacs Lisp, you can use the `save-restriction' special form to keep
+track of whatever narrowing is in effect, if any.  When the Lisp
+interpreter meets with `save-restriction', it executes the code in the
+body of the `save-restriction' expression, and then undoes any changes
+to narrowing that the code caused.  If, for example, the buffer is
+narrowed and the code that follows `save-restriction' gets rid of the
+narrowing, `save-restriction' returns the buffer to its narrowed region
+afterwards.  In the `what-line' command, any narrowing the buffer may
+have is undone by the `widen' command that immediately follows the
+`save-restriction' command.  Any original narrowing is restored just
+before the completion of the function.
+
+The template for a `save-restriction' expression is simple:
+
+     (save-restriction
+       BODY... )
+
+The body of the `save-restriction' is one or more expressions that will
+be evaluated in sequence by the Lisp interpreter.
+
+Finally, a point to note: when you use both `save-excursion' and
+`save-restriction', one right after the other, you should use
+`save-excursion' outermost.  If you write them in reverse order, you
+may fail to record narrowing in the buffer to which Emacs switches
+after calling `save-excursion'.  Thus, when written together,
+`save-excursion' and `save-restriction' should be written like this:
+
+     (save-excursion
+       (save-restriction
+         BODY...))
+
+In other circumstances, when not written together, the `save-excursion'
+and `save-restriction' special forms must be written in the order
+appropriate to the function.
+
+For example,
+
+       (save-restriction
+         (widen)
+         (save-excursion
+         BODY...))
+
+
+File: eintr,  Node: what-line,  Next: narrow Exercise,  Prev: save-restriction,  Up: Narrowing & Widening
+
+6.2 `what-line'
+===============
+
+The `what-line' command tells you the number of the line in which the
+cursor is located.  The function illustrates the use of the
+`save-restriction' and `save-excursion' commands.  Here is the original
+text of the function:
+
+     (defun what-line ()
+       "Print the current line number (in the buffer) of point."
+       (interactive)
+       (save-restriction
+         (widen)
+         (save-excursion
+           (beginning-of-line)
+           (message "Line %d"
+                    (1+ (count-lines 1 (point)))))))
+
+(In recent versions of GNU Emacs, the `what-line' function has been
+expanded to tell you your line number in a narrowed buffer as well as
+your line number in a widened buffer.  The recent version is more
+complex than the version shown here.  If you feel adventurous, you
+might want to look at it after figuring out how this version works.
+You will probably need to use `C-h f' (`describe-function').  The newer
+version uses a conditional to determine whether the buffer has been
+narrowed.
+
+(Also, it uses `line-number-at-pos', which among other simple
+expressions, such as `(goto-char (point-min))', moves point to the
+beginning of the current line with `(forward-line 0)' rather than
+`beginning-of-line'.)
+
+The `what-line' function as shown here has a documentation line and is
+interactive, as you would expect.  The next two lines use the functions
+`save-restriction' and `widen'.
+
+The `save-restriction' special form notes whatever narrowing is in
+effect, if any, in the current buffer and restores that narrowing after
+the code in the body of the `save-restriction' has been evaluated.
+
+The `save-restriction' special form is followed by `widen'.  This
+function undoes any narrowing the current buffer may have had when
+`what-line' was called.  (The narrowing that was there is the narrowing
+that `save-restriction' remembers.)  This widening makes it possible
+for the line counting commands to count from the beginning of the
+buffer.  Otherwise, they would have been limited to counting within the
+accessible region.  Any original narrowing is restored just before the
+completion of the function by the `save-restriction' special form.
+
+The call to `widen' is followed by `save-excursion', which saves the
+location of the cursor (i.e., of point) and of the mark, and restores
+them after the code in the body of the `save-excursion' uses the
+`beginning-of-line' function to move point.
+
+(Note that the `(widen)' expression comes between the
+`save-restriction' and `save-excursion' special forms.  When you write
+the two `save- ...' expressions in sequence, write `save-excursion'
+outermost.)
+
+The last two lines of the `what-line' function are functions to count
+the number of lines in the buffer and then print the number in the echo
+area.
+
+     (message "Line %d"
+              (1+ (count-lines 1 (point)))))))
+
+The `message' function prints a one-line message at the bottom of the
+Emacs screen.  The first argument is inside of quotation marks and is
+printed as a string of characters.  However, it may contain a `%d'
+expression to print a following argument.  `%d' prints the argument as
+a decimal, so the message will say something such as `Line 243'.
+
+The number that is printed in place of the `%d' is computed by the last
+line of the function:
+
+     (1+ (count-lines 1 (point)))
+
+What this does is count the lines from the first position of the
+buffer, indicated by the `1', up to `(point)', and then add one to that
+number.  (The `1+' function adds one to its argument.)  We add one to
+it because line 2 has only one line before it, and `count-lines' counts
+only the lines _before_ the current line.
+
+After `count-lines' has done its job, and the message has been printed
+in the echo area, the `save-excursion' restores point and mark to their
+original positions; and `save-restriction' restores the original
+narrowing, if any.
+
+
+File: eintr,  Node: narrow Exercise,  Prev: what-line,  Up: Narrowing & Widening
+
+6.3 Exercise with Narrowing
+===========================
+
+Write a function that will display the first 60 characters of the
+current buffer, even if you have narrowed the buffer to its latter half
+so that the first line is inaccessible.  Restore point, mark, and
+narrowing.  For this exercise, you need to use a whole potpourri of
+functions, including `save-restriction', `widen', `goto-char',
+`point-min', `message', and `buffer-substring'.
+
+(`buffer-substring' is a previously unmentioned function you will have
+to investigate yourself; or perhaps you will have to use
+`buffer-substring-no-properties' or `filter-buffer-substring' ..., yet
+other functions.  Text properties are a feature otherwise not discussed
+here.  *Note Text Properties: (elisp)Text Properties.
+
+Additionally, do you really need `goto-char' or `point-min'?  Or can
+you write the function without them?)
+
+
+File: eintr,  Node: car cdr & cons,  Next: Cutting & Storing Text,  Prev: Narrowing & Widening,  Up: Top
+
+7 `car', `cdr', `cons': Fundamental Functions
+*********************************************
+
+In Lisp, `car', `cdr', and `cons' are fundamental functions.  The
+`cons' function is used to construct lists, and the `car' and `cdr'
+functions are used to take them apart.
+
+In the walk through of the `copy-region-as-kill' function, we will see
+`cons' as well as two variants on `cdr', namely, `setcdr' and `nthcdr'.
+(*Note copy-region-as-kill::.)
+
+* Menu:
+
+* Strange Names::
+* car & cdr::
+* cons::
+* nthcdr::
+* nth::
+* setcar::
+* setcdr::
+* cons Exercise::
+
+
+File: eintr,  Node: Strange Names,  Next: car & cdr,  Prev: car cdr & cons,  Up: car cdr & cons
+
+Strange Names
+=============
+
+The name of the `cons' function is not unreasonable: it is an
+abbreviation of the word `construct'.  The origins of the names for
+`car' and `cdr', on the other hand, are esoteric: `car' is an acronym
+from the phrase `Contents of the Address part of the Register'; and
+`cdr' (pronounced `could-er') is an acronym from the phrase `Contents
+of the Decrement part of the Register'.  These phrases refer to
+specific pieces of hardware on the very early computer on which the
+original Lisp was developed.  Besides being obsolete, the phrases have
+been completely irrelevant for more than 25 years to anyone thinking
+about Lisp.  Nonetheless, although a few brave scholars have begun to
+use more reasonable names for these functions, the old terms are still
+in use.  In particular, since the terms are used in the Emacs Lisp
+source code, we will use them in this introduction.
+
+
+File: eintr,  Node: car & cdr,  Next: cons,  Prev: Strange Names,  Up: car cdr & cons
+
+7.1 `car' and `cdr'
+===================
+
+The CAR of a list is, quite simply, the first item in the list.  Thus
+the CAR of the list `(rose violet daisy buttercup)' is `rose'.
+
+If you are reading this in Info in GNU Emacs, you can see this by
+evaluating the following:
+
+     (car '(rose violet daisy buttercup))
+
+After evaluating the expression, `rose' will appear in the echo area.
+
+Clearly, a more reasonable name for the `car' function would be `first'
+and this is often suggested.
+
+`car' does not remove the first item from the list; it only reports
+what it is.  After `car' has been applied to a list, the list is still
+the same as it was.  In the jargon, `car' is `non-destructive'.  This
+feature turns out to be important.
+
+The CDR of a list is the rest of the list, that is, the `cdr' function
+returns the part of the list that follows the first item.  Thus, while
+the CAR of the list `'(rose violet daisy buttercup)' is `rose', the
+rest of the list, the value returned by the `cdr' function, is `(violet
+daisy buttercup)'.
+
+You can see this by evaluating the following in the usual way:
+
+     (cdr '(rose violet daisy buttercup))
+
+When you evaluate this, `(violet daisy buttercup)' will appear in the
+echo area.
+
+Like `car', `cdr' does not remove any elements from the list--it just
+returns a report of what the second and subsequent elements are.
+
+Incidentally, in the example, the list of flowers is quoted.  If it were
+not, the Lisp interpreter would try to evaluate the list by calling
+`rose' as a function.  In this example, we do not want to do that.
+
+Clearly, a more reasonable name for `cdr' would be `rest'.
+
+(There is a lesson here: when you name new functions, consider very
+carefully what you are doing, since you may be stuck with the names for
+far longer than you expect.  The reason this document perpetuates these
+names is that the Emacs Lisp source code uses them, and if I did not
+use them, you would have a hard time reading the code; but do, please,
+try to avoid using these terms yourself.  The people who come after you
+will be grateful to you.)
+
+When `car' and `cdr' are applied to a list made up of symbols, such as
+the list `(pine fir oak maple)', the element of the list returned by
+the function `car' is the symbol `pine' without any parentheses around
+it.  `pine' is the first element in the list.  However, the CDR of the
+list is a list itself, `(fir oak maple)', as you can see by evaluating
+the following expressions in the usual way:
+
+     (car '(pine fir oak maple))
+
+     (cdr '(pine fir oak maple))
+
+On the other hand, in a list of lists, the first element is itself a
+list.  `car' returns this first element as a list.  For example, the
+following list contains three sub-lists, a list of carnivores, a list
+of herbivores and a list of sea mammals:
+
+     (car '((lion tiger cheetah)
+            (gazelle antelope zebra)
+            (whale dolphin seal)))
+
+In this example, the first element or CAR of the list is the list of
+carnivores, `(lion tiger cheetah)', and the rest of the list is
+`((gazelle antelope zebra) (whale dolphin seal))'.
+
+     (cdr '((lion tiger cheetah)
+            (gazelle antelope zebra)
+            (whale dolphin seal)))
+
+It is worth saying again that `car' and `cdr' are non-destructive--that
+is, they do not modify or change lists to which they are applied.  This
+is very important for how they are used.
+
+Also, in the first chapter, in the discussion about atoms, I said that
+in Lisp, "certain kinds of atom, such as an array, can be separated
+into parts; but the mechanism for doing this is different from the
+mechanism for splitting a list.  As far as Lisp is concerned, the atoms
+of a list are unsplittable."  (*Note Lisp Atoms::.)  The `car' and
+`cdr' functions are used for splitting lists and are considered
+fundamental to Lisp.  Since they cannot split or gain access to the
+parts of an array, an array is considered an atom.  Conversely, the
+other fundamental function, `cons', can put together or construct a
+list, but not an array.  (Arrays are handled by array-specific
+functions.  *Note Arrays: (elisp)Arrays.)
+
+
+File: eintr,  Node: cons,  Next: nthcdr,  Prev: car & cdr,  Up: car cdr & cons
+
+7.2 `cons'
+==========
+
+The `cons' function constructs lists; it is the inverse of `car' and
+`cdr'.  For example, `cons' can be used to make a four element list
+from the three element list, `(fir oak maple)':
+
+     (cons 'pine '(fir oak maple))
+
+After evaluating this list, you will see
+
+     (pine fir oak maple)
+
+appear in the echo area.  `cons' causes the creation of a new list in
+which the element is followed by the elements of the original list.
+
+We often say that ``cons' puts a new element at the beginning of a
+list; it attaches or pushes elements onto the list', but this phrasing
+can be misleading, since `cons' does not change an existing list, but
+creates a new one.
+
+Like `car' and `cdr', `cons' is non-destructive.
+
+* Menu:
+
+* Build a list::
+* length::
+
+
+File: eintr,  Node: Build a list,  Next: length,  Prev: cons,  Up: cons
+
+Build a list
+------------
+
+`cons' must have a list to attach to.(1)  You cannot start from
+absolutely nothing.  If you are building a list, you need to provide at
+least an empty list at the beginning.  Here is a series of `cons'
+expressions that build up a list of flowers.  If you are reading this
+in Info in GNU Emacs, you can evaluate each of the expressions in the
+usual way; the value is printed in this text after `=>', which you may
+read as `evaluates to'.
+
+     (cons 'buttercup ())
+          => (buttercup)
+
+     (cons 'daisy '(buttercup))
+          => (daisy buttercup)
+
+     (cons 'violet '(daisy buttercup))
+          => (violet daisy buttercup)
+
+     (cons 'rose '(violet daisy buttercup))
+          => (rose violet daisy buttercup)
+
+In the first example, the empty list is shown as `()' and a list made
+up of `buttercup' followed by the empty list is constructed.  As you
+can see, the empty list is not shown in the list that was constructed.
+All that you see is `(buttercup)'.  The empty list is not counted as an
+element of a list because there is nothing in an empty list.  Generally
+speaking, an empty list is invisible.
+
+The second example, `(cons 'daisy '(buttercup))' constructs a new, two
+element list by putting `daisy' in front of `buttercup'; and the third
+example constructs a three element list by putting `violet' in front of
+`daisy' and `buttercup'.
+
+---------- Footnotes ----------
+
+(1) Actually, you can `cons' an element to an atom to produce a dotted
+pair.  Dotted pairs are not discussed here; see *Note Dotted Pair
+Notation: (elisp)Dotted Pair Notation.
+
+
+File: eintr,  Node: length,  Prev: Build a list,  Up: cons
+
+7.2.1 Find the Length of a List: `length'
+-----------------------------------------
+
+You can find out how many elements there are in a list by using the Lisp
+function `length', as in the following examples:
+
+     (length '(buttercup))
+          => 1
+
+     (length '(daisy buttercup))
+          => 2
+
+     (length (cons 'violet '(daisy buttercup)))
+          => 3
+
+In the third example, the `cons' function is used to construct a three
+element list which is then passed to the `length' function as its
+argument.
+
+We can also use `length' to count the number of elements in an empty
+list:
+
+     (length ())
+          => 0
+
+As you would expect, the number of elements in an empty list is zero.
+
+An interesting experiment is to find out what happens if you try to find
+the length of no list at all; that is, if you try to call `length'
+without giving it an argument, not even an empty list:
+
+     (length )
+
+What you see, if you evaluate this, is the error message
+
+     Lisp error: (wrong-number-of-arguments length 0)
+
+This means that the function receives the wrong number of arguments,
+zero, when it expects some other number of arguments.  In this case,
+one argument is expected, the argument being a list whose length the
+function is measuring.  (Note that _one_ list is _one_ argument, even
+if the list has many elements inside it.)
+
+The part of the error message that says `length' is the name of the
+function.
+
+
+File: eintr,  Node: nthcdr,  Next: nth,  Prev: cons,  Up: car cdr & cons
+
+7.3 `nthcdr'
+============
+
+The `nthcdr' function is associated with the `cdr' function.  What it
+does is take the CDR of a list repeatedly.
+
+If you take the CDR of the list `(pine fir oak maple)', you will be
+returned the list `(fir oak maple)'.  If you repeat this on what was
+returned, you will be returned the list `(oak maple)'.  (Of course,
+repeated CDRing on the original list will just give you the original
+CDR since the function does not change the list.  You need to evaluate
+the CDR of the CDR and so on.)  If you continue this, eventually you
+will be returned an empty list, which in this case, instead of being
+shown as `()' is shown as `nil'.
+
+For review, here is a series of repeated CDRs, the text following the
+`=>' shows what is returned.
+
+     (cdr '(pine fir oak maple))
+          =>(fir oak maple)
+
+     (cdr '(fir oak maple))
+          => (oak maple)
+
+     (cdr '(oak maple))
+          =>(maple)
+
+     (cdr '(maple))
+          => nil
+
+     (cdr 'nil)
+          => nil
+
+     (cdr ())
+          => nil
+
+You can also do several CDRs without printing the values in between,
+like this:
+
+     (cdr (cdr '(pine fir oak maple)))
+          => (oak maple)
+
+In this example, the Lisp interpreter evaluates the innermost list
+first.  The innermost list is quoted, so it just passes the list as it
+is to the innermost `cdr'.  This `cdr' passes a list made up of the
+second and subsequent elements of the list to the outermost `cdr',
+which produces a list composed of the third and subsequent elements of
+the original list.  In this example, the `cdr' function is repeated and
+returns a list that consists of the original list without its first two
+elements.
+
+The `nthcdr' function does the same as repeating the call to `cdr'.  In
+the following example, the argument 2 is passed to the function
+`nthcdr', along with the list, and the value returned is the list
+without its first two items, which is exactly the same as repeating
+`cdr' twice on the list:
+
+     (nthcdr 2 '(pine fir oak maple))
+          => (oak maple)
+
+Using the original four element list, we can see what happens when
+various numeric arguments are passed to `nthcdr', including 0, 1, and 5:
+
+     ;; Leave the list as it was.
+     (nthcdr 0 '(pine fir oak maple))
+          => (pine fir oak maple)
+
+     ;; Return a copy without the first element.
+     (nthcdr 1 '(pine fir oak maple))
+          => (fir oak maple)
+
+     ;; Return a copy of the list without three elements.
+     (nthcdr 3 '(pine fir oak maple))
+          => (maple)
+
+     ;; Return a copy lacking all four elements.
+     (nthcdr 4 '(pine fir oak maple))
+          => nil
+
+     ;; Return a copy lacking all elements.
+     (nthcdr 5 '(pine fir oak maple))
+          => nil
+
+
+File: eintr,  Node: nth,  Next: setcar,  Prev: nthcdr,  Up: car cdr & cons
+
+7.4 `nth'
+=========
+
+The `nthcdr' function takes the CDR of a list repeatedly.  The `nth'
+function takes the CAR of the result returned by `nthcdr'.  It returns
+the Nth element of the list.
+
+Thus, if it were not defined in C for speed, the definition of `nth'
+would be:
+
+     (defun nth (n list)
+       "Returns the Nth element of LIST.
+     N counts from zero.  If LIST is not that long, nil is returned."
+       (car (nthcdr n list)))
+
+(Originally, `nth' was defined in Emacs Lisp in `subr.el', but its
+definition was redone in C in the 1980s.)
+
+The `nth' function returns a single element of a list.  This can be
+very convenient.
+
+Note that the elements are numbered from zero, not one.  That is to
+say, the first element of a list, its CAR is the zeroth element.  This
+is called `zero-based' counting and often bothers people who are
+accustomed to the first element in a list being number one, which is
+`one-based'.
+
+For example:
+
+     (nth 0 '("one" "two" "three"))
+         => "one"
+
+     (nth 1 '("one" "two" "three"))
+         => "two"
+
+It is worth mentioning that `nth', like `nthcdr' and `cdr', does not
+change the original list--the function is non-destructive.  This is in
+sharp contrast to the `setcar' and `setcdr' functions.
+
+
+File: eintr,  Node: setcar,  Next: setcdr,  Prev: nth,  Up: car cdr & cons
+
+7.5 `setcar'
+============
+
+As you might guess from their names, the `setcar' and `setcdr'
+functions set the CAR or the CDR of a list to a new value.  They
+actually change the original list, unlike `car' and `cdr' which leave
+the original list as it was.  One way to find out how this works is to
+experiment.  We will start with the `setcar' function.
+
+First, we can make a list and then set the value of a variable to the
+list, using the `setq' function.  Here is a list of animals:
+
+     (setq animals '(antelope giraffe lion tiger))
+
+If you are reading this in Info inside of GNU Emacs, you can evaluate
+this expression in the usual fashion, by positioning the cursor after
+the expression and typing `C-x C-e'.  (I'm doing this right here as I
+write this.  This is one of the advantages of having the interpreter
+built into the computing environment.  Incidentally, when there is
+nothing on the line after the final parentheses, such as a comment,
+point can be on the next line.  Thus, if your cursor is in the first
+column of the next line, you do not need to move it.  Indeed, Emacs
+permits any amount of white space after the final parenthesis.)
+
+When we evaluate the variable `animals', we see that it is bound to the
+list `(antelope giraffe lion tiger)':
+
+     animals
+          => (antelope giraffe lion tiger)
+
+Put another way, the variable `animals' points to the list `(antelope
+giraffe lion tiger)'.
+
+Next, evaluate the function `setcar' while passing it two arguments,
+the variable `animals' and the quoted symbol `hippopotamus'; this is
+done by writing the three element list `(setcar animals 'hippopotamus)'
+and then evaluating it in the usual fashion:
+
+     (setcar animals 'hippopotamus)
+
+After evaluating this expression, evaluate the variable `animals'
+again.  You will see that the list of animals has changed:
+
+     animals
+          => (hippopotamus giraffe lion tiger)
+
+The first element on the list, `antelope' is replaced by `hippopotamus'.
+
+So we can see that `setcar' did not add a new element to the list as
+`cons' would have; it replaced `antelope' with `hippopotamus'; it
+_changed_ the list.
+
+
+File: eintr,  Node: setcdr,  Next: cons Exercise,  Prev: setcar,  Up: car cdr & cons
+
+7.6 `setcdr'
+============
+
+The `setcdr' function is similar to the `setcar' function, except that
+the function replaces the second and subsequent elements of a list
+rather than the first element.
+
+(To see how to change the last element of a list, look ahead to *Note
+The `kill-new' function: kill-new function, which uses the `nthcdr' and
+`setcdr' functions.)
+
+To see how this works, set the value of the variable to a list of
+domesticated animals by evaluating the following expression:
+
+     (setq domesticated-animals '(horse cow sheep goat))
+
+If you now evaluate the list, you will be returned the list `(horse cow
+sheep goat)':
+
+     domesticated-animals
+          => (horse cow sheep goat)
+
+Next, evaluate `setcdr' with two arguments, the name of the variable
+which has a list as its value, and the list to which the CDR of the
+first list will be set;
+
+     (setcdr domesticated-animals '(cat dog))
+
+If you evaluate this expression, the list `(cat dog)' will appear in
+the echo area.  This is the value returned by the function.  The result
+we are interested in is the "side effect", which we can see by
+evaluating the variable `domesticated-animals':
+
+     domesticated-animals
+          => (horse cat dog)
+
+Indeed, the list is changed from `(horse cow sheep goat)' to `(horse
+cat dog)'.  The CDR of the list is changed from `(cow sheep goat)' to
+`(cat dog)'.
+
+
+File: eintr,  Node: cons Exercise,  Prev: setcdr,  Up: car cdr & cons
+
+7.7 Exercise
+============
+
+Construct a list of four birds by evaluating several expressions with
+`cons'.  Find out what happens when you `cons' a list onto itself.
+Replace the first element of the list of four birds with a fish.
+Replace the rest of that list with a list of other fish.
+
+
+File: eintr,  Node: Cutting & Storing Text,  Next: List Implementation,  Prev: car cdr & cons,  Up: Top
+
+8 Cutting and Storing Text
+**************************
+
+Whenever you cut or clip text out of a buffer with a `kill' command in
+GNU Emacs, it is stored in a list and you can bring it back with a
+`yank' command.
+
+(The use of the word `kill' in Emacs for processes which specifically
+_do not_ destroy the values of the entities is an unfortunate
+historical accident.  A much more appropriate word would be `clip' since
+that is what the kill commands do; they clip text out of a buffer and
+put it into storage from which it can be brought back.  I have often
+been tempted to replace globally all occurrences of `kill' in the Emacs
+sources with `clip' and all occurrences of `killed' with `clipped'.)
+
+* Menu:
+
+* Storing Text::
+* zap-to-char::
+* kill-region::
+* copy-region-as-kill::
+* Digression into C::
+* defvar::
+* cons & search-fwd Review::
+* search Exercises::
+
+
+File: eintr,  Node: Storing Text,  Next: zap-to-char,  Prev: Cutting & Storing Text,  Up: Cutting & Storing Text
+
+Storing Text in a List
+======================
+
+When text is cut out of a buffer, it is stored on a list.  Successive
+pieces of text are stored on the list successively, so the list might
+look like this:
+
+     ("a piece of text" "previous piece")
+
+The function `cons' can be used to create a new list from a piece of
+text (an `atom', to use the jargon) and an existing list, like this:
+
+     (cons "another piece"
+           '("a piece of text" "previous piece"))
+
+If you evaluate this expression, a list of three elements will appear in
+the echo area:
+
+     ("another piece" "a piece of text" "previous piece")
+
+With the `car' and `nthcdr' functions, you can retrieve whichever piece
+of text you want.  For example, in the following code, `nthcdr 1 ...'
+returns the list with the first item removed; and the `car' returns the
+first element of that remainder--the second element of the original
+list:
+
+     (car (nthcdr 1 '("another piece"
+                      "a piece of text"
+                      "previous piece")))
+          => "a piece of text"
+
+The actual functions in Emacs are more complex than this, of course.
+The code for cutting and retrieving text has to be written so that
+Emacs can figure out which element in the list you want--the first,
+second, third, or whatever.  In addition, when you get to the end of
+the list, Emacs should give you the first element of the list, rather
+than nothing at all.
+
+The list that holds the pieces of text is called the "kill ring".  This
+chapter leads up to a description of the kill ring and how it is used
+by first tracing how the `zap-to-char' function works.  This function
+uses (or `calls') a function that invokes a function that manipulates
+the kill ring.  Thus, before reaching the mountains, we climb the
+foothills.
+
+A subsequent chapter describes how text that is cut from the buffer is
+retrieved.  *Note Yanking Text Back: Yanking.
+
+
+File: eintr,  Node: zap-to-char,  Next: kill-region,  Prev: Storing Text,  Up: Cutting & Storing Text
+
+8.1 `zap-to-char'
+=================
+
+The `zap-to-char' function changed a little between GNU Emacs version
+19 and GNU Emacs version 22.  However, `zap-to-char' calls another
+function, `kill-region', which enjoyed a major rewrite.
+
+The `kill-region' function in Emacs 19 is complex, but does not use
+code that is important at this time.  We will skip it.
+
+The `kill-region' function in Emacs 22 is easier to read than the same
+function in Emacs 19 and introduces a very important concept, that of
+error handling.  We will walk through the function.
+
+But first, let us look at the interactive `zap-to-char' function.
+
+* Menu:
+
+* Complete zap-to-char::
+* zap-to-char interactive::
+* zap-to-char body::
+* search-forward::
+* progn::
+* Summing up zap-to-char::
+
+
+File: eintr,  Node: Complete zap-to-char,  Next: zap-to-char interactive,  Prev: zap-to-char,  Up: zap-to-char
+
+The Complete `zap-to-char' Implementation
+-----------------------------------------
+
+The GNU Emacs version 19 and version 21 implementations of the
+`zap-to-char' function are nearly identical in form, and they work
+alike.  The function removes the text in the region between the
+location of the cursor (i.e., of point) up to and including the next
+occurrence of a specified character.  The text that `zap-to-char'
+removes is put in the kill ring; and it can be retrieved from the kill
+ring by typing `C-y' (`yank').  If the command is given an argument, it
+removes text through that number of occurrences.  Thus, if the cursor
+were at the beginning of this sentence and the character were `s',
+`Thus' would be removed.  If the argument were two, `Thus, if the curs'
+would be removed, up to and including the `s' in `cursor'.
+
+If the specified character is not found, `zap-to-char' will say "Search
+failed", tell you the character you typed, and not remove any text.
+
+In order to determine how much text to remove, `zap-to-char' uses a
+search function.  Searches are used extensively in code that
+manipulates text, and we will focus attention on them as well as on the
+deletion command.
+
+Here is the complete text of the version 22 implementation of the
+function:
+
+     (defun zap-to-char (arg char)
+       "Kill up to and including ARG'th occurrence of CHAR.
+     Case is ignored if `case-fold-search' is non-nil in the current buffer.
+     Goes backward if ARG is negative; error if CHAR not found."
+       (interactive "p\ncZap to char: ")
+       (if (char-table-p translation-table-for-input)
+           (setq char (or (aref translation-table-for-input char) char)))
+       (kill-region (point) (progn
+     			 (search-forward (char-to-string char) nil nil arg)
+     			 (point))))
+
+
+File: eintr,  Node: zap-to-char interactive,  Next: zap-to-char body,  Prev: Complete zap-to-char,  Up: zap-to-char
+
+8.1.1 The `interactive' Expression
+----------------------------------
+
+The interactive expression in the `zap-to-char' command looks like this:
+
+     (interactive "p\ncZap to char: ")
+
+The part within quotation marks, `"p\ncZap to char: "', specifies two
+different things.  First, and most simply, is the `p'.  This part is
+separated from the next part by a newline, `\n'.  The `p' means that
+the first argument to the function will be passed the value of a
+`processed prefix'.  The prefix argument is passed by typing `C-u' and
+a number, or `M-' and a number.  If the function is called
+interactively without a prefix, 1 is passed to this argument.
+
+The second part of `"p\ncZap to char: "' is `cZap to char:  '.  In this
+part, the lower case `c' indicates that `interactive' expects a prompt
+and that the argument will be a character.  The prompt follows the `c'
+and is the string `Zap to char: ' (with a space after the colon to make
+it look good).
+
+What all this does is prepare the arguments to `zap-to-char' so they
+are of the right type, and give the user a prompt.
+
+In a read-only buffer, the `zap-to-char' function copies the text to
+the kill ring, but does not remove it.  The echo area displays a
+message saying that the buffer is read-only.  Also, the terminal may
+beep or blink at you.
+
+Let us continue with the interactive specification.
+
+
+File: eintr,  Node: zap-to-char body,  Next: search-forward,  Prev: zap-to-char interactive,  Up: zap-to-char
+
+8.1.2 The Body of `zap-to-char'
+-------------------------------
+
+The body of the `zap-to-char' function contains the code that kills
+(that is, removes) the text in the region from the current position of
+the cursor up to and including the specified character.
+
+The documentation is thorough.  You do need to know the jargon meaning
+of the word `kill'.
+
+The first part of the code looks like this:
+
+     (if (char-table-p translation-table-for-input)
+         (setq char (or (aref translation-table-for-input char) char)))
+     (kill-region (point) (progn
+                            (search-forward (char-to-string char) nil nil arg)
+                            (point)))
+
+`char-table-p' is an hitherto unseen function.  It determines whether
+its argument is a character table.  When it is, it sets the character
+passed to `zap-to-char' to one of them, if that character exists, or to
+the character itself.  (This becomes important for certain characters
+in non-European languages.  The `aref' function extracts an element
+from an array.  It is an array-specific function that is not described
+in this document.  *Note Arrays: (elisp)Arrays.)
+
+`(point)' is the current position of the cursor.
+
+The next part of the code is an expression using `progn'.  The body of
+the `progn' consists of calls to `search-forward' and `point'.
+
+It is easier to understand how `progn' works after learning about
+`search-forward', so we will look at `search-forward' and then at
+`progn'.
+
+
+File: eintr,  Node: search-forward,  Next: progn,  Prev: zap-to-char body,  Up: zap-to-char
+
+8.1.3 The `search-forward' Function
+-----------------------------------
+
+The `search-forward' function is used to locate the
+zapped-for-character in `zap-to-char'.  If the search is successful,
+`search-forward' leaves point immediately after the last character in
+the target string.  (In `zap-to-char', the target string is just one
+character long.  `zap-to-char' uses the function `char-to-string' to
+ensure that the computer treats that character as a string.)  If the
+search is backwards, `search-forward' leaves point just before the
+first character in the target.  Also, `search-forward' returns `t' for
+true.  (Moving point is therefore a `side effect'.)
+
+In `zap-to-char', the `search-forward' function looks like this:
+
+     (search-forward (char-to-string char) nil nil arg)
+
+The `search-forward' function takes four arguments:
+
+  1. The first argument is the target, what is searched for.  This must
+     be a string, such as `"z"'.
+
+     As it happens, the argument passed to `zap-to-char' is a single
+     character.  Because of the way computers are built, the Lisp
+     interpreter may treat a single character as being different from a
+     string of characters.  Inside the computer, a single character has
+     a different electronic format than a string of one character.  (A
+     single character can often be recorded in the computer using
+     exactly one byte; but a string may be longer, and the computer
+     needs to be ready for this.)  Since the `search-forward' function
+     searches for a string, the character that the `zap-to-char'
+     function receives as its argument must be converted inside the
+     computer from one format to the other; otherwise the
+     `search-forward' function will fail.  The `char-to-string'
+     function is used to make this conversion.
+
+  2. The second argument bounds the search; it is specified as a
+     position in the buffer.  In this case, the search can go to the
+     end of the buffer, so no bound is set and the second argument is
+     `nil'.
+
+  3. The third argument tells the function what it should do if the
+     search fails--it can signal an error (and print a message) or it
+     can return `nil'.  A `nil' as the third argument causes the
+     function to signal an error when the search fails.
+
+  4. The fourth argument to `search-forward' is the repeat count--how
+     many occurrences of the string to look for.  This argument is
+     optional and if the function is called without a repeat count,
+     this argument is passed the value 1.  If this argument is
+     negative, the search goes backwards.
+
+In template form, a `search-forward' expression looks like this:
+
+     (search-forward "TARGET-STRING"
+                     LIMIT-OF-SEARCH
+                     WHAT-TO-DO-IF-SEARCH-FAILS
+                     REPEAT-COUNT)
+
+We will look at `progn' next.
+
+
+File: eintr,  Node: progn,  Next: Summing up zap-to-char,  Prev: search-forward,  Up: zap-to-char
+
+8.1.4 The `progn' Special Form
+------------------------------
+
+`progn' is a special form that causes each of its arguments to be
+evaluated in sequence and then returns the value of the last one.  The
+preceding expressions are evaluated only for the side effects they
+perform.  The values produced by them are discarded.
+
+The template for a `progn' expression is very simple:
+
+     (progn
+       BODY...)
+
+In `zap-to-char', the `progn' expression has to do two things: put
+point in exactly the right position; and return the location of point
+so that `kill-region' will know how far to kill to.
+
+The first argument to the `progn' is `search-forward'.  When
+`search-forward' finds the string, the function leaves point
+immediately after the last character in the target string.  (In this
+case the target string is just one character long.)  If the search is
+backwards, `search-forward' leaves point just before the first
+character in the target.  The movement of point is a side effect.
+
+The second and last argument to `progn' is the expression `(point)'.
+This expression returns the value of point, which in this case will be
+the location to which it has been moved by `search-forward'.  (In the
+source, a line that tells the function to go to the previous character,
+if it is going forward, was commented out in 1999; I don't remember
+whether that feature or mis-feature was ever a part of the distributed
+source.)  The value of `point' is returned by the `progn' expression
+and is passed to `kill-region' as `kill-region''s second argument.
+
+
+File: eintr,  Node: Summing up zap-to-char,  Prev: progn,  Up: zap-to-char
+
+8.1.5 Summing up `zap-to-char'
+------------------------------
+
+Now that we have seen how `search-forward' and `progn' work, we can see
+how the `zap-to-char' function works as a whole.
+
+The first argument to `kill-region' is the position of the cursor when
+the `zap-to-char' command is given--the value of point at that time.
+Within the `progn', the search function then moves point to just after
+the zapped-to-character and `point' returns the value of this location.
+The `kill-region' function puts together these two values of point,
+the first one as the beginning of the region and the second one as the
+end of the region, and removes the region.
+
+The `progn' special form is necessary because the `kill-region' command
+takes two arguments; and it would fail if `search-forward' and `point'
+expressions were written in sequence as two additional arguments.  The
+`progn' expression is a single argument to `kill-region' and returns
+the one value that `kill-region' needs for its second argument.
+
+
+File: eintr,  Node: kill-region,  Next: copy-region-as-kill,  Prev: zap-to-char,  Up: Cutting & Storing Text
+
+8.2 `kill-region'
+=================
+
+The `zap-to-char' function uses the `kill-region' function.  This
+function clips text from a region and copies that text to the kill
+ring, from which it may be retrieved.
+
+The Emacs 22 version of that function uses `condition-case' and
+`copy-region-as-kill', both of which we will explain.  `condition-case'
+is an important special form.
+
+In essence, the `kill-region' function calls `condition-case', which
+takes three arguments.  In this function, the first argument does
+nothing.  The second argument contains the code that does the work when
+all goes well.  The third argument contains the code that is called in
+the event of an error.
+
+* Menu:
+
+* Complete kill-region::
+* condition-case::
+* Lisp macro::
+
+
+File: eintr,  Node: Complete kill-region,  Next: condition-case,  Prev: kill-region,  Up: kill-region
+
+The Complete `kill-region' Definition
+-------------------------------------
+
+We will go through the `condition-case' code in a moment.  First, let
+us look at the definition of `kill-region', with comments added:
+
+     (defun kill-region (beg end)
+       "Kill (\"cut\") text between point and mark.
+     This deletes the text from the buffer and saves it in the kill ring.
+     The command \\[yank] can retrieve it from there. ... "
+
+       ;; * Since order matters, pass point first.
+       (interactive (list (point) (mark)))
+       ;; * And tell us if we cannot cut the text.
+       (unless (and beg end)
+         (error "The mark is not set now, so there is no region"))
+
+       ;; * `condition-case' takes three arguments.
+       ;;    If the first argument is nil, as it is here,
+       ;;    information about the error signal is not
+       ;;    stored for use by another function.
+       (condition-case nil
+
+           ;; * The second argument to `condition-case' tells the
+           ;;    Lisp interpreter what to do when all goes well.
+
+           ;;    It starts with a `let' function that extracts the string
+           ;;    and tests whether it exists.  If so (that is what the
+           ;;    `when' checks), it calls an `if' function that determines
+           ;;    whether the previous command was another call to
+           ;;    `kill-region'; if it was, then the new text is appended to
+           ;;    the previous text; if not, then a different function,
+           ;;    `kill-new', is called.
+
+           ;;    The `kill-append' function concatenates the new string and
+           ;;    the old.  The `kill-new' function inserts text into a new
+           ;;    item in the kill ring.
+
+           ;;    `when' is an `if' without an else-part.  The second `when'
+           ;;    again checks whether the current string exists; in
+           ;;    addition, it checks whether the previous command was
+           ;;    another call to `kill-region'.  If one or the other
+           ;;    condition is true, then it sets the current command to
+           ;;    be `kill-region'.
+           (let ((string (filter-buffer-substring beg end t)))
+             (when string			;STRING is nil if BEG = END
+               ;; Add that string to the kill ring, one way or another.
+               (if (eq last-command 'kill-region)
+                   ;;    - `yank-handler' is an optional argument to
+                   ;;    `kill-region' that tells the `kill-append' and
+                   ;;    `kill-new' functions how deal with properties
+                   ;;    added to the text, such as `bold' or `italics'.
+                   (kill-append string (< end beg) yank-handler)
+     	    (kill-new string nil yank-handler)))
+     	(when (or string (eq last-command 'kill-region))
+     	  (setq this-command 'kill-region))
+     	nil)
+
+         ;;  * The third argument to `condition-case' tells the interpreter
+         ;;    what to do with an error.
+         ;;    The third argument has a conditions part and a body part.
+         ;;    If the conditions are met (in this case,
+         ;;             if text or buffer are read-only)
+         ;;    then the body is executed.
+         ;;    The first part of the third argument is the following:
+         ((buffer-read-only text-read-only) ;; the if-part
+          ;; ...  the then-part
+          (copy-region-as-kill beg end)
+          ;;    Next, also as part of the then-part, set this-command, so
+          ;;    it will be set in an error
+          (setq this-command 'kill-region)
+          ;;    Finally, in the then-part, send a message if you may copy
+          ;;    the text to the kill ring without signally an error, but
+          ;;    don't if you may not.
+          (if kill-read-only-ok
+              (progn (message "Read only text copied to kill ring") nil)
+            (barf-if-buffer-read-only)
+            ;; If the buffer isn't read-only, the text is.
+            (signal 'text-read-only (list (current-buffer)))))
+
+
+File: eintr,  Node: condition-case,  Next: Lisp macro,  Prev: Complete kill-region,  Up: kill-region
+
+8.2.1 `condition-case'
+----------------------
+
+As we have seen earlier (*note Generate an Error Message: Making
+Errors.), when the Emacs Lisp interpreter has trouble evaluating an
+expression, it provides you with help; in the jargon, this is called
+"signaling an error".  Usually, the computer stops the program and
+shows you a message.
+
+However, some programs undertake complicated actions.  They should not
+simply stop on an error.  In the `kill-region' function, the most
+likely error is that you will try to kill text that is read-only and
+cannot be removed.  So the `kill-region' function contains code to
+handle this circumstance.  This code, which makes up the body of the
+`kill-region' function, is inside of a `condition-case' special form.
+
+The template for `condition-case' looks like this:
+
+     (condition-case
+       VAR
+       BODYFORM
+       ERROR-HANDLER...)
+
+The second argument, BODYFORM, is straightforward.  The
+`condition-case' special form causes the Lisp interpreter to evaluate
+the code in BODYFORM.  If no error occurs, the special form returns the
+code's value and produces the side-effects, if any.
+
+In short, the BODYFORM part of a `condition-case' expression determines
+what should happen when everything works correctly.
+
+However, if an error occurs, among its other actions, the function
+generating the error signal will define one or more error condition
+names.
+
+An error handler is the third argument to `condition case'.  An error
+handler has two parts, a CONDITION-NAME and a BODY.  If the
+CONDITION-NAME part of an error handler matches a condition name
+generated by an error, then the BODY part of the error handler is run.
+
+As you will expect, the CONDITION-NAME part of an error handler may be
+either a single condition name or a list of condition names.
+
+Also, a complete `condition-case' expression may contain more than one
+error handler.  When an error occurs, the first applicable handler is
+run.
+
+Lastly, the first argument to the `condition-case' expression, the VAR
+argument, is sometimes bound to a variable that contains information
+about the error.  However, if that argument is nil, as is the case in
+`kill-region', that information is discarded.
+
+In brief, in the `kill-region' function, the code `condition-case'
+works like this:
+
+     IF NO ERRORS, RUN ONLY THIS CODE
+         BUT, IF ERRORS, RUN THIS OTHER CODE.
+
+
+File: eintr,  Node: Lisp macro,  Prev: condition-case,  Up: kill-region
+
+8.2.2 Lisp macro
+----------------
+
+The part of the `condition-case' expression that is evaluated in the
+expectation that all goes well has a `when'.  The code uses `when' to
+determine whether the `string' variable points to text that exists.
+
+A `when' expression is simply a programmers' convenience.  It is an
+`if' without the possibility of an else clause.  In your mind, you can
+replace `when' with `if' and understand what goes on.  That is what the
+Lisp interpreter does.
+
+Technically speaking, `when' is a Lisp macro.  A Lisp "macro" enables
+you to define new control constructs and other language features.  It
+tells the interpreter how to compute another Lisp expression which will
+in turn compute the value.  In this case, the `other expression' is an
+`if' expression.  For more about Lisp macros, see *Note Macros:
+(elisp)Macros.  The C programming language also provides macros.  These
+are different, but also useful.
+
+If the string has content, then another conditional expression is
+executed.  This is an `if' with both a then-part and an else-part.
+
+     (if (eq last-command 'kill-region)
+         (kill-append string (< end beg) yank-handler)
+       (kill-new string nil yank-handler))
+
+The then-part is evaluated if the previous command was another call to
+`kill-region'; if not, the else-part is evaluated.
+
+`yank-handler' is an optional argument to `kill-region' that tells the
+`kill-append' and `kill-new' functions how deal with properties added
+to the text, such as `bold' or `italics'.
+
+`last-command' is a variable that comes with Emacs that we have not
+seen before.  Normally, whenever a function is executed, Emacs sets the
+value of `last-command' to the previous command.
+
+In this segment of the definition, the `if' expression checks whether
+the previous command was `kill-region'.  If it was,
+
+     (kill-append string (< end beg) yank-handler)
+
+concatenates a copy of the newly clipped text to the just previously
+clipped text in the kill ring.
+
+
+File: eintr,  Node: copy-region-as-kill,  Next: Digression into C,  Prev: kill-region,  Up: Cutting & Storing Text
+
+8.3 `copy-region-as-kill'
+=========================
+
+The `copy-region-as-kill' function copies a region of text from a
+buffer and (via either `kill-append' or `kill-new') saves it in the
+`kill-ring'.
+
+If you call `copy-region-as-kill' immediately after a `kill-region'
+command, Emacs appends the newly copied text to the previously copied
+text.  This means that if you yank back the text, you get it all, from
+both this and the previous operation.  On the other hand, if some other
+command precedes the `copy-region-as-kill', the function copies the
+text into a separate entry in the kill ring.
+
+* Menu:
+
+* Complete copy-region-as-kill::
+* copy-region-as-kill body::
+
+
+File: eintr,  Node: Complete copy-region-as-kill,  Next: copy-region-as-kill body,  Prev: copy-region-as-kill,  Up: copy-region-as-kill
+
+The complete `copy-region-as-kill' function definition
+------------------------------------------------------
+
+Here is the complete text of the version 22 `copy-region-as-kill'
+function:
+
+     (defun copy-region-as-kill (beg end)
+       "Save the region as if killed, but don't kill it.
+     In Transient Mark mode, deactivate the mark.
+     If `interprogram-cut-function' is non-nil, also save the text for a window
+     system cut and paste."
+       (interactive "r")
+       (if (eq last-command 'kill-region)
+           (kill-append (filter-buffer-substring beg end) (< end beg))
+         (kill-new (filter-buffer-substring beg end)))
+       (if transient-mark-mode
+           (setq deactivate-mark t))
+       nil)
+
+As usual, this function can be divided into its component parts:
+
+     (defun copy-region-as-kill (ARGUMENT-LIST)
+       "DOCUMENTATION..."
+       (interactive "r")
+       BODY...)
+
+The arguments are `beg' and `end' and the function is interactive with
+`"r"', so the two arguments must refer to the beginning and end of the
+region.  If you have been reading though this document from the
+beginning, understanding these parts of a function is almost becoming
+routine.
+
+The documentation is somewhat confusing unless you remember that the
+word `kill' has a meaning different from usual.  The `Transient Mark'
+and `interprogram-cut-function' comments explain certain side-effects.
+
+After you once set a mark, a buffer always contains a region.  If you
+wish, you can use Transient Mark mode to highlight the region
+temporarily.  (No one wants to highlight the region all the time, so
+Transient Mark mode highlights it only at appropriate times.  Many
+people turn off Transient Mark mode, so the region is never
+highlighted.)
+
+Also, a windowing system allows you to copy, cut, and paste among
+different programs.  In the X windowing system, for example, the
+`interprogram-cut-function' function is `x-select-text', which works
+with the windowing system's equivalent of the Emacs kill ring.
+
+The body of the `copy-region-as-kill' function starts with an `if'
+clause.  What this clause does is distinguish between two different
+situations: whether or not this command is executed immediately after a
+previous `kill-region' command.  In the first case, the new region is
+appended to the previously copied text.  Otherwise, it is inserted into
+the beginning of the kill ring as a separate piece of text from the
+previous piece.
+
+The last two lines of the function prevent the region from lighting up
+if Transient Mark mode is turned on.
+
+The body of `copy-region-as-kill' merits discussion in detail.
+
+
+File: eintr,  Node: copy-region-as-kill body,  Prev: Complete copy-region-as-kill,  Up: copy-region-as-kill
+
+8.3.1 The Body of `copy-region-as-kill'
+---------------------------------------
+
+The `copy-region-as-kill' function works in much the same way as the
+`kill-region' function.  Both are written so that two or more kills in
+a row combine their text into a single entry.  If you yank back the
+text from the kill ring, you get it all in one piece.  Moreover, kills
+that kill forward from the current position of the cursor are added to
+the end of the previously copied text and commands that copy text
+backwards add it to the beginning of the previously copied text.  This
+way, the words in the text stay in the proper order.
+
+Like `kill-region', the `copy-region-as-kill' function makes use of the
+`last-command' variable that keeps track of the previous Emacs command.
+
+* Menu:
+
+* last-command & this-command::
+* kill-append function::
+* kill-new function::
+
+
+File: eintr,  Node: last-command & this-command,  Next: kill-append function,  Prev: copy-region-as-kill body,  Up: copy-region-as-kill body
+
+`last-command' and `this-command'
+.................................
+
+Normally, whenever a function is executed, Emacs sets the value of
+`this-command' to the function being executed (which in this case would
+be `copy-region-as-kill').  At the same time, Emacs sets the value of
+`last-command' to the previous value of `this-command'.
+
+In the first part of the body of the `copy-region-as-kill' function, an
+`if' expression determines whether the value of `last-command' is
+`kill-region'.  If so, the then-part of the `if' expression is
+evaluated; it uses the `kill-append' function to concatenate the text
+copied at this call to the function with the text already in the first
+element (the CAR) of the kill ring.  On the other hand, if the value of
+`last-command' is not `kill-region', then the `copy-region-as-kill'
+function attaches a new element to the kill ring using the `kill-new'
+function.
+
+The `if' expression reads as follows; it uses `eq', which is a function
+we have not yet seen:
+
+       (if (eq last-command 'kill-region)
+           ;; then-part
+           (kill-append  (filter-buffer-substring beg end) (< end beg))
+         ;; else-part
+         (kill-new  (filter-buffer-substring beg end)))
+
+(The `filter-buffer-substring' function returns a filtered substring of
+the buffer, if any.  Optionally--the arguments are not here, so neither
+is done--the function may delete the initial text or return the text
+without its properties; this function is a replacement for the older
+`buffer-substring' function, which came before text properties were
+implemented.)
+
+The `eq' function tests whether its first argument is the same Lisp
+object as its second argument.  The `eq' function is similar to the
+`equal' function in that it is used to test for equality, but differs
+in that it determines whether two representations are actually the same
+object inside the computer, but with different names.  `equal'
+determines whether the structure and contents of two expressions are
+the same.
+
+If the previous command was `kill-region', then the Emacs Lisp
+interpreter calls the `kill-append' function
+
+
+File: eintr,  Node: kill-append function,  Next: kill-new function,  Prev: last-command & this-command,  Up: copy-region-as-kill body
+
+The `kill-append' function
+..........................
+
+The `kill-append' function looks like this:
+
+     (defun kill-append (string before-p &optional yank-handler)
+       "Append STRING to the end of the latest kill in the kill ring.
+     If BEFORE-P is non-nil, prepend STRING to the kill.
+     ... "
+       (let* ((cur (car kill-ring)))
+         (kill-new (if before-p (concat string cur) (concat cur string))
+     	      (or (= (length cur) 0)
+     		  (equal yank-handler (get-text-property 0 'yank-handler cur)))
+     	      yank-handler)))
+
+The `kill-append' function is fairly straightforward.  It uses the
+`kill-new' function, which we will discuss in more detail in a moment.
+
+(Also, the function provides an optional argument called
+`yank-handler'; when invoked, this argument tells the function how to
+deal with properties added to the text, such as `bold' or `italics'.)
+
+It has a `let*' function to set the value of the first element of the
+kill ring to `cur'.  (I do not know why the function does not use `let'
+instead; only one value is set in the expression.  Perhaps this is a
+bug that produces no problems?)
+
+Consider the conditional that is one of the two arguments to
+`kill-new'.  It uses `concat' to concatenate the new text to the CAR of
+the kill ring.  Whether it prepends or appends the text depends on the
+results of an `if' expression:
+
+     (if before-p                            ; if-part
+         (concat string cur)                 ; then-part
+       (concat cur string))                  ; else-part
+
+If the region being killed is before the region that was killed in the
+last command, then it should be prepended before the material that was
+saved in the previous kill; and conversely, if the killed text follows
+what was just killed, it should be appended after the previous text.
+The `if' expression depends on the predicate `before-p' to decide
+whether the newly saved text should be put before or after the
+previously saved text.
+
+The symbol `before-p' is the name of one of the arguments to
+`kill-append'.  When the `kill-append' function is evaluated, it is
+bound to the value returned by evaluating the actual argument.  In this
+case, this is the expression `(< end beg)'.  This expression does not
+directly determine whether the killed text in this command is located
+before or after the kill text of the last command; what it does is
+determine whether the value of the variable `end' is less than the
+value of the variable `beg'.  If it is, it means that the user is most
+likely heading towards the beginning of the buffer.  Also, the result
+of evaluating the predicate expression, `(< end beg)', will be true and
+the text will be prepended before the previous text.  On the other
+hand, if the value of the variable `end' is greater than the value of
+the variable `beg', the text will be appended after the previous text.
+
+When the newly saved text will be prepended, then the string with the
+new text will be concatenated before the old text:
+
+     (concat string cur)
+
+But if the text will be appended, it will be concatenated after the old
+text:
+
+     (concat cur string))
+
+To understand how this works, we first need to review the `concat'
+function.  The `concat' function links together or unites two strings
+of text.  The result is a string.  For example:
+
+     (concat "abc" "def")
+          => "abcdef"
+
+     (concat "new "
+             (car '("first element" "second element")))
+          => "new first element"
+
+     (concat (car
+             '("first element" "second element")) " modified")
+          => "first element modified"
+
+We can now make sense of `kill-append': it modifies the contents of the
+kill ring.  The kill ring is a list, each element of which is saved
+text.  The `kill-append' function uses the `kill-new' function which in
+turn uses the `setcar' function.
+
+
+File: eintr,  Node: kill-new function,  Prev: kill-append function,  Up: copy-region-as-kill body
+
+The `kill-new' function
+.......................
+
+The `kill-new' function looks like this:
+
+     (defun kill-new (string &optional replace yank-handler)
+       "Make STRING the latest kill in the kill ring.
+     Set `kill-ring-yank-pointer' to point to it.
+
+     If `interprogram-cut-function' is non-nil, apply it to STRING.
+     Optional second argument REPLACE non-nil means that STRING will replace
+     the front of the kill ring, rather than being added to the list.
+     ..."
+       (if (> (length string) 0)
+           (if yank-handler
+     	  (put-text-property 0 (length string)
+     			     'yank-handler yank-handler string))
+         (if yank-handler
+     	(signal 'args-out-of-range
+     		(list string "yank-handler specified for empty string"))))
+       (if (fboundp 'menu-bar-update-yank-menu)
+           (menu-bar-update-yank-menu string (and replace (car kill-ring))))
+       (if (and replace kill-ring)
+           (setcar kill-ring string)
+         (push string kill-ring)
+         (if (> (length kill-ring) kill-ring-max)
+     	(setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
+       (setq kill-ring-yank-pointer kill-ring)
+       (if interprogram-cut-function
+           (funcall interprogram-cut-function string (not replace))))
+
+(Notice that the function is not interactive.)
+
+As usual, we can look at this function in parts.
+
+The function definition has an optional `yank-handler' argument, which
+when invoked tells the function how to deal with properties added to
+the text, such as `bold' or `italics'.  We will skip that.
+
+The first line of the documentation makes sense:
+
+     Make STRING the latest kill in the kill ring.
+
+Let's skip over the rest of the documentation for the moment.
+
+Also, let's skip over the initial `if' expression and those lines of
+code involving `menu-bar-update-yank-menu'.  We will explain them below.
+
+The critical lines are these:
+
+       (if (and replace kill-ring)
+           ;; then
+           (setcar kill-ring string)
+         ;; else
+       (push string kill-ring)
+         (setq kill-ring (cons string kill-ring))
+         (if (> (length kill-ring) kill-ring-max)
+             ;; avoid overly long kill ring
+             (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
+       (setq kill-ring-yank-pointer kill-ring)
+       (if interprogram-cut-function
+           (funcall interprogram-cut-function string (not replace))))
+
+The conditional test is `(and replace kill-ring)'.  This will be true
+when two conditions are met:  the kill ring has something in it, and
+the `replace' variable is true.
+
+When the `kill-append' function sets `replace' to be true and when the
+kill ring has at least one item in it, the `setcar' expression is
+executed:
+
+     (setcar kill-ring string)
+
+The `setcar' function actually changes the first element of the
+`kill-ring' list to the value of `string'.  It replaces the first
+element.
+
+On the other hand, if the kill ring is empty, or replace is false, the
+else-part of the condition is executed:
+
+     (push string kill-ring)
+
+`push' puts its first argument onto the second.  It is the same as the
+older
+
+     (setq kill-ring (cons string kill-ring))
+
+or the newer
+
+     (add-to-list kill-ring string)
+
+When it is false, the expression first constructs a new version of the
+kill ring by prepending `string' to the existing kill ring as a new
+element (that is what the `push' does).  Then it executes a second `if'
+clause.  This second `if' clause keeps the kill ring from growing too
+long.
+
+Let's look at these two expressions in order.
+
+The `push' line of the else-part sets the new value of the kill ring to
+what results from adding the string being killed to the old kill ring.
+
+We can see how this works with an example.
+
+First,
+
+     (setq example-list '("here is a clause" "another clause"))
+
+After evaluating this expression with `C-x C-e', you can evaluate
+`example-list' and see what it returns:
+
+     example-list
+          => ("here is a clause" "another clause")
+
+Now, we can add a new element on to this list by evaluating the
+following expression: 
+
+     (push "a third clause" example-list)
+
+When we evaluate `example-list', we find its value is:
+
+     example-list
+          => ("a third clause" "here is a clause" "another clause")
+
+Thus, the third clause is added to the list by `push'.
+
+Now for the second part of the `if' clause.  This expression keeps the
+kill ring from growing too long.  It looks like this:
+
+     (if (> (length kill-ring) kill-ring-max)
+         (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
+
+The code checks whether the length of the kill ring is greater than the
+maximum permitted length.  This is the value of `kill-ring-max' (which
+is 60, by default).  If the length of the kill ring is too long, then
+this code sets the last element of the kill ring to `nil'.  It does
+this by using two functions, `nthcdr' and `setcdr'.
+
+We looked at `setcdr' earlier (*note `setcdr': setcdr.).  It sets the
+CDR of a list, just as `setcar' sets the CAR of a list.  In this case,
+however, `setcdr' will not be setting the CDR of the whole kill ring;
+the `nthcdr' function is used to cause it to set the CDR of the next to
+last element of the kill ring--this means that since the CDR of the
+next to last element is the last element of the kill ring, it will set
+the last element of the kill ring.
+
+The `nthcdr' function works by repeatedly taking the CDR of a list--it
+takes the CDR of the CDR of the CDR ...  It does this N times and
+returns the results.  (*Note `nthcdr': nthcdr.)
+
+Thus, if we had a four element list that was supposed to be three
+elements long, we could set the CDR of the next to last element to
+`nil', and thereby shorten the list.  (If you sent the last element to
+some other value than `nil', which you could do, then you would not
+have shortened the list.  *Note `setcdr': setcdr.)
+
+You can see shortening by evaluating the following three expressions in
+turn.  First set the value of `trees' to `(maple oak pine birch)', then
+set the CDR of its second CDR to `nil' and then find the value of
+`trees':
+
+     (setq trees '(maple oak pine birch))
+          => (maple oak pine birch)
+
+     (setcdr (nthcdr 2 trees) nil)
+          => nil
+
+     trees
+          => (maple oak pine)
+
+(The value returned by the `setcdr' expression is `nil' since that is
+what the CDR is set to.)
+
+To repeat, in `kill-new', the `nthcdr' function takes the CDR a number
+of times that is one less than the maximum permitted size of the kill
+ring and `setcdr' sets the CDR of that element (which will be the rest
+of the elements in the kill ring) to `nil'.  This prevents the kill
+ring from growing too long.
+
+The next to last expression in the `kill-new' function is
+
+     (setq kill-ring-yank-pointer kill-ring)
+
+The `kill-ring-yank-pointer' is a global variable that is set to be the
+`kill-ring'.
+
+Even though the `kill-ring-yank-pointer' is called a `pointer', it is a
+variable just like the kill ring.  However, the name has been chosen to
+help humans understand how the variable is used.  The variable is used
+in functions such as `yank' and `yank-pop' (*note Yanking Text Back:
+Yanking.).
+
+Now, to return to an early expression in the body of the function:
+
+       (if (fboundp 'menu-bar-update-yank-menu)
+            (menu-bar-update-yank-menu string (and replace (car kill-ring))))
+
+It starts with an `if' expression
+
+In this case, the expression tests first to see whether
+`menu-bar-update-yank-menu' exists as a function, and if so, calls it.
+The `fboundp' function returns true if the symbol it is testing has a
+function definition that `is not void'.  If the symbol's function
+definition were void, we would receive an error message, as we did when
+we created errors intentionally (*note Generate an Error Message:
+Making Errors.).
+
+The then-part contains an expression whose first element is the
+function `and'.
+
+The `and' special form evaluates each of its arguments until one of the
+arguments returns a value of `nil', in which case the `and' expression
+returns `nil'; however, if none of the arguments returns a value of
+`nil', the value resulting from evaluating the last argument is
+returned.  (Since such a value is not `nil', it is considered true in
+Emacs Lisp.)  In other words, an `and' expression returns a true value
+only if all its arguments are true.  (*Note Second Buffer Related
+Review::.)
+
+The expression determines whether the second argument to
+`menu-bar-update-yank-menu' is true or not.
+
+`menu-bar-update-yank-menu' is one of the functions that make it
+possible to use the `Select and Paste' menu in the Edit item of a menu
+bar; using a mouse, you can look at the various pieces of text you have
+saved and select one piece to paste.
+
+The last expression in the `kill-new' function adds the newly copied
+string to whatever facility exists for copying and pasting among
+different programs running in a windowing system.  In the X Windowing
+system, for example, the `x-select-text' function takes the string and
+stores it in memory operated by X.  You can paste the string in another
+program, such as an Xterm.
+
+The expression looks like this:
+
+       (if interprogram-cut-function
+           (funcall interprogram-cut-function string (not replace))))
+
+If an `interprogram-cut-function' exists, then Emacs executes
+`funcall', which in turn calls its first argument as a function and
+passes the remaining arguments to it.  (Incidentally, as far as I can
+see, this `if' expression could be replaced by an `and' expression
+similar to the one in the first part of the function.)
+
+We are not going to discuss windowing systems and other programs
+further, but merely note that this is a mechanism that enables GNU
+Emacs to work easily and well with other programs.
+
+This code for placing text in the kill ring, either concatenated with
+an existing element or as a new element, leads us to the code for
+bringing back text that has been cut out of the buffer--the yank
+commands.  However, before discussing the yank commands, it is better
+to learn how lists are implemented in a computer.  This will make clear
+such mysteries as the use of the term `pointer'.
+
+
+File: eintr,  Node: Digression into C,  Next: defvar,  Prev: copy-region-as-kill,  Up: Cutting & Storing Text
+
+8.4 Digression into C
+=====================
+
+The `copy-region-as-kill' function (*note `copy-region-as-kill':
+copy-region-as-kill.) uses the `filter-buffer-substring' function,
+which in turn uses the `delete-and-extract-region' function.  It
+removes the contents of a region and you cannot get them back.
+
+Unlike the other code discussed here, the `delete-and-extract-region'
+function is not written in Emacs Lisp; it is written in C and is one of
+the primitives of the GNU Emacs system.  Since it is very simple, I
+will digress briefly from Lisp and describe it here.
+
+Like many of the other Emacs primitives, `delete-and-extract-region' is
+written as an instance of a C macro, a macro being a template for code.
+The complete macro looks like this:
+
+     DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
+            Sbuffer_substring_no_properties, 2, 2, 0,
+            doc: /* Return the characters of part of the buffer,
+     without the text properties.
+     The two arguments START and END are character positions;
+     they can be in either order.  */)
+          (start, end)
+          Lisp_Object start, end;
+     {
+       register int b, e;
+
+       validate_region (&start, &end);
+       b = XINT (start);
+       e = XINT (end);
+
+       return make_buffer_string (b, e, 0);
+     }
+
+Without going into the details of the macro writing process, let me
+point out that this macro starts with the word `DEFUN'.  The word
+`DEFUN' was chosen since the code serves the same purpose as `defun'
+does in Lisp.  (The `DEFUN' C macro is defined in `emacs/src/lisp.h'.)
+
+The word `DEFUN' is followed by seven parts inside of parentheses:
+
+   * The first part is the name given to the function in Lisp,
+     `delete-and-extract-region'.
+
+   * The second part is the name of the function in C,
+     `Fdelete_and_extract_region'.  By convention, it starts with `F'.
+     Since C does not use hyphens in names, underscores are used
+     instead.
+
+   * The third part is the name for the C constant structure that
+     records information on this function for internal use.  It is the
+     name of the function in C but begins with an `S' instead of an `F'.
+
+   * The fourth and fifth parts specify the minimum and maximum number
+     of arguments the function can have.  This function demands exactly
+     2 arguments.
+
+   * The sixth part is nearly like the argument that follows the
+     `interactive' declaration in a function written in Lisp: a letter
+     followed, perhaps, by a prompt.  The only difference from the Lisp
+     is when the macro is called with no arguments.  Then you write a
+     `0' (which is a `null string'), as in this macro.
+
+     If you were to specify arguments, you would place them between
+     quotation marks.  The C macro for `goto-char' includes `"NGoto
+     char: "' in this position to indicate that the function expects a
+     raw prefix, in this case, a numerical location in a buffer, and
+     provides a prompt.
+
+   * The seventh part is a documentation string, just like the one for a
+     function written in Emacs Lisp, except that every newline must be
+     written explicitly as `\n' followed by a backslash and carriage
+     return.
+
+     Thus, the first two lines of documentation for  `goto-char' are
+     written like this:
+
+            "Set point to POSITION, a number or marker.\n\
+          Beginning of buffer is position (point-min), end is (point-max).
+
+In a C macro, the formal parameters come next, with a statement of what
+kind of object they are, followed by what might be called the `body' of
+the macro.  For `delete-and-extract-region' the `body' consists of the
+following four lines:
+
+     validate_region (&start, &end);
+     if (XINT (start) == XINT (end))
+       return build_string ("");
+     return del_range_1 (XINT (start), XINT (end), 1, 1);
+
+The   `validate_region' function checks whether the values passed as
+the beginning and end of the region are the proper type and are within
+range.  If the beginning and end positions are the same, then return
+and empty string.
+
+The `del_range_1' function actually deletes the text.  It is a complex
+function we will not look into.  It updates the buffer and does other
+things.  However, it is worth looking at the two arguments passed to
+`del_range'.  These are `XINT (start)' and `XINT (end)'.
+
+As far as the C language is concerned, `start' and `end' are two
+integers that mark the beginning and end of the region to be deleted(1).
+
+In early versions of Emacs, these two numbers were thirty-two bits
+long, but the code is slowly being generalized to handle other lengths.
+Three of the available bits are used to specify the type of
+information; the remaining bits are used as `content'.
+
+`XINT' is a C macro that extracts the relevant number from the longer
+collection of bits; the three other bits are discarded.
+
+The command in `delete-and-extract-region' looks like this:
+
+     del_range_1 (XINT (start), XINT (end), 1, 1);
+
+It deletes the region between the beginning position, `start', and the
+ending position, `end'.
+
+From the point of view of the person writing Lisp, Emacs is all very
+simple; but hidden underneath is a great deal of complexity to make it
+all work.
+
+---------- Footnotes ----------
+
+(1) More precisely, and requiring more expert knowledge to understand,
+the two integers are of type `Lisp_Object', which can also be a C union
+instead of an integer type.
+
+
+File: eintr,  Node: defvar,  Next: cons & search-fwd Review,  Prev: Digression into C,  Up: Cutting & Storing Text
+
+8.5 Initializing a Variable with `defvar'
+=========================================
+
+The `copy-region-as-kill' function is written in Emacs Lisp.  Two
+functions within it, `kill-append' and `kill-new', copy a region in a
+buffer and save it in a variable called the `kill-ring'.  This section
+describes how the `kill-ring' variable is created and initialized using
+the `defvar' special form.
+
+(Again we note that the term `kill-ring' is a misnomer.  The text that
+is clipped out of the buffer can be brought back; it is not a ring of
+corpses, but a ring of resurrectable text.)
+
+In Emacs Lisp, a variable such as the `kill-ring' is created and given
+an initial value by using the `defvar' special form.  The name comes
+from "define variable".
+
+The `defvar' special form is similar to `setq' in that it sets the
+value of a variable.  It is unlike `setq' in two ways: first, it only
+sets the value of the variable if the variable does not already have a
+value.  If the variable already has a value, `defvar' does not override
+the existing value.  Second, `defvar' has a documentation string.
+
+(Another special form, `defcustom', is designed for variables that
+people customize.  It has more features than `defvar'.  (*Note Setting
+Variables with `defcustom': defcustom.)
+
+* Menu:
+
+* See variable current value::
+* defvar and asterisk::
+
+
+File: eintr,  Node: See variable current value,  Next: defvar and asterisk,  Prev: defvar,  Up: defvar
+
+Seeing the Current Value of a Variable
+--------------------------------------
+
+You can see the current value of a variable, any variable, by using the
+`describe-variable' function, which is usually invoked by typing `C-h
+v'.  If you type `C-h v' and then `kill-ring' (followed by <RET>) when
+prompted, you will see what is in your current kill ring--this may be
+quite a lot!  Conversely, if you have been doing nothing this Emacs
+session except read this document, you may have nothing in it.  Also,
+you will see the documentation for `kill-ring':
+
+     Documentation:
+     List of killed text sequences.
+     Since the kill ring is supposed to interact nicely with cut-and-paste
+     facilities offered by window systems, use of this variable should
+     interact nicely with `interprogram-cut-function' and
+     `interprogram-paste-function'.  The functions `kill-new',
+     `kill-append', and `current-kill' are supposed to implement this
+     interaction; you may want to use them instead of manipulating the kill
+     ring directly.
+
+The kill ring is defined by a `defvar' in the following way:
+
+     (defvar kill-ring nil
+       "List of killed text sequences.
+     ...")
+
+In this variable definition, the variable is given an initial value of
+`nil', which makes sense, since if you have saved nothing, you want
+nothing back if you give a `yank' command.  The documentation string is
+written just like the documentation string of a `defun'.  As with the
+documentation string of the `defun', the first line of the
+documentation should be a complete sentence, since some commands, like
+`apropos', print only the first line of documentation.  Succeeding
+lines should not be indented; otherwise they look odd when you use `C-h
+v' (`describe-variable').
+