X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/303b49618e536c0bffa45a7382555f4e96372a00..d50daf3f433033738a266d2638098754393a5317:/lispintro/emacs-lisp-intro.texi diff --git a/lispintro/emacs-lisp-intro.texi b/lispintro/emacs-lisp-intro.texi index 00d3a38145..81229eb396 100644 --- a/lispintro/emacs-lisp-intro.texi +++ b/lispintro/emacs-lisp-intro.texi @@ -455,7 +455,7 @@ Install a Function Definition Make a Function Interactive * Interactive multiply-by-seven:: An overview. -* multiply-by-seven in detail:: The interactive version. +* multiply-by-seven in detail:: The interactive version. @code{let} @@ -589,7 +589,7 @@ Cutting and Storing Text @code{copy-region-as-kill} * Complete copy-region-as-kill:: The complete function definition. -* copy-region-as-kill body:: The body of @code{copy-region-as-kill}. +* copy-region-as-kill body:: The body of @code{copy-region-as-kill}. The Body of @code{copy-region-as-kill} @@ -836,11 +836,11 @@ 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:: +* 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:: +* Note for Novices:: You can read this as a novice. * Thank You:: @end menu @@ -1093,16 +1093,16 @@ think about functions now; functions are defined in @ref{Making Errors, , Generate an Error Message}.} Lists are the basis of Lisp. @menu -* Lisp Lists:: -* Run a Program:: -* Making Errors:: -* Names & Definitions:: -* Lisp Interpreter:: -* Evaluation:: -* Variables:: -* Arguments:: -* set & setq:: -* Summary:: +* 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:: @end menu @@ -1132,10 +1132,10 @@ like flowers in a field with a stone wall around them. @cindex Flowers in a field @menu -* Numbers Lists:: -* Lisp Atoms:: -* Whitespace in Lists:: -* Typing 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. @end menu @node Numbers Lists, Lisp Atoms, Lisp Lists, Lisp Lists @@ -1573,8 +1573,8 @@ and attach them to names, and how to do this without confusing either yourself or the computer. @menu -* Complications:: -* Byte Compiling:: +* Complications:: Variables, Special forms, Lists within. +* Byte Compiling:: Specially processing code for speed. @end menu @node Complications, Byte Compiling, Lisp Interpreter, Lisp Interpreter @@ -1645,8 +1645,8 @@ value or amount of; to appraise', according to @cite{Webster's New Collegiate Dictionary}. @menu -* How the Interpreter Acts:: -* Evaluating Inner Lists:: +* How the Interpreter Acts:: Returns and Side Effects... +* Evaluating Inner Lists:: Lists within lists... @end menu @node How the Interpreter Acts, Evaluating Inner Lists, Evaluation, Evaluation @@ -1775,8 +1775,9 @@ function definition, and vice-verse. @menu * fill-column Example:: -* Void Function:: -* Void Variable:: +* Void Function:: The error message for a symbol + without a function. +* Void Variable:: The error message for a symbol without a value. @end menu @node fill-column Example, Void Function, Variables, Variables @@ -1982,11 +1983,14 @@ to it at the same time. By contrast, in Emacs Lisp, a symbol cannot have two different function definitions at the same time.)} @menu -* Data types:: -* Args as Variable or List:: -* Variable Number of Arguments:: -* Wrong Type of Argument:: -* message:: +* 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. @end menu @node Data types, Args as Variable or List, Arguments, Arguments @@ -2356,9 +2360,9 @@ The following sections not only describe how @code{set} and @code{setq} work but also illustrate how arguments are passed. @menu -* Using set:: -* Using setq:: -* Counting:: +* Using set:: Setting values. +* Using setq:: Setting a quoted value. +* Counting:: Using @code{setq} to count. @end menu @node Using set, Using setq, set & setq, set & setq @@ -2628,11 +2632,13 @@ 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:: +* How to Evaluate:: Typing editing commands or @kbd{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:: @end menu @@ -3047,16 +3053,16 @@ symbol refers to it.) @menu * Primitive Functions:: -* defun:: -* Install:: -* Interactive:: -* Interactive Options:: -* Permanent Installation:: -* let:: -* if:: -* else:: -* Truth & Falsehood:: -* save-excursion:: +* defun:: The @code{defun} special form. +* Install:: Install a function definition. +* Interactive:: Making a function interactive. +* Interactive Options:: Different options for @code{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:: @end menu @@ -3295,7 +3301,7 @@ Emacs. To reload code automatically whenever you start Emacs, see @menu * Effect of installation:: -* Change a defun:: +* Change a defun:: How to change a function definition. @end menu @node Effect of installation, Change a defun, Install, Install @@ -3396,8 +3402,8 @@ 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:: +* Interactive multiply-by-seven:: An overview. +* multiply-by-seven in detail:: The interactive version. @end menu @node Interactive multiply-by-seven, multiply-by-seven in detail, Interactive, Interactive @@ -3895,7 +3901,7 @@ such as, ``if it is warm and sunny, then go to the beach!'' @menu * if in more detail:: -* type-of-animal in detail:: +* type-of-animal in detail:: An example of an @code{if} expression. @end menu @node if in more detail, type-of-animal in detail, if, if @@ -4187,7 +4193,7 @@ symbol (other than @code{nil}) such as @code{flowers}, or a list (so long as it is not empty), or even a buffer! @menu -* nil explained:: +* nil explained:: @code{nil} has two meanings. @end menu @node nil explained, , Truth & Falsehood, Truth & Falsehood @@ -4275,7 +4281,7 @@ purpose is to keep the user from being surprised and disturbed by unexpected movement of point or mark. @menu -* Point and mark:: +* Point and mark:: A review of various locations. * Template for save-excursion:: @end menu @@ -4670,11 +4676,13 @@ 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:: +* Finding More:: How to find more information. +* simplified-beginning-of-buffer:: Shows @code{goto-char}, + @code{point-min}, and @code{push-mark}. +* mark-whole-buffer:: Almost the same as @code{beginning-of-buffer}. +* append-to-buffer:: Uses @code{save-excursion} and + @code{insert-buffer-substring}. +* Buffer Related Review:: Review. * Buffer Exercises:: @end menu @@ -4920,7 +4928,7 @@ h}. @menu * mark-whole-buffer overview:: -* Body of mark-whole-buffer:: +* Body of mark-whole-buffer:: Only three lines of code. @end menu @node mark-whole-buffer overview, Body of mark-whole-buffer, mark-whole-buffer, mark-whole-buffer @@ -5056,9 +5064,9 @@ current buffer to a specified buffer. @menu * append-to-buffer overview:: -* append interactive:: -* append-to-buffer body:: -* append save-excursion:: +* append interactive:: A two part interactive expression. +* append-to-buffer body:: Incorporates a @code{let} expression. +* append save-excursion:: How the @code{save-excursion} works. @end menu @node append-to-buffer overview, append interactive, append-to-buffer, append-to-buffer @@ -5572,9 +5580,10 @@ use of an asterisk in an @code{interactive} expression, use of to which the name refers. @menu -* copy-to-buffer:: -* insert-buffer:: -* beginning-of-buffer:: +* copy-to-buffer:: With @code{set-buffer}, @code{get-buffer-create}. +* insert-buffer:: Read-only, and with @code{or}. +* beginning-of-buffer:: Shows @code{goto-char}, + @code{point-min}, and @code{push-mark}. * Second Buffer Related Review:: * optional Exercise:: @end menu @@ -5680,11 +5689,11 @@ 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:: +* insert-buffer interactive:: When you can read, but not write. +* insert-buffer body:: The body has an @code{or} and a @code{let}. +* if & or:: Using an @code{if} instead of an @code{or}. +* Insert or:: How the @code{or} expression works. +* Insert let:: Two @code{save-excursion} expressions. * New insert-buffer:: @end menu @@ -5743,8 +5752,8 @@ declaration has two parts, an asterisk, @samp{*}, and @samp{bInsert buffer:@: }. @menu -* Read-only buffer:: -* b for interactive:: +* Read-only buffer:: When a buffer cannot be modified. +* b for interactive:: An existing buffer or else its name. @end menu @node Read-only buffer, b for interactive, insert-buffer interactive, insert-buffer interactive @@ -6126,7 +6135,7 @@ argument. The use of the argument is optional. @menu * Optional Arguments:: -* beginning-of-buffer opt arg:: +* beginning-of-buffer opt arg:: Example with optional argument. * beginning-of-buffer complete:: @end menu @@ -6607,9 +6616,9 @@ other parts. Narrowing is normally disabled since it can confuse novices. @menu -* Narrowing advantages:: -* save-restriction:: -* what-line:: +* Narrowing advantages:: The advantages of narrowing +* save-restriction:: The @code{save-restriction} special form. +* what-line:: The number of the line that point is on. * narrow Exercise:: @end menu @@ -6938,13 +6947,13 @@ will see @code{cons} as well as two variants on @code{cdr}, namely, @code{setcdr} and @code{nthcdr}. (@xref{copy-region-as-kill}.) @menu -* Strange Names:: -* car & cdr:: -* cons:: -* nthcdr:: +* Strange Names:: An historical aside: why the strange names? +* car & cdr:: Functions for extracting part of a list. +* cons:: Constructing a list. +* nthcdr:: Calling @code{cdr} repeatedly. * nth:: -* setcar:: -* setcdr:: +* setcar:: Changing the first element of a list. +* setcdr:: Changing the rest of a list. * cons Exercise:: @end menu @@ -7126,7 +7135,7 @@ Like @code{car} and @code{cdr}, @code{cons} is non-destructive. @menu * Build a list:: -* length:: +* length:: How to find the length of a list. @end menu @node Build a list, length, cons, cons @@ -7607,12 +7616,12 @@ 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:: +* 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:: @end menu @@ -7704,12 +7713,12 @@ that of error handling. We will walk through the function. But first, let us look at the interactive @code{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:: +* 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 @code{progn} special form. +* Summing up zap-to-char:: Using @code{point} and @code{search-forward}. @end menu @node Complete zap-to-char, zap-to-char interactive, zap-to-char, zap-to-char @@ -8066,8 +8075,8 @@ 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:: +* Complete kill-region:: The function definition. +* condition-case:: Dealing with a problem. * Lisp macro:: @end menu @@ -8436,8 +8445,8 @@ hand, if some other command precedes the @code{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:: +* Complete copy-region-as-kill:: The complete function definition. +* copy-region-as-kill body:: The body of @code{copy-region-as-kill}. @end menu @node Complete copy-region-as-kill, copy-region-as-kill body, copy-region-as-kill, copy-region-as-kill @@ -9663,7 +9672,7 @@ pointed to. Hence, a list is kept as a series of electronic addresses. @menu * Lists diagrammed:: -* Symbols as Chest:: +* Symbols as Chest:: Exploring a powerful metaphor. * List Exercise:: @end menu @@ -10144,8 +10153,8 @@ list is handled as a ring.) @menu * Kill Ring Overview:: -* kill-ring-yank-pointer:: -* yank nthcdr Exercises:: +* kill-ring-yank-pointer:: The kill ring is a list. +* yank nthcdr Exercises:: The @code{kill-ring-yank-pointer} variable. @end menu @node Kill Ring Overview, kill-ring-yank-pointer, Yanking, Yanking @@ -10380,9 +10389,9 @@ increase the values of @code{max-specpdl-size} and 15 and 30 times their default value.}. @menu -* while:: +* while:: Causing a stretch of code to repeat. * dolist dotimes:: -* Recursion:: +* Recursion:: Causing a function to call itself. * Looping exercise:: @end menu @@ -10417,12 +10426,12 @@ The template for a @code{while} expression looks like this: @end smallexample @menu -* Looping with while:: -* Loop Example:: -* print-elements-of-list:: -* Incrementing Loop:: +* Looping with while:: Repeat so long as test returns true. +* Loop Example:: A @code{while} loop that uses a list. +* print-elements-of-list:: Uses @code{while}, @code{car}, @code{cdr}. +* Incrementing Loop:: A loop with an incrementing counter. * Incrementing Loop Details:: -* Decrementing Loop:: +* Decrementing Loop:: A loop with a decrementing counter. @end menu @node Looping with while, Loop Example, while, while @@ -10688,9 +10697,9 @@ Note that you need to set the initial value of @code{count}; usually it is set to 1. @menu -* Incrementing Example:: -* Inc Example parts:: -* Inc Example altogether:: +* Incrementing Example:: Counting pebbles in a triangle. +* Inc Example parts:: The parts of the function definition. +* Inc Example altogether:: Putting the function definition together. @end menu @node Incrementing Example, Inc Example parts, Incrementing Loop Details, Incrementing Loop Details @@ -10996,9 +11005,9 @@ The template for a decrementing @code{while} loop looks like this: @end smallexample @menu -* Decrementing Example:: -* Dec Example parts:: -* Dec Example altogether:: +* Decrementing Example:: More pebbles on the beach. +* Dec Example parts:: The parts of the function definition. +* Dec Example altogether:: Putting the function definition together. @end menu @node Decrementing Example, Dec Example parts, Decrementing Loop, Decrementing Loop @@ -11353,13 +11362,13 @@ different arguments' will become sufficiently different from the first arguments that the final instance will stop. @menu -* Building Robots:: -* Recursive Definition Parts:: -* Recursion with list:: +* 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:: -* No Deferment:: +* Recursive Patterns:: Often used templates. +* No Deferment:: Don't store up work ... * No deferment solution:: @end menu @@ -12399,11 +12408,11 @@ this chapter. @code{forward-paragraph} is a complex function that introduces several new features. @menu -* sentence-end:: -* re-search-forward:: -* forward-sentence:: -* forward-paragraph:: -* etags:: +* sentence-end:: The regular expression for @code{sentence-end}. +* re-search-forward:: Very similar to @code{search-forward}. +* forward-sentence:: A straightforward example of regexp search. +* forward-paragraph:: A somewhat complex example. +* etags:: How to create your own @file{TAGS} table. * Regexp Review:: * re-search Exercises:: @end menu @@ -12649,8 +12658,8 @@ bound to the key command @kbd{M-e}. @menu * Complete forward-sentence:: -* fwd-sentence while loops:: -* fwd-sentence re-search:: +* fwd-sentence while loops:: Two @code{while} loops. +* fwd-sentence re-search:: A regular expression search. @end menu @node Complete forward-sentence, fwd-sentence while loops, forward-sentence, forward-sentence @@ -13108,9 +13117,9 @@ exists, especially when blank lines separate paragraphs. This is an added complication. @menu -* forward-paragraph in brief:: -* fwd-para let:: -* fwd-para while:: +* forward-paragraph in brief:: Key parts of the function definition. +* fwd-para let:: The @code{let*} expression. +* fwd-para while:: The forward motion @code{while} loop. @end menu @node forward-paragraph in brief, fwd-para let, forward-paragraph, forward-paragraph @@ -13804,8 +13813,8 @@ word count commands using @code{while} loops and recursion. @menu * Why Count Words:: -* count-words-region:: -* recursive-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:: @end menu @@ -13851,8 +13860,8 @@ region. This means that word counting is ideally suited to recursion or to a @code{while} loop. @menu -* Design count-words-region:: -* Whitespace Bug:: +* Design count-words-region:: The definition using a @code{while} loop. +* Whitespace Bug:: The Whitespace Bug in @code{count-words-region}. @end menu @node Design count-words-region, Whitespace Bug, count-words-region, count-words-region @@ -14692,15 +14701,15 @@ and this will tell. @menu * Divide and Conquer:: -* Words and Symbols:: -* Syntax:: -* count-words-in-defun:: -* Several defuns:: -* Find a File:: -* lengths-list-file:: -* Several files:: -* Several files recursively:: -* Prepare the data:: +* Words and Symbols:: What to count? +* Syntax:: What constitutes a word or symbol? +* count-words-in-defun:: Very like @code{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. @end menu @node Divide and Conquer, Words and Symbols, Words in a defun, Words in a defun @@ -15366,8 +15375,8 @@ Working on each of a list of files is a repetitious act, so we can use either a @code{while} loop or recursion. @menu -* lengths-list-many-files:: -* append:: +* lengths-list-many-files:: Return a list of the lengths of defuns. +* append:: Attach one list to another. @end menu @node lengths-list-many-files, append, Several files, Several files @@ -15603,8 +15612,8 @@ numbers. @menu * Data for Display in Detail:: -* Sorting:: -* Files List:: +* Sorting:: Sorting lists. +* Files List:: Making a list of files. * Counting function definitions:: @end menu @@ -16297,7 +16306,7 @@ the function to label the axes automatically. @menu * Columns of a graph:: -* graph-body-print:: +* graph-body-print:: How to print the body of a graph. * recursive-graph-body-print:: * Printed Axes:: * Line Graph Exercise:: @@ -16956,20 +16965,20 @@ expressions in Emacs Lisp you can change or extend Emacs. @menu * Default Configuration:: -* Site-wide Init:: -* defcustom:: -* Beginning a .emacs File:: -* Text and Auto-fill:: -* Mail Aliases:: -* Indent Tabs Mode:: -* Keybindings:: -* Keymaps:: -* Loading Files:: -* Autoload:: -* Simple Extension:: -* X11 Colors:: +* 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 @code{.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 X. * Miscellaneous:: -* Mode Line:: +* Mode Line:: How to customize your mode line. @end menu @node Default Configuration, Site-wide Init, Emacs Initialization, Emacs Initialization @@ -18422,10 +18431,10 @@ Debugging Lisp Programs, elisp, The GNU Emacs Lisp Reference Manual}. In this chapter, I will walk through a short example of each. @menu -* debug:: -* debug-on-entry:: -* debug-on-quit:: -* edebug:: +* 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 @kbd{C-g}. +* edebug:: How to use Edebug, a source level debugger. * Debugging Exercises:: @end menu @@ -19149,8 +19158,8 @@ consider the workings of the kill ring. @menu * What the Kill Ring Does:: * current-kill:: -* yank:: -* yank-pop:: +* yank:: Paste a copy of a clipped element. +* yank-pop:: Insert element pointed to. * ring file:: @end menu @@ -19331,7 +19340,7 @@ documentation string. It is @emph{not} interactive. @menu * Body of current-kill:: -* Digression concerning error:: +* Digression concerning error:: How to mislead humans, but not computers. * Determining the Element:: @end menu @@ -19756,10 +19765,10 @@ body itself. @menu * Labelled Example:: -* print-graph Varlist:: -* print-Y-axis:: -* print-X-axis:: -* Print Whole Graph:: +* print-graph Varlist:: @code{let} expression in @code{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. @end menu @node Labelled Example, print-graph Varlist, Full Graph, Full Graph @@ -19924,11 +19933,11 @@ construct and insert the appropriate numbers and marks. @menu * print-Y-axis in Detail:: -* Height of label:: -* Compute a Remainder:: -* Y Axis Element:: -* Y-axis-column:: -* print-Y-axis Penultimate:: +* 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. @end menu @node print-Y-axis in Detail, Height of label, print-Y-axis, print-Y-axis @@ -20380,8 +20389,8 @@ the width of the symbols that you are using to print the body of the graph without changing the ways the graph is labelled. @menu -* Similarities differences:: -* X Axis Tic Marks:: +* Similarities differences:: Much like @code{print-Y-axis}, but not exactly. +* X Axis Tic Marks:: Create tic marks for the horizontal axis. @end menu @node Similarities differences, X Axis Tic Marks, print-X-axis, print-X-axis @@ -20729,13 +20738,13 @@ Here is the outline: @end smallexample @menu -* The final version:: -* Test print-graph:: -* Graphing words in defuns:: -* lambda:: -* mapcar:: -* Another Bug:: -* Final printed 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 @dots{} most insidious. +* Final printed graph:: The graph itself! @end menu @node The final version, Test print-graph, Print Whole Graph, Print Whole Graph