Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / doc / lispintro / emacs-lisp-intro.texi
CommitLineData
8cda6f8f
GM
1\input texinfo @c -*-texinfo-*-
2@comment %**start of header
fb3dc846 3@setfilename ../../info/eintr
8cda6f8f
GM
4@c setfilename emacs-lisp-intro.info
5@c sethtmlfilename emacs-lisp-intro.html
6@settitle Programming in Emacs Lisp
7@syncodeindex vr cp
8@syncodeindex fn cp
8cda6f8f
GM
9@finalout
10
11@c ---------
12@c <<<< For hard copy printing, this file is now
13@c set for smallbook, which works for all sizes
7877f373 14@c of paper, and with PostScript figures >>>>
a9097c6d
KB
15@set smallbook
16@ifset smallbook
8cda6f8f
GM
17@smallbook
18@clear largebook
a9097c6d 19@end ifset
8cda6f8f
GM
20@set print-postscript-figures
21@c set largebook
22@c clear print-postscript-figures
23@c ---------
24
25@comment %**end of header
26
a9097c6d 27@c per rms and peterb, use 10pt fonts for the main text, mostly to
867d4bb3 28@c save on paper cost.
a9097c6d
KB
29@c Do this inside @tex for now, so current makeinfo does not complain.
30@tex
31@ifset smallbook
32@fonttextsize 10
6e3da0ae 33
a9097c6d
KB
34@end ifset
35\global\hbadness=6666 % don't worry about not-too-underfull boxes
36@end tex
37
6e3da0ae
RC
38@set edition-number 3.10
39@set update-date 28 October 2009
45cf6cbd 40
8cda6f8f
GM
41@ignore
42 ## Summary of shell commands to create various output formats:
43
44 pushd /usr/local/src/emacs/lispintro/
45 ## pushd /u/intro/
46
47 ## Info output
48 makeinfo --paragraph-indent=0 --verbose emacs-lisp-intro.texi
49
50 ## ;; (progn (when (bufferp (get-buffer "*info*")) (kill-buffer "*info*")) (info "/usr/local/src/emacs/info/eintr"))
51
52 ## DVI output
53 texi2dvi emacs-lisp-intro.texi
54
55 ## xdvi -margins 24pt -topmargin 4pt -offsets 24pt -geometry 760x1140 -s 5 -useTeXpages -mousemode 1 emacs-lisp-intro.dvi &
56
57 ## HTML output
58 makeinfo --html --no-split --verbose emacs-lisp-intro.texi
59
60 ## galeon emacs-lisp-intro.html
61
62 ## Plain text output
63 makeinfo --fill-column=70 --no-split --paragraph-indent=0 \
64 --verbose --no-headers --output=emacs-lisp-intro.txt emacs-lisp-intro.texi
65
66 popd
67
68# as user `root'
69# insert thumbdrive
70 mtusb # mount -v -t ext3 /dev/sda /mnt
71 cp -v /u/intro/emacs-lisp-intro.texi /mnt/backup/intro/emacs-lisp-intro.texi
72 umtusb # umount -v /mnt
73# remove thumbdrive
74
75 ## Other shell commands
76
77 pushd /usr/local/src/emacs/lispintro/
78 ## pushd /u/intro/
79
80 ## PDF
81 texi2dvi --pdf emacs-lisp-intro.texi
82 # xpdf emacs-lisp-intro.pdf &
83
84 ## DocBook -- note file extension
85 makeinfo --docbook --no-split --paragraph-indent=0 \
86 --verbose --output=emacs-lisp-intro.docbook emacs-lisp-intro.texi
87
88 ## XML with a Texinfo DTD -- note file extension
89 makeinfo --xml --no-split --paragraph-indent=0 \
90 --verbose --output=emacs-lisp-intro.texinfoxml emacs-lisp-intro.texi
91
92 ## PostScript (needs DVI)
93 # gv emacs-lisp-intro.ps &
94 # Create DVI if we lack it
95 # texi2dvi emacs-lisp-intro.texi
96 dvips emacs-lisp-intro.dvi -o emacs-lisp-intro.ps
97
98 ## RTF (needs HTML)
99 # Use OpenOffice to view RTF
100 # Create HTML if we lack it
101 # makeinfo --no-split --html emacs-lisp-intro.texi
102 /usr/local/src/html2rtf.pl emacs-lisp-intro.html
103
104 ## LaTeX (needs RTF)
105 /usr/bin/rtf2latex emacs-lisp-intro.rtf
106
107 popd
108
109@end ignore
110
111@c ================ Included Figures ================
112
113@c Set print-postscript-figures if you print PostScript figures.
114@c If you clear this, the ten figures will be printed as ASCII diagrams.
115@c (This is not relevant to Info, since Info only handles ASCII.)
116@c Your site may require editing changes to print PostScript; in this
117@c case, search for `print-postscript-figures' and make appropriate changes.
118
119@c ================ How to Create an Info file ================
120
121@c If you have `makeinfo' installed, run the following command
122
123@c makeinfo emacs-lisp-intro.texi
124
125@c or, if you want a single, large Info file, and no paragraph indents:
126@c makeinfo --no-split --paragraph-indent=0 --verbose emacs-lisp-intro.texi
127
128@c After creating the Info file, edit your Info `dir' file, if the
129@c `dircategory' section below does not enable your system to
130@c install the manual automatically.
131@c (The `dir' file is often in the `/usr/local/share/info/' directory.)
132
133@c ================ How to Create an HTML file ================
134
135@c To convert to HTML format
136@c makeinfo --html --no-split --verbose emacs-lisp-intro.texi
137
138@c ================ How to Print a Book in Various Sizes ================
139
140@c This book can be printed in any of three different sizes.
141@c In the above header, set @-commands appropriately.
142
143@c 7 by 9.25 inches:
144@c @smallbook
145@c @clear largebook
146
147@c 8.5 by 11 inches:
148@c @c smallbook
149@c @set largebook
150
151@c European A4 size paper:
152@c @c smallbook
153@c @afourpaper
154@c @set largebook
155
156@c ================ How to Typeset and Print ================
157
158@c If you do not include PostScript figures, run either of the
159@c following command sequences, or similar commands suited to your
160@c system:
161
162@c texi2dvi emacs-lisp-intro.texi
163@c lpr -d emacs-lisp-intro.dvi
164
165@c or else:
166
167@c tex emacs-lisp-intro.texi
168@c texindex emacs-lisp-intro.??
169@c tex emacs-lisp-intro.texi
170@c lpr -d emacs-lisp-intro.dvi
171
172@c If you include the PostScript figures, and you have old software,
173@c you may need to convert the .dvi file to a .ps file before
174@c printing. Run either of the following command sequences, or one
175@c similar:
176@c
177@c dvips -f < emacs-lisp-intro.dvi > emacs-lisp-intro.ps
178@c
179@c or else:
180@c
181@c postscript -p < emacs-lisp-intro.dvi > emacs-lisp-intro.ps
182@c
183
184@c (Note: if you edit the book so as to change the length of the
185@c table of contents, you may have to change the value of `pageno' below.)
186
187@c ================ End of Formatting Sections ================
188
189@c For next or subsequent edition:
190@c create function using with-output-to-temp-buffer
191@c create a major mode, with keymaps
192@c run an asynchronous process, like grep or diff
193
194@c For 8.5 by 11 inch format: do not use such a small amount of
195@c whitespace between paragraphs as smallbook format
196@ifset largebook
197@tex
198\global\parskip 6pt plus 1pt
199@end tex
200@end ifset
201
202@c For all sized formats: print within-book cross
203@c reference with ``...'' rather than [...]
204
205@c This works with the texinfo.tex file, version 2003-05-04.08,
206@c in the Texinfo version 4.6 of the 2003 Jun 13 distribution.
207
208@tex
209\if \xrefprintnodename
210 \global\def\xrefprintnodename#1{\unskip, ``#1''}
211 \else
212 \global\def\xrefprintnodename#1{ ``#1''}
213\fi
214% \global\def\xrefprintnodename#1{, ``#1''}
215@end tex
216
217@c ----------------------------------------------------
218
e979a521 219@dircategory GNU Emacs Lisp
8cda6f8f
GM
220@direntry
221* Emacs Lisp Intro: (eintr).
222 A simple introduction to Emacs Lisp programming.
223@end direntry
224
225@copying
226This is an @cite{Introduction to Programming in Emacs Lisp}, for
227people who are not programmers.
228@sp 1
229Edition @value{edition-number}, @value{update-date}
230@sp 1
acaf905b 231Copyright @copyright{} 1990-1995, 1997, 2001-2012 Free Software Foundation, Inc.
8cda6f8f
GM
232@sp 1
233
234@iftex
235Published by the:@*
236
237GNU Press, @hfill @uref{http://www.gnupress.org}@*
238a division of the @hfill General: @email{press@@gnu.org}@*
239Free Software Foundation, Inc. @hfill Orders:@w{ } @email{sales@@gnu.org}@*
24051 Franklin Street, Fifth Floor @hfill Tel: +1 (617) 542-5942@*
241Boston, MA 02110-1301 USA @hfill Fax: +1 (617) 542-2652@*
242@end iftex
243
244@ifnottex
245Published by the:
246
247@example
248GNU Press, Website: http://www.gnupress.org
249a division of the General: press@@gnu.org
250Free Software Foundation, Inc. Orders: sales@@gnu.org
25151 Franklin Street, Fifth Floor Tel: +1 (617) 542-5942
252Boston, MA 02110-1301 USA Fax: +1 (617) 542-2652
253@end example
254@end ifnottex
255
256@sp 1
257@c Printed copies are available for $30 each.@*
258ISBN 1-882114-43-4
259
260Permission is granted to copy, distribute and/or modify this document
e41dfb1e 261under the terms of the GNU Free Documentation License, Version 1.3 or
8cda6f8f
GM
262any later version published by the Free Software Foundation; there
263being no Invariant Section, with the Front-Cover Texts being ``A GNU
264Manual'', and with the Back-Cover Texts as in (a) below. A copy of
265the license is included in the section entitled ``GNU Free
266Documentation License''.
267
868a6b71
RC
268(a) The FSF's Back-Cover Text is: ``You have the freedom to
269copy and modify this GNU manual. Buying copies from the FSF
270supports it in developing GNU and promoting software freedom.''
8cda6f8f
GM
271@end copying
272
273@c half title; two lines here, so do not use `shorttitlepage'
274@tex
275{\begingroup%
276 \hbox{}\vskip 1.5in \chaprm \centerline{An Introduction to}%
277 \endgroup}%
278{\begingroup\hbox{}\vskip 0.25in \chaprm%
279 \centerline{Programming in Emacs Lisp}%
280 \endgroup\page\hbox{}\page}
281@end tex
282
283@titlepage
284@sp 6
285@center @titlefont{An Introduction to}
286@sp 2
287@center @titlefont{Programming in Emacs Lisp}
288@sp 2
289@center Revised Third Edition
290@sp 4
291@center by Robert J. Chassell
292
293@page
294@vskip 0pt plus 1filll
295@insertcopying
296@end titlepage
297
298@iftex
299@headings off
300@evenheading @thispage @| @| @thischapter
301@oddheading @thissection @| @| @thispage
302@end iftex
303
304@ifnothtml
305@c Keep T.O.C. short by tightening up for largebook
306@ifset largebook
307@tex
308\global\parskip 2pt plus 1pt
309\global\advance\baselineskip by -1pt
310@end tex
311@end ifset
312@end ifnothtml
313
314@shortcontents
315@contents
316
317@ifnottex
318@node Top, Preface, (dir), (dir)
319@top An Introduction to Programming in Emacs Lisp
320
321@insertcopying
322
323This master menu first lists each chapter and index; then it lists
324every node in every chapter.
325@end ifnottex
326
327@c >>>> Set pageno appropriately <<<<
328
329@c The first page of the Preface is a roman numeral; it is the first
330@c right handed page after the Table of Contents; hence the following
331@c setting must be for an odd negative number.
332
a9097c6d
KB
333@c iftex
334@c global@pageno = -11
335@c end iftex
8cda6f8f
GM
336
337@menu
338* Preface:: What to look for.
339* List Processing:: What is Lisp?
340* Practicing Evaluation:: Running several programs.
341* Writing Defuns:: How to write function definitions.
342* Buffer Walk Through:: Exploring a few buffer-related functions.
343* More Complex:: A few, even more complex functions.
344* Narrowing & Widening:: Restricting your and Emacs attention to
345 a region.
346* car cdr & cons:: Fundamental functions in Lisp.
347* Cutting & Storing Text:: Removing text and saving it.
348* List Implementation:: How lists are implemented in the computer.
349* Yanking:: Pasting stored text.
350* Loops & Recursion:: How to repeat a process.
351* Regexp Search:: Regular expression searches.
352* Counting Words:: A review of repetition and regexps.
353* Words in a defun:: Counting words in a @code{defun}.
354* Readying a Graph:: A prototype graph printing function.
355* Emacs Initialization:: How to write a @file{.emacs} file.
356* Debugging:: How to run the Emacs Lisp debuggers.
357* Conclusion:: Now you have the basics.
358* the-the:: An appendix: how to find reduplicated words.
359* Kill Ring:: An appendix: how the kill ring works.
09e80d9f 360* Full Graph:: How to create a graph with labeled axes.
8cda6f8f
GM
361* Free Software and Free Manuals::
362* GNU Free Documentation License::
363* Index::
364* About the Author::
365
366@detailmenu
367 --- The Detailed Node Listing ---
368
369Preface
370
371* Why:: Why learn Emacs Lisp?
372* On Reading this Text:: Read, gain familiarity, pick up habits....
373* Who You Are:: For whom this is written.
374* Lisp History::
375* Note for Novices:: You can read this as a novice.
376* Thank You::
377
378List Processing
379
380* Lisp Lists:: What are lists?
381* Run a Program:: Any list in Lisp is a program ready to run.
382* Making Errors:: Generating an error message.
383* Names & Definitions:: Names of symbols and function definitions.
384* Lisp Interpreter:: What the Lisp interpreter does.
385* Evaluation:: Running a program.
386* Variables:: Returning a value from a variable.
387* Arguments:: Passing information to a function.
388* set & setq:: Setting the value of a variable.
389* Summary:: The major points.
390* Error Message Exercises::
391
392Lisp Lists
393
394* Numbers Lists:: List have numbers, other lists, in them.
395* Lisp Atoms:: Elemental entities.
396* Whitespace in Lists:: Formatting lists to be readable.
397* Typing Lists:: How GNU Emacs helps you type lists.
398
399The Lisp Interpreter
400
401* Complications:: Variables, Special forms, Lists within.
402* Byte Compiling:: Specially processing code for speed.
403
404Evaluation
405
406* How the Interpreter Acts:: Returns and Side Effects...
407* Evaluating Inner Lists:: Lists within lists...
408
409Variables
410
411* fill-column Example::
412* Void Function:: The error message for a symbol
413 without a function.
414* Void Variable:: The error message for a symbol without a value.
415
416Arguments
417
418* Data types:: Types of data passed to a function.
419* Args as Variable or List:: An argument can be the value
420 of a variable or list.
421* Variable Number of Arguments:: Some functions may take a
422 variable number of arguments.
423* Wrong Type of Argument:: Passing an argument of the wrong type
424 to a function.
425* message:: A useful function for sending messages.
426
427Setting the Value of a Variable
428
429* Using set:: Setting values.
430* Using setq:: Setting a quoted value.
431* Counting:: Using @code{setq} to count.
432
433Practicing Evaluation
434
435* How to Evaluate:: Typing editing commands or @kbd{C-x C-e}
436 causes evaluation.
437* Buffer Names:: Buffers and files are different.
438* Getting Buffers:: Getting a buffer itself, not merely its name.
439* Switching Buffers:: How to change to another buffer.
440* Buffer Size & Locations:: Where point is located and the size of
441 the buffer.
442* Evaluation Exercise::
443
444How To Write Function Definitions
445
446* Primitive Functions::
447* defun:: The @code{defun} special form.
448* Install:: Install a function definition.
449* Interactive:: Making a function interactive.
450* Interactive Options:: Different options for @code{interactive}.
451* Permanent Installation:: Installing code permanently.
452* let:: Creating and initializing local variables.
453* if:: What if?
454* else:: If--then--else expressions.
455* Truth & Falsehood:: What Lisp considers false and true.
456* save-excursion:: Keeping track of point, mark, and buffer.
457* Review::
458* defun Exercises::
459
460Install a Function Definition
461
462* Effect of installation::
463* Change a defun:: How to change a function definition.
464
465Make a Function Interactive
466
467* Interactive multiply-by-seven:: An overview.
468* multiply-by-seven in detail:: The interactive version.
469
470@code{let}
471
472* Prevent confusion::
473* Parts of let Expression::
474* Sample let Expression::
475* Uninitialized let Variables::
476
477The @code{if} Special Form
478
479* if in more detail::
480* type-of-animal in detail:: An example of an @code{if} expression.
481
482Truth and Falsehood in Emacs Lisp
483
484* nil explained:: @code{nil} has two meanings.
485
486@code{save-excursion}
487
488* Point and mark:: A review of various locations.
489* Template for save-excursion::
490
491A Few Buffer--Related Functions
492
493* Finding More:: How to find more information.
494* simplified-beginning-of-buffer:: Shows @code{goto-char},
495 @code{point-min}, and @code{push-mark}.
496* mark-whole-buffer:: Almost the same as @code{beginning-of-buffer}.
497* append-to-buffer:: Uses @code{save-excursion} and
498 @code{insert-buffer-substring}.
499* Buffer Related Review:: Review.
500* Buffer Exercises::
501
502The Definition of @code{mark-whole-buffer}
503
504* mark-whole-buffer overview::
505* Body of mark-whole-buffer:: Only three lines of code.
506
507The Definition of @code{append-to-buffer}
508
509* append-to-buffer overview::
510* append interactive:: A two part interactive expression.
511* append-to-buffer body:: Incorporates a @code{let} expression.
512* append save-excursion:: How the @code{save-excursion} works.
513
514A Few More Complex Functions
515
516* copy-to-buffer:: With @code{set-buffer}, @code{get-buffer-create}.
517* insert-buffer:: Read-only, and with @code{or}.
518* beginning-of-buffer:: Shows @code{goto-char},
519 @code{point-min}, and @code{push-mark}.
520* Second Buffer Related Review::
521* optional Exercise::
522
523The Definition of @code{insert-buffer}
524
525* insert-buffer code::
526* insert-buffer interactive:: When you can read, but not write.
527* insert-buffer body:: The body has an @code{or} and a @code{let}.
528* if & or:: Using an @code{if} instead of an @code{or}.
529* Insert or:: How the @code{or} expression works.
530* Insert let:: Two @code{save-excursion} expressions.
531* New insert-buffer::
532
533The Interactive Expression in @code{insert-buffer}
534
535* Read-only buffer:: When a buffer cannot be modified.
536* b for interactive:: An existing buffer or else its name.
537
538Complete Definition of @code{beginning-of-buffer}
539
540* Optional Arguments::
541* beginning-of-buffer opt arg:: Example with optional argument.
542* beginning-of-buffer complete::
543
544@code{beginning-of-buffer} with an Argument
545
546* Disentangle beginning-of-buffer::
547* Large buffer case::
548* Small buffer case::
549
550Narrowing and Widening
551
552* Narrowing advantages:: The advantages of narrowing
553* save-restriction:: The @code{save-restriction} special form.
554* what-line:: The number of the line that point is on.
555* narrow Exercise::
556
557@code{car}, @code{cdr}, @code{cons}: Fundamental Functions
558
559* Strange Names:: An historical aside: why the strange names?
560* car & cdr:: Functions for extracting part of a list.
561* cons:: Constructing a list.
562* nthcdr:: Calling @code{cdr} repeatedly.
563* nth::
564* setcar:: Changing the first element of a list.
565* setcdr:: Changing the rest of a list.
566* cons Exercise::
567
568@code{cons}
569
570* Build a list::
571* length:: How to find the length of a list.
572
573Cutting and Storing Text
574
575* Storing Text:: Text is stored in a list.
576* zap-to-char:: Cutting out text up to a character.
577* kill-region:: Cutting text out of a region.
578* copy-region-as-kill:: A definition for copying text.
579* Digression into C:: Minor note on C programming language macros.
580* defvar:: How to give a variable an initial value.
581* cons & search-fwd Review::
582* search Exercises::
583
584@code{zap-to-char}
585
586* Complete zap-to-char:: The complete implementation.
587* zap-to-char interactive:: A three part interactive expression.
588* zap-to-char body:: A short overview.
589* search-forward:: How to search for a string.
590* progn:: The @code{progn} special form.
591* Summing up zap-to-char:: Using @code{point} and @code{search-forward}.
592
593@code{kill-region}
594
595* Complete kill-region:: The function definition.
596* condition-case:: Dealing with a problem.
597* Lisp macro::
598
599@code{copy-region-as-kill}
600
601* Complete copy-region-as-kill:: The complete function definition.
602* copy-region-as-kill body:: The body of @code{copy-region-as-kill}.
603
604The Body of @code{copy-region-as-kill}
605
606* last-command & this-command::
607* kill-append function::
608* kill-new function::
609
610Initializing a Variable with @code{defvar}
611
612* See variable current value::
613* defvar and asterisk::
614
615How Lists are Implemented
616
617* Lists diagrammed::
618* Symbols as Chest:: Exploring a powerful metaphor.
619* List Exercise::
620
621Yanking Text Back
622
623* Kill Ring Overview::
624* kill-ring-yank-pointer:: The kill ring is a list.
625* yank nthcdr Exercises:: The @code{kill-ring-yank-pointer} variable.
626
627Loops and Recursion
628
629* while:: Causing a stretch of code to repeat.
630* dolist dotimes::
631* Recursion:: Causing a function to call itself.
632* Looping exercise::
633
634@code{while}
635
636* Looping with while:: Repeat so long as test returns true.
637* Loop Example:: A @code{while} loop that uses a list.
638* print-elements-of-list:: Uses @code{while}, @code{car}, @code{cdr}.
639* Incrementing Loop:: A loop with an incrementing counter.
640* Incrementing Loop Details::
641* Decrementing Loop:: A loop with a decrementing counter.
642
643Details of an Incrementing Loop
644
645* Incrementing Example:: Counting pebbles in a triangle.
646* Inc Example parts:: The parts of the function definition.
647* Inc Example altogether:: Putting the function definition together.
648
649Loop with a Decrementing Counter
650
651* Decrementing Example:: More pebbles on the beach.
652* Dec Example parts:: The parts of the function definition.
653* Dec Example altogether:: Putting the function definition together.
654
655Save your time: @code{dolist} and @code{dotimes}
656
657* dolist::
658* dotimes::
659
660Recursion
661
662* Building Robots:: Same model, different serial number ...
663* Recursive Definition Parts:: Walk until you stop ...
664* Recursion with list:: Using a list as the test whether to recurse.
665* Recursive triangle function::
666* Recursion with cond::
667* Recursive Patterns:: Often used templates.
668* No Deferment:: Don't store up work ...
669* No deferment solution::
670
671Recursion in Place of a Counter
672
673* Recursive Example arg of 1 or 2::
674* Recursive Example arg of 3 or 4::
675
676Recursive Patterns
677
678* Every::
679* Accumulate::
680* Keep::
681
682Regular Expression Searches
683
684* sentence-end:: The regular expression for @code{sentence-end}.
685* re-search-forward:: Very similar to @code{search-forward}.
686* forward-sentence:: A straightforward example of regexp search.
687* forward-paragraph:: A somewhat complex example.
688* etags:: How to create your own @file{TAGS} table.
689* Regexp Review::
690* re-search Exercises::
691
692@code{forward-sentence}
693
694* Complete forward-sentence::
695* fwd-sentence while loops:: Two @code{while} loops.
696* fwd-sentence re-search:: A regular expression search.
697
698@code{forward-paragraph}: a Goldmine of Functions
699
700* forward-paragraph in brief:: Key parts of the function definition.
701* fwd-para let:: The @code{let*} expression.
702* fwd-para while:: The forward motion @code{while} loop.
703
704Counting: Repetition and Regexps
ea4f7750
GM
705@set COUNT-WORDS count-words-example
706@c Length of variable name chosen so that things still line up when expanded.
8cda6f8f
GM
707
708* Why Count Words::
ea4f7750 709* @value{COUNT-WORDS}:: Use a regexp, but find a problem.
8cda6f8f
GM
710* recursive-count-words:: Start with case of no words in region.
711* Counting Exercise::
712
ea4f7750 713The @code{@value{COUNT-WORDS}} Function
8cda6f8f 714
ea4f7750
GM
715* Design @value{COUNT-WORDS}:: The definition using a @code{while} loop.
716* Whitespace Bug:: The Whitespace Bug in @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
717
718Counting Words in a @code{defun}
719
720* Divide and Conquer::
721* Words and Symbols:: What to count?
722* Syntax:: What constitutes a word or symbol?
ea4f7750 723* count-words-in-defun:: Very like @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
724* Several defuns:: Counting several defuns in a file.
725* Find a File:: Do you want to look at a file?
726* lengths-list-file:: A list of the lengths of many definitions.
727* Several files:: Counting in definitions in different files.
728* Several files recursively:: Recursively counting in different files.
729* Prepare the data:: Prepare the data for display in a graph.
730
731Count Words in @code{defuns} in Different Files
732
733* lengths-list-many-files:: Return a list of the lengths of defuns.
734* append:: Attach one list to another.
735
736Prepare the Data for Display in a Graph
737
738* Data for Display in Detail::
739* Sorting:: Sorting lists.
740* Files List:: Making a list of files.
741* Counting function definitions::
742
743Readying a Graph
744
745* Columns of a graph::
746* graph-body-print:: How to print the body of a graph.
747* recursive-graph-body-print::
748* Printed Axes::
749* Line Graph Exercise::
750
751Your @file{.emacs} File
752
753* Default Configuration::
754* Site-wide Init:: You can write site-wide init files.
755* defcustom:: Emacs will write code for you.
756* Beginning a .emacs File:: How to write a @code{.emacs file}.
757* Text and Auto-fill:: Automatically wrap lines.
758* Mail Aliases:: Use abbreviations for email addresses.
759* Indent Tabs Mode:: Don't use tabs with @TeX{}
760* Keybindings:: Create some personal keybindings.
761* Keymaps:: More about key binding.
762* Loading Files:: Load (i.e., evaluate) files automatically.
763* Autoload:: Make functions available.
764* Simple Extension:: Define a function; bind it to a key.
765* X11 Colors:: Colors in X.
766* Miscellaneous::
767* Mode Line:: How to customize your mode line.
768
769Debugging
770
771* debug:: How to use the built-in debugger.
772* debug-on-entry:: Start debugging when you call a function.
773* debug-on-quit:: Start debugging when you quit with @kbd{C-g}.
774* edebug:: How to use Edebug, a source level debugger.
775* Debugging Exercises::
776
777Handling the Kill Ring
778
779* What the Kill Ring Does::
780* current-kill::
781* yank:: Paste a copy of a clipped element.
782* yank-pop:: Insert element pointed to.
783* ring file::
784
785The @code{current-kill} Function
786
45d77375 787* Code for current-kill::
8cda6f8f
GM
788* Understanding current-kill::
789
790@code{current-kill} in Outline
791
792* Body of current-kill::
793* Digression concerning error:: How to mislead humans, but not computers.
794* Determining the Element::
795
09e80d9f 796A Graph with Labeled Axes
8cda6f8f 797
09e80d9f 798* Labeled Example::
8cda6f8f
GM
799* print-graph Varlist:: @code{let} expression in @code{print-graph}.
800* print-Y-axis:: Print a label for the vertical axis.
801* print-X-axis:: Print a horizontal label.
802* Print Whole Graph:: The function to print a complete graph.
803
804The @code{print-Y-axis} Function
805
806* print-Y-axis in Detail::
807* Height of label:: What height for the Y axis?
808* Compute a Remainder:: How to compute the remainder of a division.
809* Y Axis Element:: Construct a line for the Y axis.
810* Y-axis-column:: Generate a list of Y axis labels.
811* print-Y-axis Penultimate:: A not quite final version.
812
813The @code{print-X-axis} Function
814
815* Similarities differences:: Much like @code{print-Y-axis}, but not exactly.
816* X Axis Tic Marks:: Create tic marks for the horizontal axis.
817
818Printing the Whole Graph
819
820* The final version:: A few changes.
821* Test print-graph:: Run a short test.
822* Graphing words in defuns:: Executing the final code.
823* lambda:: How to write an anonymous function.
824* mapcar:: Apply a function to elements of a list.
825* Another Bug:: Yet another bug @dots{} most insidious.
826* Final printed graph:: The graph itself!
827
828@end detailmenu
829@end menu
830
831@node Preface, List Processing, Top, Top
832@comment node-name, next, previous, up
833@unnumbered Preface
834
835Most of the GNU Emacs integrated environment is written in the programming
836language called Emacs Lisp. The code written in this programming
837language is the software---the sets of instructions---that tell the
838computer what to do when you give it commands. Emacs is designed so
839that you can write new code in Emacs Lisp and easily install it as an
840extension to the editor.
841
842(GNU Emacs is sometimes called an ``extensible editor'', but it does
843much more than provide editing capabilities. It is better to refer to
844Emacs as an ``extensible computing environment''. However, that
845phrase is quite a mouthful. It is easier to refer to Emacs simply as
846an editor. Moreover, everything you do in Emacs---find the Mayan date
847and phases of the moon, simplify polynomials, debug code, manage
848files, read letters, write books---all these activities are kinds of
849editing in the most general sense of the word.)
850
851@menu
852* Why:: Why learn Emacs Lisp?
853* On Reading this Text:: Read, gain familiarity, pick up habits....
854* Who You Are:: For whom this is written.
855* Lisp History::
856* Note for Novices:: You can read this as a novice.
857* Thank You::
858@end menu
859
860@node Why, On Reading this Text, Preface, Preface
861@ifnottex
862@unnumberedsec Why Study Emacs Lisp?
863@end ifnottex
864
865Although Emacs Lisp is usually thought of in association only with Emacs,
866it is a full computer programming language. You can use Emacs Lisp as
867you would any other programming language.
868
869Perhaps you want to understand programming; perhaps you want to extend
870Emacs; or perhaps you want to become a programmer. This introduction to
871Emacs Lisp is designed to get you started: to guide you in learning the
872fundamentals of programming, and more importantly, to show you how you
873can teach yourself to go further.
874
875@node On Reading this Text, Who You Are, Why, Preface
876@comment node-name, next, previous, up
877@unnumberedsec On Reading this Text
878
879All through this document, you will see little sample programs you can
880run inside of Emacs. If you read this document in Info inside of GNU
881Emacs, you can run the programs as they appear. (This is easy to do and
882is explained when the examples are presented.) Alternatively, you can
883read this introduction as a printed book while sitting beside a computer
884running Emacs. (This is what I like to do; I like printed books.) If
885you don't have a running Emacs beside you, you can still read this book,
886but in this case, it is best to treat it as a novel or as a travel guide
887to a country not yet visited: interesting, but not the same as being
888there.
889
40ba43b4 890Much of this introduction is dedicated to walkthroughs or guided tours
8cda6f8f
GM
891of code used in GNU Emacs. These tours are designed for two purposes:
892first, to give you familiarity with real, working code (code you use
893every day); and, second, to give you familiarity with the way Emacs
894works. It is interesting to see how a working environment is
895implemented.
896Also, I
897hope that you will pick up the habit of browsing through source code.
898You can learn from it and mine it for ideas. Having GNU Emacs is like
899having a dragon's cave of treasures.
900
901In addition to learning about Emacs as an editor and Emacs Lisp as a
902programming language, the examples and guided tours will give you an
903opportunity to get acquainted with Emacs as a Lisp programming
904environment. GNU Emacs supports programming and provides tools that
905you will want to become comfortable using, such as @kbd{M-.} (the key
906which invokes the @code{find-tag} command). You will also learn about
907buffers and other objects that are part of the environment.
908Learning about these features of Emacs is like learning new routes
909around your home town.
910
911@ignore
912In addition, I have written several programs as extended examples.
913Although these are examples, the programs are real. I use them.
914Other people use them. You may use them. Beyond the fragments of
915programs used for illustrations, there is very little in here that is
916`just for teaching purposes'; what you see is used. This is a great
917advantage of Emacs Lisp: it is easy to learn to use it for work.
918@end ignore
919
920Finally, I hope to convey some of the skills for using Emacs to
921learn aspects of programming that you don't know. You can often use
922Emacs to help you understand what puzzles you or to find out how to do
923something new. This self-reliance is not only a pleasure, but an
924advantage.
925
926@node Who You Are, Lisp History, On Reading this Text, Preface
927@comment node-name, next, previous, up
928@unnumberedsec For Whom This is Written
929
930This text is written as an elementary introduction for people who are
931not programmers. If you are a programmer, you may not be satisfied with
932this primer. The reason is that you may have become expert at reading
933reference manuals and be put off by the way this text is organized.
934
935An expert programmer who reviewed this text said to me:
936
937@quotation
938@i{I prefer to learn from reference manuals. I ``dive into'' each
939paragraph, and ``come up for air'' between paragraphs.}
940
941@i{When I get to the end of a paragraph, I assume that that subject is
942done, finished, that I know everything I need (with the
943possible exception of the case when the next paragraph starts talking
944about it in more detail). I expect that a well written reference manual
945will not have a lot of redundancy, and that it will have excellent
946pointers to the (one) place where the information I want is.}
947@end quotation
948
949This introduction is not written for this person!
950
951Firstly, I try to say everything at least three times: first, to
952introduce it; second, to show it in context; and third, to show it in a
953different context, or to review it.
954
955Secondly, I hardly ever put all the information about a subject in one
956place, much less in one paragraph. To my way of thinking, that imposes
957too heavy a burden on the reader. Instead I try to explain only what
958you need to know at the time. (Sometimes I include a little extra
959information so you won't be surprised later when the additional
960information is formally introduced.)
961
962When you read this text, you are not expected to learn everything the
963first time. Frequently, you need only make, as it were, a `nodding
964acquaintance' with some of the items mentioned. My hope is that I have
965structured the text and given you enough hints that you will be alert to
966what is important, and concentrate on it.
967
968You will need to ``dive into'' some paragraphs; there is no other way
969to read them. But I have tried to keep down the number of such
970paragraphs. This book is intended as an approachable hill, rather than
971as a daunting mountain.
972
973This introduction to @cite{Programming in Emacs Lisp} has a companion
974document,
975@iftex
976@cite{The GNU Emacs Lisp Reference Manual}.
977@end iftex
978@ifnottex
979@ref{Top, , The GNU Emacs Lisp Reference Manual, elisp, The GNU
980Emacs Lisp Reference Manual}.
981@end ifnottex
982The reference manual has more detail than this introduction. In the
983reference manual, all the information about one topic is concentrated
984in one place. You should turn to it if you are like the programmer
985quoted above. And, of course, after you have read this
986@cite{Introduction}, you will find the @cite{Reference Manual} useful
987when you are writing your own programs.
988
989@node Lisp History, Note for Novices, Who You Are, Preface
990@unnumberedsec Lisp History
991@cindex Lisp history
992
993Lisp was first developed in the late 1950s at the Massachusetts
994Institute of Technology for research in artificial intelligence. The
995great power of the Lisp language makes it superior for other purposes as
996well, such as writing editor commands and integrated environments.
997
998@cindex Maclisp
999@cindex Common Lisp
1000GNU Emacs Lisp is largely inspired by Maclisp, which was written at MIT
1001in the 1960s. It is somewhat inspired by Common Lisp, which became a
1002standard in the 1980s. However, Emacs Lisp is much simpler than Common
1003Lisp. (The standard Emacs distribution contains an optional extensions
1004file, @file{cl.el}, that adds many Common Lisp features to Emacs Lisp.)
1005
1006@node Note for Novices, Thank You, Lisp History, Preface
1007@comment node-name, next, previous, up
1008@unnumberedsec A Note for Novices
1009
1010If you don't know GNU Emacs, you can still read this document
1011profitably. However, I recommend you learn Emacs, if only to learn to
1012move around your computer screen. You can teach yourself how to use
1013Emacs with the on-line tutorial. To use it, type @kbd{C-h t}. (This
1014means you press and release the @key{CTRL} key and the @kbd{h} at the
1015same time, and then press and release @kbd{t}.)
1016
1017Also, I often refer to one of Emacs' standard commands by listing the
1018keys which you press to invoke the command and then giving the name of
1019the command in parentheses, like this: @kbd{M-C-\}
1020(@code{indent-region}). What this means is that the
1021@code{indent-region} command is customarily invoked by typing
1022@kbd{M-C-\}. (You can, if you wish, change the keys that are typed to
1023invoke the command; this is called @dfn{rebinding}. @xref{Keymaps, ,
1024Keymaps}.) The abbreviation @kbd{M-C-\} means that you type your
1025@key{META} key, @key{CTRL} key and @key{\} key all at the same time.
09e80d9f 1026(On many modern keyboards the @key{META} key is labeled
8cda6f8f
GM
1027@key{ALT}.)
1028Sometimes a combination like this is called a keychord, since it is
1029similar to the way you play a chord on a piano. If your keyboard does
1030not have a @key{META} key, the @key{ESC} key prefix is used in place
1031of it. In this case, @kbd{M-C-\} means that you press and release your
1032@key{ESC} key and then type the @key{CTRL} key and the @key{\} key at
1033the same time. But usually @kbd{M-C-\} means press the @key{CTRL} key
09e80d9f 1034along with the key that is labeled @key{ALT} and, at the same time,
8cda6f8f
GM
1035press the @key{\} key.
1036
1037In addition to typing a lone keychord, you can prefix what you type
1038with @kbd{C-u}, which is called the `universal argument'. The
1039@kbd{C-u} keychord passes an argument to the subsequent command.
1040Thus, to indent a region of plain text by 6 spaces, mark the region,
1041and then type @w{@kbd{C-u 6 M-C-\}}. (If you do not specify a number,
1042Emacs either passes the number 4 to the command or otherwise runs the
1043command differently than it would otherwise.) @xref{Arguments, ,
1044Numeric Arguments, emacs, The GNU Emacs Manual}.
1045
1046If you are reading this in Info using GNU Emacs, you can read through
1047this whole document just by pressing the space bar, @key{SPC}.
1048(To learn about Info, type @kbd{C-h i} and then select Info.)
1049
1050A note on terminology: when I use the word Lisp alone, I often am
1051referring to the various dialects of Lisp in general, but when I speak
1052of Emacs Lisp, I am referring to GNU Emacs Lisp in particular.
1053
1054@node Thank You, , Note for Novices, Preface
1055@comment node-name, next, previous, up
1056@unnumberedsec Thank You
1057
1058My thanks to all who helped me with this book. My especial thanks to
1059@r{Jim Blandy}, @r{Noah Friedman}, @w{Jim Kingdon}, @r{Roland
1060McGrath}, @w{Frank Ritter}, @w{Randy Smith}, @w{Richard M.@:
1061Stallman}, and @w{Melissa Weisshaus}. My thanks also go to both
1062@w{Philip Johnson} and @w{David Stampe} for their patient
1063encouragement. My mistakes are my own.
1064
1065@flushright
1066Robert J. Chassell
4724cafb 1067@email{bob@@gnu.org}
8cda6f8f
GM
1068@end flushright
1069
1070@c ================ Beginning of main text ================
1071
1072@c Start main text on right-hand (verso) page
1073
1074@tex
1075\par\vfill\supereject
1076\headings off
1077\ifodd\pageno
1078 \par\vfill\supereject
1079\else
1080 \par\vfill\supereject
1081 \page\hbox{}\page
1082 \par\vfill\supereject
1083\fi
1084@end tex
1085
1086@iftex
1087@headings off
1088@evenheading @thispage @| @| @thischapter
1089@oddheading @thissection @| @| @thispage
1090@global@pageno = 1
1091@end iftex
1092
1093@node List Processing, Practicing Evaluation, Preface, Top
1094@comment node-name, next, previous, up
1095@chapter List Processing
1096
1097To the untutored eye, Lisp is a strange programming language. In Lisp
1098code there are parentheses everywhere. Some people even claim that
1099the name stands for `Lots of Isolated Silly Parentheses'. But the
1100claim is unwarranted. Lisp stands for LISt Processing, and the
1101programming language handles @emph{lists} (and lists of lists) by
1102putting them between parentheses. The parentheses mark the boundaries
1103of the list. Sometimes a list is preceded by a single apostrophe or
1104quotation mark, @samp{'}@footnote{The single apostrophe or quotation
1105mark is an abbreviation for the function @code{quote}; you need not
1106think about functions now; functions are defined in @ref{Making
1107Errors, , Generate an Error Message}.} Lists are the basis of Lisp.
1108
1109@menu
1110* Lisp Lists:: What are lists?
1111* Run a Program:: Any list in Lisp is a program ready to run.
1112* Making Errors:: Generating an error message.
1113* Names & Definitions:: Names of symbols and function definitions.
1114* Lisp Interpreter:: What the Lisp interpreter does.
1115* Evaluation:: Running a program.
1116* Variables:: Returning a value from a variable.
1117* Arguments:: Passing information to a function.
1118* set & setq:: Setting the value of a variable.
1119* Summary:: The major points.
1120* Error Message Exercises::
1121@end menu
1122
1123@node Lisp Lists, Run a Program, List Processing, List Processing
1124@comment node-name, next, previous, up
1125@section Lisp Lists
1126@cindex Lisp Lists
1127
1128In Lisp, a list looks like this: @code{'(rose violet daisy buttercup)}.
1129This list is preceded by a single apostrophe. It could just as well be
1130written as follows, which looks more like the kind of list you are likely
1131to be familiar with:
1132
1133@smallexample
1134@group
1135'(rose
1136 violet
1137 daisy
1138 buttercup)
1139@end group
1140@end smallexample
1141
1142@noindent
1143The elements of this list are the names of the four different flowers,
1144separated from each other by whitespace and surrounded by parentheses,
1145like flowers in a field with a stone wall around them.
1146@cindex Flowers in a field
1147
1148@menu
1149* Numbers Lists:: List have numbers, other lists, in them.
1150* Lisp Atoms:: Elemental entities.
1151* Whitespace in Lists:: Formatting lists to be readable.
1152* Typing Lists:: How GNU Emacs helps you type lists.
1153@end menu
1154
1155@node Numbers Lists, Lisp Atoms, Lisp Lists, Lisp Lists
1156@ifnottex
1157@unnumberedsubsec Numbers, Lists inside of Lists
1158@end ifnottex
1159
1160Lists can also have numbers in them, as in this list: @code{(+ 2 2)}.
1161This list has a plus-sign, @samp{+}, followed by two @samp{2}s, each
1162separated by whitespace.
1163
1164In Lisp, both data and programs are represented the same way; that is,
1165they are both lists of words, numbers, or other lists, separated by
1166whitespace and surrounded by parentheses. (Since a program looks like
1167data, one program may easily serve as data for another; this is a very
1168powerful feature of Lisp.) (Incidentally, these two parenthetical
1169remarks are @emph{not} Lisp lists, because they contain @samp{;} and
1170@samp{.} as punctuation marks.)
1171
1172@need 1200
1173Here is another list, this time with a list inside of it:
1174
1175@smallexample
1176'(this list has (a list inside of it))
1177@end smallexample
1178
1179The components of this list are the words @samp{this}, @samp{list},
1180@samp{has}, and the list @samp{(a list inside of it)}. The interior
1181list is made up of the words @samp{a}, @samp{list}, @samp{inside},
1182@samp{of}, @samp{it}.
1183
1184@node Lisp Atoms, Whitespace in Lists, Numbers Lists, Lisp Lists
1185@comment node-name, next, previous, up
1186@subsection Lisp Atoms
1187@cindex Lisp Atoms
1188
1189In Lisp, what we have been calling words are called @dfn{atoms}. This
1190term comes from the historical meaning of the word atom, which means
1191`indivisible'. As far as Lisp is concerned, the words we have been
1192using in the lists cannot be divided into any smaller parts and still
1193mean the same thing as part of a program; likewise with numbers and
1194single character symbols like @samp{+}. On the other hand, unlike an
1195ancient atom, a list can be split into parts. (@xref{car cdr & cons,
1196, @code{car} @code{cdr} & @code{cons} Fundamental Functions}.)
1197
1198In a list, atoms are separated from each other by whitespace. They can be
1199right next to a parenthesis.
1200
1201@cindex @samp{empty list} defined
1202Technically speaking, a list in Lisp consists of parentheses surrounding
1203atoms separated by whitespace or surrounding other lists or surrounding
1204both atoms and other lists. A list can have just one atom in it or
1205have nothing in it at all. A list with nothing in it looks like this:
1206@code{()}, and is called the @dfn{empty list}. Unlike anything else, an
1207empty list is considered both an atom and a list at the same time.
1208
1209@cindex Symbolic expressions, introduced
1210@cindex @samp{expression} defined
1211@cindex @samp{form} defined
1212The printed representation of both atoms and lists are called
1213@dfn{symbolic expressions} or, more concisely, @dfn{s-expressions}.
1214The word @dfn{expression} by itself can refer to either the printed
1215representation, or to the atom or list as it is held internally in the
1216computer. Often, people use the term @dfn{expression}
1217indiscriminately. (Also, in many texts, the word @dfn{form} is used
1218as a synonym for expression.)
1219
1220Incidentally, the atoms that make up our universe were named such when
1221they were thought to be indivisible; but it has been found that physical
1222atoms are not indivisible. Parts can split off an atom or it can
1223fission into two parts of roughly equal size. Physical atoms were named
1224prematurely, before their truer nature was found. In Lisp, certain
1225kinds of atom, such as an array, can be separated into parts; but the
1226mechanism for doing this is different from the mechanism for splitting a
1227list. As far as list operations are concerned, the atoms of a list are
1228unsplittable.
1229
1230As in English, the meanings of the component letters of a Lisp atom
1231are different from the meaning the letters make as a word. For
1232example, the word for the South American sloth, the @samp{ai}, is
1233completely different from the two words, @samp{a}, and @samp{i}.
1234
1235There are many kinds of atom in nature but only a few in Lisp: for
1236example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such
1237as @samp{+}, @samp{foo}, or @samp{forward-line}. The words we have
1238listed in the examples above are all symbols. In everyday Lisp
1239conversation, the word ``atom'' is not often used, because programmers
1240usually try to be more specific about what kind of atom they are dealing
1241with. Lisp programming is mostly about symbols (and sometimes numbers)
1242within lists. (Incidentally, the preceding three word parenthetical
1243remark is a proper list in Lisp, since it consists of atoms, which in
1244this case are symbols, separated by whitespace and enclosed by
1245parentheses, without any non-Lisp punctuation.)
1246
1247@need 1250
6c499932
CY
1248Text between double quotation marks---even sentences or
1249paragraphs---is also an atom. Here is an example:
8cda6f8f
GM
1250@cindex Text between double quotation marks
1251
1252@smallexample
1253'(this list includes "text between quotation marks.")
1254@end smallexample
1255
1256@cindex @samp{string} defined
1257@noindent
1258In Lisp, all of the quoted text including the punctuation mark and the
1259blank spaces is a single atom. This kind of atom is called a
1260@dfn{string} (for `string of characters') and is the sort of thing that
1261is used for messages that a computer can print for a human to read.
1262Strings are a different kind of atom than numbers or symbols and are
1263used differently.
1264
1265@node Whitespace in Lists, Typing Lists, Lisp Atoms, Lisp Lists
1266@comment node-name, next, previous, up
1267@subsection Whitespace in Lists
1268@cindex Whitespace in lists
1269
1270@need 1200
1271The amount of whitespace in a list does not matter. From the point of view
1272of the Lisp language,
1273
1274@smallexample
1275@group
1276'(this list
1277 looks like this)
1278@end group
1279@end smallexample
1280
1281@need 800
1282@noindent
1283is exactly the same as this:
1284
1285@smallexample
1286'(this list looks like this)
1287@end smallexample
1288
1289Both examples show what to Lisp is the same list, the list made up of
1290the symbols @samp{this}, @samp{list}, @samp{looks}, @samp{like}, and
1291@samp{this} in that order.
1292
1293Extra whitespace and newlines are designed to make a list more readable
1294by humans. When Lisp reads the expression, it gets rid of all the extra
1295whitespace (but it needs to have at least one space between atoms in
1296order to tell them apart.)
1297
1298Odd as it seems, the examples we have seen cover almost all of what Lisp
1299lists look like! Every other list in Lisp looks more or less like one
1300of these examples, except that the list may be longer and more complex.
1301In brief, a list is between parentheses, a string is between quotation
1302marks, a symbol looks like a word, and a number looks like a number.
1303(For certain situations, square brackets, dots and a few other special
1304characters may be used; however, we will go quite far without them.)
1305
1306@node Typing Lists, , Whitespace in Lists, Lisp Lists
1307@comment node-name, next, previous, up
1308@subsection GNU Emacs Helps You Type Lists
1309@cindex Help typing lists
1310@cindex Formatting help
1311
1312When you type a Lisp expression in GNU Emacs using either Lisp
1313Interaction mode or Emacs Lisp mode, you have available to you several
1314commands to format the Lisp expression so it is easy to read. For
1315example, pressing the @key{TAB} key automatically indents the line the
1316cursor is on by the right amount. A command to properly indent the
1317code in a region is customarily bound to @kbd{M-C-\}. Indentation is
1318designed so that you can see which elements of a list belong to which
1319list---elements of a sub-list are indented more than the elements of
1320the enclosing list.
1321
1322In addition, when you type a closing parenthesis, Emacs momentarily
1323jumps the cursor back to the matching opening parenthesis, so you can
1324see which one it is. This is very useful, since every list you type
1325in Lisp must have its closing parenthesis match its opening
1326parenthesis. (@xref{Major Modes, , Major Modes, emacs, The GNU Emacs
1327Manual}, for more information about Emacs' modes.)
1328
1329@node Run a Program, Making Errors, Lisp Lists, List Processing
1330@comment node-name, next, previous, up
1331@section Run a Program
1332@cindex Run a program
1333@cindex Program, running one
1334
1335@cindex @samp{evaluate} defined
1336A list in Lisp---any list---is a program ready to run. If you run it
1337(for which the Lisp jargon is @dfn{evaluate}), the computer will do one
1338of three things: do nothing except return to you the list itself; send
1339you an error message; or, treat the first symbol in the list as a
1340command to do something. (Usually, of course, it is the last of these
1341three things that you really want!)
1342
1343@c use code for the single apostrophe, not samp.
1344The single apostrophe, @code{'}, that I put in front of some of the
1345example lists in preceding sections is called a @dfn{quote}; when it
1346precedes a list, it tells Lisp to do nothing with the list, other than
1347take it as it is written. But if there is no quote preceding a list,
1348the first item of the list is special: it is a command for the computer
1349to obey. (In Lisp, these commands are called @emph{functions}.) The list
1350@code{(+ 2 2)} shown above did not have a quote in front of it, so Lisp
1351understands that the @code{+} is an instruction to do something with the
1352rest of the list: add the numbers that follow.
1353
1354@need 1250
1355If you are reading this inside of GNU Emacs in Info, here is how you can
1356evaluate such a list: place your cursor immediately after the right
1357hand parenthesis of the following list and then type @kbd{C-x C-e}:
1358
1359@smallexample
1360(+ 2 2)
1361@end smallexample
1362
1363@c use code for the number four, not samp.
1364@noindent
1365You will see the number @code{4} appear in the echo area. (In the
1366jargon, what you have just done is ``evaluate the list.'' The echo area
1367is the line at the bottom of the screen that displays or ``echoes''
1368text.) Now try the same thing with a quoted list: place the cursor
1369right after the following list and type @kbd{C-x C-e}:
1370
1371@smallexample
1372'(this is a quoted list)
1373@end smallexample
1374
1375@noindent
1376You will see @code{(this is a quoted list)} appear in the echo area.
1377
1378@cindex Lisp interpreter, explained
1379@cindex Interpreter, Lisp, explained
1380In both cases, what you are doing is giving a command to the program
1381inside of GNU Emacs called the @dfn{Lisp interpreter}---giving the
1382interpreter a command to evaluate the expression. The name of the Lisp
1383interpreter comes from the word for the task done by a human who comes
1384up with the meaning of an expression---who ``interprets'' it.
1385
1386You can also evaluate an atom that is not part of a list---one that is
1387not surrounded by parentheses; again, the Lisp interpreter translates
1388from the humanly readable expression to the language of the computer.
1389But before discussing this (@pxref{Variables}), we will discuss what the
1390Lisp interpreter does when you make an error.
1391
1392@node Making Errors, Names & Definitions, Run a Program, List Processing
1393@comment node-name, next, previous, up
1394@section Generate an Error Message
1395@cindex Generate an error message
1396@cindex Error message generation
1397
1398Partly so you won't worry if you do it accidentally, we will now give
1399a command to the Lisp interpreter that generates an error message.
1400This is a harmless activity; and indeed, we will often try to generate
1401error messages intentionally. Once you understand the jargon, error
1402messages can be informative. Instead of being called ``error''
1403messages, they should be called ``help'' messages. They are like
ee7683eb 1404signposts to a traveler in a strange country; deciphering them can be
8cda6f8f
GM
1405hard, but once understood, they can point the way.
1406
1407The error message is generated by a built-in GNU Emacs debugger. We
1408will `enter the debugger'. You get out of the debugger by typing @code{q}.
1409
1410What we will do is evaluate a list that is not quoted and does not
1411have a meaningful command as its first element. Here is a list almost
1412exactly the same as the one we just used, but without the single-quote
1413in front of it. Position the cursor right after it and type @kbd{C-x
1414C-e}:
1415
1416@smallexample
1417(this is an unquoted list)
1418@end smallexample
1419
1420@noindent
1421What you see depends on which version of Emacs you are running. GNU
1422Emacs version 22 provides more information than version 20 and before.
1423First, the more recent result of generating an error; then the
1424earlier, version 20 result.
1425
1426@need 1250
1427@noindent
1428In GNU Emacs version 22, a @file{*Backtrace*} window will open up and
1429you will see the following in it:
1430
1431@smallexample
1432@group
1433---------- Buffer: *Backtrace* ----------
1434Debugger entered--Lisp error: (void-function this)
1435 (this is an unquoted list)
1436 eval((this is an unquoted list))
1437 eval-last-sexp-1(nil)
1438 eval-last-sexp(nil)
1439 call-interactively(eval-last-sexp)
1440---------- Buffer: *Backtrace* ----------
1441@end group
1442@end smallexample
1443
1444@need 1200
1445@noindent
1446Your cursor will be in this window (you may have to wait a few seconds
1447before it becomes visible). To quit the debugger and make the
1448debugger window go away, type:
1449
1450@smallexample
1451q
1452@end smallexample
1453
1454@noindent
1455Please type @kbd{q} right now, so you become confident that you can
1456get out of the debugger. Then, type @kbd{C-x C-e} again to re-enter
1457it.
1458
1459@cindex @samp{function} defined
1460Based on what we already know, we can almost read this error message.
1461
1462You read the @file{*Backtrace*} buffer from the bottom up; it tells
1463you what Emacs did. When you typed @kbd{C-x C-e}, you made an
1464interactive call to the command @code{eval-last-sexp}. @code{eval} is
1465an abbreviation for `evaluate' and @code{sexp} is an abbreviation for
1466`symbolic expression'. The command means `evaluate last symbolic
1467expression', which is the expression just before your cursor.
1468
1469Each line above tells you what the Lisp interpreter evaluated next.
1470The most recent action is at the top. The buffer is called the
1471@file{*Backtrace*} buffer because it enables you to track Emacs
1472backwards.
1473
1474@need 800
1475At the top of the @file{*Backtrace*} buffer, you see the line:
1476
1477@smallexample
1478Debugger entered--Lisp error: (void-function this)
1479@end smallexample
1480
1481@noindent
1482The Lisp interpreter tried to evaluate the first atom of the list, the
1483word @samp{this}. It is this action that generated the error message
1484@samp{void-function this}.
1485
1486The message contains the words @samp{void-function} and @samp{this}.
1487
1488@cindex @samp{function} defined
1489The word @samp{function} was mentioned once before. It is a very
1490important word. For our purposes, we can define it by saying that a
1491@dfn{function} is a set of instructions to the computer that tell the
1492computer to do something.
1493
1494Now we can begin to understand the error message: @samp{void-function
1495this}. The function (that is, the word @samp{this}) does not have a
1496definition of any set of instructions for the computer to carry out.
1497
1498The slightly odd word, @samp{void-function}, is designed to cover the
1499way Emacs Lisp is implemented, which is that when a symbol does not
1500have a function definition attached to it, the place that should
1501contain the instructions is `void'.
1502
1503On the other hand, since we were able to add 2 plus 2 successfully, by
1504evaluating @code{(+ 2 2)}, we can infer that the symbol @code{+} must
1505have a set of instructions for the computer to obey and those
1506instructions must be to add the numbers that follow the @code{+}.
1507
1508@need 1250
1509In GNU Emacs version 20, and in earlier versions, you will see only
1510one line of error message; it will appear in the echo area and look
1511like this:
1512
1513@smallexample
1514Symbol's function definition is void:@: this
1515@end smallexample
1516
1517@noindent
1518(Also, your terminal may beep at you---some do, some don't; and others
1519blink. This is just a device to get your attention.) The message goes
1520away as soon as you type another key, even just to move the cursor.
1521
1522We know the meaning of the word @samp{Symbol}. It refers to the first
1523atom of the list, the word @samp{this}. The word @samp{function}
1524refers to the instructions that tell the computer what to do.
1525(Technically, the symbol tells the computer where to find the
1526instructions, but this is a complication we can ignore for the
1527moment.)
1528
1529The error message can be understood: @samp{Symbol's function
1530definition is void:@: this}. The symbol (that is, the word
1531@samp{this}) lacks instructions for the computer to carry out.
1532
1533@node Names & Definitions, Lisp Interpreter, Making Errors, List Processing
1534@comment node-name, next, previous, up
1535@section Symbol Names and Function Definitions
1536@cindex Symbol names
1537
1538We can articulate another characteristic of Lisp based on what we have
1539discussed so far---an important characteristic: a symbol, like
1540@code{+}, is not itself the set of instructions for the computer to
1541carry out. Instead, the symbol is used, perhaps temporarily, as a way
1542of locating the definition or set of instructions. What we see is the
1543name through which the instructions can be found. Names of people
1544work the same way. I can be referred to as @samp{Bob}; however, I am
1545not the letters @samp{B}, @samp{o}, @samp{b} but am, or was, the
1546consciousness consistently associated with a particular life-form.
1547The name is not me, but it can be used to refer to me.
1548
1549In Lisp, one set of instructions can be attached to several names.
1550For example, the computer instructions for adding numbers can be
1551linked to the symbol @code{plus} as well as to the symbol @code{+}
1552(and are in some dialects of Lisp). Among humans, I can be referred
1553to as @samp{Robert} as well as @samp{Bob} and by other words as well.
1554
1555On the other hand, a symbol can have only one function definition
1556attached to it at a time. Otherwise, the computer would be confused as
1557to which definition to use. If this were the case among people, only
1558one person in the world could be named @samp{Bob}. However, the function
1559definition to which the name refers can be changed readily.
1560(@xref{Install, , Install a Function Definition}.)
1561
1562Since Emacs Lisp is large, it is customary to name symbols in a way
1563that identifies the part of Emacs to which the function belongs.
1564Thus, all the names for functions that deal with Texinfo start with
1565@samp{texinfo-} and those for functions that deal with reading mail
1566start with @samp{rmail-}.
1567
1568@node Lisp Interpreter, Evaluation, Names & Definitions, List Processing
1569@comment node-name, next, previous, up
1570@section The Lisp Interpreter
1571@cindex Lisp interpreter, what it does
1572@cindex Interpreter, what it does
1573
1574Based on what we have seen, we can now start to figure out what the
1575Lisp interpreter does when we command it to evaluate a list.
1576First, it looks to see whether there is a quote before the list; if
1577there is, the interpreter just gives us the list. On the other
1578hand, if there is no quote, the interpreter looks at the first element
1579in the list and sees whether it has a function definition. If it does,
1580the interpreter carries out the instructions in the function definition.
1581Otherwise, the interpreter prints an error message.
1582
1583This is how Lisp works. Simple. There are added complications which we
1584will get to in a minute, but these are the fundamentals. Of course, to
1585write Lisp programs, you need to know how to write function definitions
1586and attach them to names, and how to do this without confusing either
1587yourself or the computer.
1588
1589@menu
1590* Complications:: Variables, Special forms, Lists within.
1591* Byte Compiling:: Specially processing code for speed.
1592@end menu
1593
1594@node Complications, Byte Compiling, Lisp Interpreter, Lisp Interpreter
1595@ifnottex
1596@unnumberedsubsec Complications
1597@end ifnottex
1598
1599Now, for the first complication. In addition to lists, the Lisp
1600interpreter can evaluate a symbol that is not quoted and does not have
1601parentheses around it. The Lisp interpreter will attempt to determine
1602the symbol's value as a @dfn{variable}. This situation is described
1603in the section on variables. (@xref{Variables}.)
1604
1605@cindex Special form
1606The second complication occurs because some functions are unusual and do
1607not work in the usual manner. Those that don't are called @dfn{special
1608forms}. They are used for special jobs, like defining a function, and
1609there are not many of them. In the next few chapters, you will be
1610introduced to several of the more important special forms.
1611
1612The third and final complication is this: if the function that the
1613Lisp interpreter is looking at is not a special form, and if it is part
1614of a list, the Lisp interpreter looks to see whether the list has a list
1615inside of it. If there is an inner list, the Lisp interpreter first
1616figures out what it should do with the inside list, and then it works on
1617the outside list. If there is yet another list embedded inside the
1618inner list, it works on that one first, and so on. It always works on
1619the innermost list first. The interpreter works on the innermost list
1620first, to evaluate the result of that list. The result may be
1621used by the enclosing expression.
1622
1623Otherwise, the interpreter works left to right, from one expression to
1624the next.
1625
1626@node Byte Compiling, , Complications, Lisp Interpreter
1627@subsection Byte Compiling
1628@cindex Byte compiling
1629
1630One other aspect of interpreting: the Lisp interpreter is able to
1631interpret two kinds of entity: humanly readable code, on which we will
1632focus exclusively, and specially processed code, called @dfn{byte
1633compiled} code, which is not humanly readable. Byte compiled code
1634runs faster than humanly readable code.
1635
1636You can transform humanly readable code into byte compiled code by
1637running one of the compile commands such as @code{byte-compile-file}.
1638Byte compiled code is usually stored in a file that ends with a
1639@file{.elc} extension rather than a @file{.el} extension. You will
1640see both kinds of file in the @file{emacs/lisp} directory; the files
1641to read are those with @file{.el} extensions.
1642
1643As a practical matter, for most things you might do to customize or
1644extend Emacs, you do not need to byte compile; and I will not discuss
1645the topic here. @xref{Byte Compilation, , Byte Compilation, elisp,
1646The GNU Emacs Lisp Reference Manual}, for a full description of byte
1647compilation.
1648
1649@node Evaluation, Variables, Lisp Interpreter, List Processing
1650@comment node-name, next, previous, up
1651@section Evaluation
1652@cindex Evaluation
1653
1654When the Lisp interpreter works on an expression, the term for the
1655activity is called @dfn{evaluation}. We say that the interpreter
1656`evaluates the expression'. I've used this term several times before.
1657The word comes from its use in everyday language, `to ascertain the
1658value or amount of; to appraise', according to @cite{Webster's New
1659Collegiate Dictionary}.
1660
1661@menu
1662* How the Interpreter Acts:: Returns and Side Effects...
1663* Evaluating Inner Lists:: Lists within lists...
1664@end menu
1665
1666@node How the Interpreter Acts, Evaluating Inner Lists, Evaluation, Evaluation
1667@ifnottex
1668@unnumberedsubsec How the Lisp Interpreter Acts
1669@end ifnottex
1670
1671@cindex @samp{returned value} explained
1672After evaluating an expression, the Lisp interpreter will most likely
1673@dfn{return} the value that the computer produces by carrying out the
1674instructions it found in the function definition, or perhaps it will
1675give up on that function and produce an error message. (The interpreter
1676may also find itself tossed, so to speak, to a different function or it
1677may attempt to repeat continually what it is doing for ever and ever in
1678what is called an `infinite loop'. These actions are less common; and
1679we can ignore them.) Most frequently, the interpreter returns a value.
1680
1681@cindex @samp{side effect} defined
1682At the same time the interpreter returns a value, it may do something
1683else as well, such as move a cursor or copy a file; this other kind of
1684action is called a @dfn{side effect}. Actions that we humans think are
1685important, such as printing results, are often ``side effects'' to the
1686Lisp interpreter. The jargon can sound peculiar, but it turns out that
1687it is fairly easy to learn to use side effects.
1688
1689In summary, evaluating a symbolic expression most commonly causes the
1690Lisp interpreter to return a value and perhaps carry out a side effect;
1691or else produce an error.
1692
1693@node Evaluating Inner Lists, , How the Interpreter Acts, Evaluation
1694@comment node-name, next, previous, up
1695@subsection Evaluating Inner Lists
1696@cindex Inner list evaluation
1697@cindex Evaluating inner lists
1698
1699If evaluation applies to a list that is inside another list, the outer
1700list may use the value returned by the first evaluation as information
1701when the outer list is evaluated. This explains why inner expressions
1702are evaluated first: the values they return are used by the outer
1703expressions.
1704
1705@need 1250
1706We can investigate this process by evaluating another addition example.
1707Place your cursor after the following expression and type @kbd{C-x C-e}:
1708
1709@smallexample
1710(+ 2 (+ 3 3))
1711@end smallexample
1712
1713@noindent
1714The number 8 will appear in the echo area.
1715
1716What happens is that the Lisp interpreter first evaluates the inner
1717expression, @code{(+ 3 3)}, for which the value 6 is returned; then it
1718evaluates the outer expression as if it were written @code{(+ 2 6)}, which
1719returns the value 8. Since there are no more enclosing expressions to
1720evaluate, the interpreter prints that value in the echo area.
1721
1722Now it is easy to understand the name of the command invoked by the
1723keystrokes @kbd{C-x C-e}: the name is @code{eval-last-sexp}. The
1724letters @code{sexp} are an abbreviation for `symbolic expression', and
1725@code{eval} is an abbreviation for `evaluate'. The command means
1726`evaluate last symbolic expression'.
1727
1728As an experiment, you can try evaluating the expression by putting the
1729cursor at the beginning of the next line immediately following the
1730expression, or inside the expression.
1731
1732@need 800
1733Here is another copy of the expression:
1734
1735@smallexample
1736(+ 2 (+ 3 3))
1737@end smallexample
1738
1739@noindent
1740If you place the cursor at the beginning of the blank line that
1741immediately follows the expression and type @kbd{C-x C-e}, you will
1742still get the value 8 printed in the echo area. Now try putting the
1743cursor inside the expression. If you put it right after the next to
1744last parenthesis (so it appears to sit on top of the last parenthesis),
1745you will get a 6 printed in the echo area! This is because the command
1746evaluates the expression @code{(+ 3 3)}.
1747
1748Now put the cursor immediately after a number. Type @kbd{C-x C-e} and
1749you will get the number itself. In Lisp, if you evaluate a number, you
1750get the number itself---this is how numbers differ from symbols. If you
1751evaluate a list starting with a symbol like @code{+}, you will get a
1752value returned that is the result of the computer carrying out the
1753instructions in the function definition attached to that name. If a
1754symbol by itself is evaluated, something different happens, as we will
1755see in the next section.
1756
1757@node Variables, Arguments, Evaluation, List Processing
1758@comment node-name, next, previous, up
1759@section Variables
1760@cindex Variables
1761
1762In Emacs Lisp, a symbol can have a value attached to it just as it can
1763have a function definition attached to it. The two are different.
1764The function definition is a set of instructions that a computer will
1765obey. A value, on the other hand, is something, such as number or a
1766name, that can vary (which is why such a symbol is called a variable).
1767The value of a symbol can be any expression in Lisp, such as a symbol,
1768number, list, or string. A symbol that has a value is often called a
1769@dfn{variable}.
1770
1771A symbol can have both a function definition and a value attached to
1772it at the same time. Or it can have just one or the other.
1773The two are separate. This is somewhat similar
1774to the way the name Cambridge can refer to the city in Massachusetts
1775and have some information attached to the name as well, such as
1776``great programming center''.
1777
1778@ignore
1779(Incidentally, in Emacs Lisp, a symbol can have two
1780other things attached to it, too: a property list and a documentation
1781string; these are discussed later.)
1782@end ignore
1783
1784Another way to think about this is to imagine a symbol as being a chest
1785of drawers. The function definition is put in one drawer, the value in
1786another, and so on. What is put in the drawer holding the value can be
1787changed without affecting the contents of the drawer holding the
1788function definition, and vice-verse.
1789
1790@menu
1791* fill-column Example::
1792* Void Function:: The error message for a symbol
1793 without a function.
1794* Void Variable:: The error message for a symbol without a value.
1795@end menu
1796
1797@node fill-column Example, Void Function, Variables, Variables
1798@ifnottex
1799@unnumberedsubsec @code{fill-column}, an Example Variable
1800@end ifnottex
1801
1802@findex fill-column, @r{an example variable}
1803@cindex Example variable, @code{fill-column}
1804@cindex Variable, example of, @code{fill-column}
1805The variable @code{fill-column} illustrates a symbol with a value
1806attached to it: in every GNU Emacs buffer, this symbol is set to some
1807value, usually 72 or 70, but sometimes to some other value. To find the
1808value of this symbol, evaluate it by itself. If you are reading this in
1809Info inside of GNU Emacs, you can do this by putting the cursor after
1810the symbol and typing @kbd{C-x C-e}:
1811
1812@smallexample
1813fill-column
1814@end smallexample
1815
1816@noindent
1817After I typed @kbd{C-x C-e}, Emacs printed the number 72 in my echo
1818area. This is the value for which @code{fill-column} is set for me as I
1819write this. It may be different for you in your Info buffer. Notice
1820that the value returned as a variable is printed in exactly the same way
1821as the value returned by a function carrying out its instructions. From
1822the point of view of the Lisp interpreter, a value returned is a value
1823returned. What kind of expression it came from ceases to matter once
1824the value is known.
1825
1826A symbol can have any value attached to it or, to use the jargon, we can
1827@dfn{bind} the variable to a value: to a number, such as 72; to a
1828string, @code{"such as this"}; to a list, such as @code{(spruce pine
1829oak)}; we can even bind a variable to a function definition.
1830
1831A symbol can be bound to a value in several ways. @xref{set & setq, ,
1832Setting the Value of a Variable}, for information about one way to do
1833this.
1834
1835@node Void Function, Void Variable, fill-column Example, Variables
1836@comment node-name, next, previous, up
1837@subsection Error Message for a Symbol Without a Function
1838@cindex Symbol without function error
1839@cindex Error for symbol without function
1840
1841When we evaluated @code{fill-column} to find its value as a variable,
1842we did not place parentheses around the word. This is because we did
1843not intend to use it as a function name.
1844
1845If @code{fill-column} were the first or only element of a list, the
1846Lisp interpreter would attempt to find the function definition
1847attached to it. But @code{fill-column} has no function definition.
1848Try evaluating this:
1849
1850@smallexample
1851(fill-column)
1852@end smallexample
1853
1854@need 1250
1855@noindent
1856In GNU Emacs version 22, you will create a @file{*Backtrace*} buffer
1857that says:
1858
1859@smallexample
1860@group
1861---------- Buffer: *Backtrace* ----------
1862Debugger entered--Lisp error: (void-function fill-column)
1863 (fill-column)
1864 eval((fill-column))
1865 eval-last-sexp-1(nil)
1866 eval-last-sexp(nil)
1867 call-interactively(eval-last-sexp)
1868---------- Buffer: *Backtrace* ----------
1869@end group
1870@end smallexample
1871
1872@noindent
1873(Remember, to quit the debugger and make the debugger window go away,
1874type @kbd{q} in the @file{*Backtrace*} buffer.)
1875
1876@ignore
1877@need 800
1878In GNU Emacs 20 and before, you will produce an error message that says:
1879
1880@smallexample
1881Symbol's function definition is void:@: fill-column
1882@end smallexample
1883
1884@noindent
1885(The message will go away as soon as you move the cursor or type
1886another key.)
1887@end ignore
1888
1889@node Void Variable, , Void Function, Variables
1890@comment node-name, next, previous, up
1891@subsection Error Message for a Symbol Without a Value
1892@cindex Symbol without value error
1893@cindex Error for symbol without value
1894
1895If you attempt to evaluate a symbol that does not have a value bound to
1896it, you will receive an error message. You can see this by
1897experimenting with our 2 plus 2 addition. In the following expression,
1898put your cursor right after the @code{+}, before the first number 2,
1899type @kbd{C-x C-e}:
1900
1901@smallexample
1902(+ 2 2)
1903@end smallexample
1904
1905@need 1500
1906@noindent
1907In GNU Emacs 22, you will create a @file{*Backtrace*} buffer that
1908says:
1909
1910@smallexample
1911@group
1912---------- Buffer: *Backtrace* ----------
1913Debugger entered--Lisp error: (void-variable +)
1914 eval(+)
1915 eval-last-sexp-1(nil)
1916 eval-last-sexp(nil)
1917 call-interactively(eval-last-sexp)
1918---------- Buffer: *Backtrace* ----------
1919@end group
1920@end smallexample
1921
1922@noindent
1923(As with the other times we entered the debugger, you can quit by
1924typing @kbd{q} in the @file{*Backtrace*} buffer.)
1925
1926This backtrace is different from the very first error message we saw,
1927which said, @samp{Debugger entered--Lisp error: (void-function this)}.
1928In this case, the function does not have a value as a variable; while
1929in the other error message, the function (the word `this') did not
1930have a definition.
1931
1932In this experiment with the @code{+}, what we did was cause the Lisp
1933interpreter to evaluate the @code{+} and look for the value of the
1934variable instead of the function definition. We did this by placing the
1935cursor right after the symbol rather than after the parenthesis of the
1936enclosing list as we did before. As a consequence, the Lisp interpreter
1937evaluated the preceding s-expression, which in this case was the
1938@code{+} by itself.
1939
1940Since @code{+} does not have a value bound to it, just the function
1941definition, the error message reported that the symbol's value as a
1942variable was void.
1943
1944@ignore
1945@need 800
1946In GNU Emacs version 20 and before, your error message will say:
1947
1948@example
1949Symbol's value as variable is void:@: +
1950@end example
1951
1952@noindent
1953The meaning is the same as in GNU Emacs 22.
1954@end ignore
1955
1956@node Arguments, set & setq, Variables, List Processing
1957@comment node-name, next, previous, up
1958@section Arguments
1959@cindex Arguments
1960@cindex Passing information to functions
1961
1962To see how information is passed to functions, let's look again at
1963our old standby, the addition of two plus two. In Lisp, this is written
1964as follows:
1965
1966@smallexample
1967(+ 2 2)
1968@end smallexample
1969
1970If you evaluate this expression, the number 4 will appear in your echo
1971area. What the Lisp interpreter does is add the numbers that follow
1972the @code{+}.
1973
1974@cindex @samp{argument} defined
1975The numbers added by @code{+} are called the @dfn{arguments} of the
1976function @code{+}. These numbers are the information that is given to
1977or @dfn{passed} to the function.
1978
1979The word `argument' comes from the way it is used in mathematics and
1980does not refer to a disputation between two people; instead it refers to
1981the information presented to the function, in this case, to the
1982@code{+}. In Lisp, the arguments to a function are the atoms or lists
1983that follow the function. The values returned by the evaluation of
1984these atoms or lists are passed to the function. Different functions
1985require different numbers of arguments; some functions require none at
1986all.@footnote{It is curious to track the path by which the word `argument'
1987came to have two different meanings, one in mathematics and the other in
1988everyday English. According to the @cite{Oxford English Dictionary},
1989the word derives from the Latin for @samp{to make clear, prove}; thus it
1990came to mean, by one thread of derivation, `the evidence offered as
1991proof', which is to say, `the information offered', which led to its
1992meaning in Lisp. But in the other thread of derivation, it came to mean
1993`to assert in a manner against which others may make counter
1994assertions', which led to the meaning of the word as a disputation.
1995(Note here that the English word has two different definitions attached
1996to it at the same time. By contrast, in Emacs Lisp, a symbol cannot
1997have two different function definitions at the same time.)}
1998
1999@menu
2000* Data types:: Types of data passed to a function.
2001* Args as Variable or List:: An argument can be the value
2002 of a variable or list.
2003* Variable Number of Arguments:: Some functions may take a
2004 variable number of arguments.
2005* Wrong Type of Argument:: Passing an argument of the wrong type
2006 to a function.
2007* message:: A useful function for sending messages.
2008@end menu
2009
2010@node Data types, Args as Variable or List, Arguments, Arguments
2011@comment node-name, next, previous, up
2012@subsection Arguments' Data Types
2013@cindex Data types
2014@cindex Types of data
2015@cindex Arguments' data types
2016
2017The type of data that should be passed to a function depends on what
2018kind of information it uses. The arguments to a function such as
2019@code{+} must have values that are numbers, since @code{+} adds numbers.
2020Other functions use different kinds of data for their arguments.
2021
2022@need 1250
2023@findex concat
2024For example, the @code{concat} function links together or unites two or
2025more strings of text to produce a string. The arguments are strings.
2026Concatenating the two character strings @code{abc}, @code{def} produces
2027the single string @code{abcdef}. This can be seen by evaluating the
2028following:
2029
2030@smallexample
2031(concat "abc" "def")
2032@end smallexample
2033
2034@noindent
2035The value produced by evaluating this expression is @code{"abcdef"}.
2036
2037A function such as @code{substring} uses both a string and numbers as
2038arguments. The function returns a part of the string, a substring of
2039the first argument. This function takes three arguments. Its first
2040argument is the string of characters, the second and third arguments are
2041numbers that indicate the beginning and end of the substring. The
2042numbers are a count of the number of characters (including spaces and
e4920bc9 2043punctuation) from the beginning of the string.
8cda6f8f
GM
2044
2045@need 800
2046For example, if you evaluate the following:
2047
2048@smallexample
2049(substring "The quick brown fox jumped." 16 19)
2050@end smallexample
2051
2052@noindent
2053you will see @code{"fox"} appear in the echo area. The arguments are the
2054string and the two numbers.
2055
2056Note that the string passed to @code{substring} is a single atom even
2057though it is made up of several words separated by spaces. Lisp counts
2058everything between the two quotation marks as part of the string,
2059including the spaces. You can think of the @code{substring} function as
2060a kind of `atom smasher' since it takes an otherwise indivisible atom
2061and extracts a part. However, @code{substring} is only able to extract
2062a substring from an argument that is a string, not from another type of
2063atom such as a number or symbol.
2064
2065@node Args as Variable or List, Variable Number of Arguments, Data types, Arguments
2066@comment node-name, next, previous, up
2067@subsection An Argument as the Value of a Variable or List
2068
2069An argument can be a symbol that returns a value when it is evaluated.
2070For example, when the symbol @code{fill-column} by itself is evaluated,
2071it returns a number. This number can be used in an addition.
2072
2073@need 1250
2074Position the cursor after the following expression and type @kbd{C-x
2075C-e}:
2076
2077@smallexample
2078(+ 2 fill-column)
2079@end smallexample
2080
2081@noindent
2082The value will be a number two more than what you get by evaluating
2083@code{fill-column} alone. For me, this is 74, because my value of
2084@code{fill-column} is 72.
2085
2086As we have just seen, an argument can be a symbol that returns a value
2087when evaluated. In addition, an argument can be a list that returns a
2088value when it is evaluated. For example, in the following expression,
2089the arguments to the function @code{concat} are the strings
2090@w{@code{"The "}} and @w{@code{" red foxes."}} and the list
2091@code{(number-to-string (+ 2 fill-column))}.
2092
2093@c For GNU Emacs 22, need number-to-string
2094@smallexample
2095(concat "The " (number-to-string (+ 2 fill-column)) " red foxes.")
2096@end smallexample
2097
2098@noindent
2099If you evaluate this expression---and if, as with my Emacs,
2100@code{fill-column} evaluates to 72---@code{"The 74 red foxes."} will
2101appear in the echo area. (Note that you must put spaces after the
2102word @samp{The} and before the word @samp{red} so they will appear in
2103the final string. The function @code{number-to-string} converts the
2104integer that the addition function returns to a string.
2105@code{number-to-string} is also known as @code{int-to-string}.)
2106
2107@node Variable Number of Arguments, Wrong Type of Argument, Args as Variable or List, Arguments
2108@comment node-name, next, previous, up
2109@subsection Variable Number of Arguments
2110@cindex Variable number of arguments
2111@cindex Arguments, variable number of
2112
2113Some functions, such as @code{concat}, @code{+} or @code{*}, take any
2114number of arguments. (The @code{*} is the symbol for multiplication.)
2115This can be seen by evaluating each of the following expressions in
2116the usual way. What you will see in the echo area is printed in this
2117text after @samp{@result{}}, which you may read as `evaluates to'.
2118
2119@need 1250
2120In the first set, the functions have no arguments:
2121
2122@smallexample
2123@group
2124(+) @result{} 0
2125
2126(*) @result{} 1
2127@end group
2128@end smallexample
2129
2130@need 1250
2131In this set, the functions have one argument each:
2132
2133@smallexample
2134@group
2135(+ 3) @result{} 3
2136
2137(* 3) @result{} 3
2138@end group
2139@end smallexample
2140
2141@need 1250
2142In this set, the functions have three arguments each:
2143
2144@smallexample
2145@group
2146(+ 3 4 5) @result{} 12
2147
2148(* 3 4 5) @result{} 60
2149@end group
2150@end smallexample
2151
2152@node Wrong Type of Argument, message, Variable Number of Arguments, Arguments
2153@comment node-name, next, previous, up
2154@subsection Using the Wrong Type Object as an Argument
2155@cindex Wrong type of argument
2156@cindex Argument, wrong type of
2157
2158When a function is passed an argument of the wrong type, the Lisp
2159interpreter produces an error message. For example, the @code{+}
2160function expects the values of its arguments to be numbers. As an
2161experiment we can pass it the quoted symbol @code{hello} instead of a
2162number. Position the cursor after the following expression and type
2163@kbd{C-x C-e}:
2164
2165@smallexample
2166(+ 2 'hello)
2167@end smallexample
2168
2169@noindent
2170When you do this you will generate an error message. What has happened
2171is that @code{+} has tried to add the 2 to the value returned by
2172@code{'hello}, but the value returned by @code{'hello} is the symbol
2173@code{hello}, not a number. Only numbers can be added. So @code{+}
2174could not carry out its addition.
2175
2176@need 1250
2177In GNU Emacs version 22, you will create and enter a
2178@file{*Backtrace*} buffer that says:
2179
2180@noindent
2181@smallexample
2182@group
2183---------- Buffer: *Backtrace* ----------
2184Debugger entered--Lisp error:
2185 (wrong-type-argument number-or-marker-p hello)
2186 +(2 hello)
2187 eval((+ 2 (quote hello)))
2188 eval-last-sexp-1(nil)
2189 eval-last-sexp(nil)
2190 call-interactively(eval-last-sexp)
2191---------- Buffer: *Backtrace* ----------
2192@end group
2193@end smallexample
2194
2195@need 1250
2196As usual, the error message tries to be helpful and makes sense after you
2197learn how to read it.@footnote{@code{(quote hello)} is an expansion of
2198the abbreviation @code{'hello}.}
2199
2200The first part of the error message is straightforward; it says
2201@samp{wrong type argument}. Next comes the mysterious jargon word
2202@w{@samp{number-or-marker-p}}. This word is trying to tell you what
2203kind of argument the @code{+} expected.
2204
2205The symbol @code{number-or-marker-p} says that the Lisp interpreter is
2206trying to determine whether the information presented it (the value of
2207the argument) is a number or a marker (a special object representing a
2208buffer position). What it does is test to see whether the @code{+} is
2209being given numbers to add. It also tests to see whether the
2210argument is something called a marker, which is a specific feature of
2211Emacs Lisp. (In Emacs, locations in a buffer are recorded as markers.
2212When the mark is set with the @kbd{C-@@} or @kbd{C-@key{SPC}} command,
2213its position is kept as a marker. The mark can be considered a
2214number---the number of characters the location is from the beginning
2215of the buffer.) In Emacs Lisp, @code{+} can be used to add the
2216numeric value of marker positions as numbers.
2217
2218The @samp{p} of @code{number-or-marker-p} is the embodiment of a
2219practice started in the early days of Lisp programming. The @samp{p}
2220stands for `predicate'. In the jargon used by the early Lisp
2221researchers, a predicate refers to a function to determine whether some
2222property is true or false. So the @samp{p} tells us that
2223@code{number-or-marker-p} is the name of a function that determines
2224whether it is true or false that the argument supplied is a number or
2225a marker. Other Lisp symbols that end in @samp{p} include @code{zerop},
2226a function that tests whether its argument has the value of zero, and
2227@code{listp}, a function that tests whether its argument is a list.
2228
2229Finally, the last part of the error message is the symbol @code{hello}.
2230This is the value of the argument that was passed to @code{+}. If the
2231addition had been passed the correct type of object, the value passed
2232would have been a number, such as 37, rather than a symbol like
2233@code{hello}. But then you would not have got the error message.
2234
2235@ignore
2236@need 1250
2237In GNU Emacs version 20 and before, the echo area displays an error
2238message that says:
2239
2240@smallexample
2241Wrong type argument:@: number-or-marker-p, hello
2242@end smallexample
2243
2244This says, in different words, the same as the top line of the
2245@file{*Backtrace*} buffer.
2246@end ignore
2247
2248@node message, , Wrong Type of Argument, Arguments
2249@comment node-name, next, previous, up
2250@subsection The @code{message} Function
2251@findex message
2252
2253Like @code{+}, the @code{message} function takes a variable number of
2254arguments. It is used to send messages to the user and is so useful
2255that we will describe it here.
2256
2257@need 1250
2258A message is printed in the echo area. For example, you can print a
2259message in your echo area by evaluating the following list:
2260
2261@smallexample
2262(message "This message appears in the echo area!")
2263@end smallexample
2264
2265The whole string between double quotation marks is a single argument
2266and is printed @i{in toto}. (Note that in this example, the message
2267itself will appear in the echo area within double quotes; that is
2268because you see the value returned by the @code{message} function. In
2269most uses of @code{message} in programs that you write, the text will
2270be printed in the echo area as a side-effect, without the quotes.
2271@xref{multiply-by-seven in detail, , @code{multiply-by-seven} in
2272detail}, for an example of this.)
2273
2274However, if there is a @samp{%s} in the quoted string of characters, the
2275@code{message} function does not print the @samp{%s} as such, but looks
2276to the argument that follows the string. It evaluates the second
2277argument and prints the value at the location in the string where the
2278@samp{%s} is.
2279
2280@need 1250
2281You can see this by positioning the cursor after the following
2282expression and typing @kbd{C-x C-e}:
2283
2284@smallexample
2285(message "The name of this buffer is: %s." (buffer-name))
2286@end smallexample
2287
2288@noindent
2289In Info, @code{"The name of this buffer is: *info*."} will appear in the
2290echo area. The function @code{buffer-name} returns the name of the
2291buffer as a string, which the @code{message} function inserts in place
2292of @code{%s}.
2293
2294To print a value as an integer, use @samp{%d} in the same way as
2295@samp{%s}. For example, to print a message in the echo area that
2296states the value of the @code{fill-column}, evaluate the following:
2297
2298@smallexample
2299(message "The value of fill-column is %d." fill-column)
2300@end smallexample
2301
2302@noindent
2303On my system, when I evaluate this list, @code{"The value of
2304fill-column is 72."} appears in my echo area@footnote{Actually, you
2305can use @code{%s} to print a number. It is non-specific. @code{%d}
2306prints only the part of a number left of a decimal point, and not
2307anything that is not a number.}.
2308
2309If there is more than one @samp{%s} in the quoted string, the value of
2310the first argument following the quoted string is printed at the
2311location of the first @samp{%s} and the value of the second argument is
2312printed at the location of the second @samp{%s}, and so on.
2313
2314@need 1250
2315For example, if you evaluate the following,
2316
2317@smallexample
2318@group
2319(message "There are %d %s in the office!"
2320 (- fill-column 14) "pink elephants")
2321@end group
2322@end smallexample
2323
2324@noindent
2325a rather whimsical message will appear in your echo area. On my system
2326it says, @code{"There are 58 pink elephants in the office!"}.
2327
2328The expression @code{(- fill-column 14)} is evaluated and the resulting
2329number is inserted in place of the @samp{%d}; and the string in double
2330quotes, @code{"pink elephants"}, is treated as a single argument and
2331inserted in place of the @samp{%s}. (That is to say, a string between
2332double quotes evaluates to itself, like a number.)
2333
2334Finally, here is a somewhat complex example that not only illustrates
2335the computation of a number, but also shows how you can use an
2336expression within an expression to generate the text that is substituted
2337for @samp{%s}:
2338
2339@smallexample
2340@group
2341(message "He saw %d %s"
2342 (- fill-column 32)
2343 (concat "red "
2344 (substring
2345 "The quick brown foxes jumped." 16 21)
2346 " leaping."))
2347@end group
2348@end smallexample
2349
2350In this example, @code{message} has three arguments: the string,
2351@code{"He saw %d %s"}, the expression, @code{(- fill-column 32)}, and
2352the expression beginning with the function @code{concat}. The value
2353resulting from the evaluation of @code{(- fill-column 32)} is inserted
2354in place of the @samp{%d}; and the value returned by the expression
2355beginning with @code{concat} is inserted in place of the @samp{%s}.
2356
2357When your fill column is 70 and you evaluate the expression, the
2358message @code{"He saw 38 red foxes leaping."} appears in your echo
2359area.
2360
2361@node set & setq, Summary, Arguments, List Processing
2362@comment node-name, next, previous, up
2363@section Setting the Value of a Variable
2364@cindex Variable, setting value
2365@cindex Setting value of variable
2366
2367@cindex @samp{bind} defined
2368There are several ways by which a variable can be given a value. One of
2369the ways is to use either the function @code{set} or the function
2370@code{setq}. Another way is to use @code{let} (@pxref{let}). (The
2371jargon for this process is to @dfn{bind} a variable to a value.)
2372
2373The following sections not only describe how @code{set} and @code{setq}
2374work but also illustrate how arguments are passed.
2375
2376@menu
2377* Using set:: Setting values.
2378* Using setq:: Setting a quoted value.
2379* Counting:: Using @code{setq} to count.
2380@end menu
2381
2382@node Using set, Using setq, set & setq, set & setq
2383@comment node-name, next, previous, up
2384@subsection Using @code{set}
2385@findex set
2386
2387To set the value of the symbol @code{flowers} to the list @code{'(rose
2388violet daisy buttercup)}, evaluate the following expression by
2389positioning the cursor after the expression and typing @kbd{C-x C-e}.
2390
2391@smallexample
2392(set 'flowers '(rose violet daisy buttercup))
2393@end smallexample
2394
2395@noindent
2396The list @code{(rose violet daisy buttercup)} will appear in the echo
2397area. This is what is @emph{returned} by the @code{set} function. As a
2398side effect, the symbol @code{flowers} is bound to the list; that is,
2399the symbol @code{flowers}, which can be viewed as a variable, is given
2400the list as its value. (This process, by the way, illustrates how a
2401side effect to the Lisp interpreter, setting the value, can be the
2402primary effect that we humans are interested in. This is because every
2403Lisp function must return a value if it does not get an error, but it
2404will only have a side effect if it is designed to have one.)
2405
2406After evaluating the @code{set} expression, you can evaluate the symbol
2407@code{flowers} and it will return the value you just set. Here is the
2408symbol. Place your cursor after it and type @kbd{C-x C-e}.
2409
2410@smallexample
2411flowers
2412@end smallexample
2413
2414@noindent
2415When you evaluate @code{flowers}, the list
2416@code{(rose violet daisy buttercup)} appears in the echo area.
2417
2418Incidentally, if you evaluate @code{'flowers}, the variable with a quote
2419in front of it, what you will see in the echo area is the symbol itself,
2420@code{flowers}. Here is the quoted symbol, so you can try this:
2421
2422@smallexample
2423'flowers
2424@end smallexample
2425
2426Note also, that when you use @code{set}, you need to quote both
2427arguments to @code{set}, unless you want them evaluated. Since we do
2428not want either argument evaluated, neither the variable
2429@code{flowers} nor the list @code{(rose violet daisy buttercup)}, both
2430are quoted. (When you use @code{set} without quoting its first
2431argument, the first argument is evaluated before anything else is
2432done. If you did this and @code{flowers} did not have a value
2433already, you would get an error message that the @samp{Symbol's value
2434as variable is void}; on the other hand, if @code{flowers} did return
2435a value after it was evaluated, the @code{set} would attempt to set
2436the value that was returned. There are situations where this is the
2437right thing for the function to do; but such situations are rare.)
2438
2439@node Using setq, Counting, Using set, set & setq
2440@comment node-name, next, previous, up
2441@subsection Using @code{setq}
2442@findex setq
2443
2444As a practical matter, you almost always quote the first argument to
2445@code{set}. The combination of @code{set} and a quoted first argument
2446is so common that it has its own name: the special form @code{setq}.
2447This special form is just like @code{set} except that the first argument
2448is quoted automatically, so you don't need to type the quote mark
2449yourself. Also, as an added convenience, @code{setq} permits you to set
2450several different variables to different values, all in one expression.
2451
2452To set the value of the variable @code{carnivores} to the list
2453@code{'(lion tiger leopard)} using @code{setq}, the following expression
2454is used:
2455
2456@smallexample
2457(setq carnivores '(lion tiger leopard))
2458@end smallexample
2459
2460@noindent
2461This is exactly the same as using @code{set} except the first argument
2462is automatically quoted by @code{setq}. (The @samp{q} in @code{setq}
2463means @code{quote}.)
2464
2465@need 1250
2466With @code{set}, the expression would look like this:
2467
2468@smallexample
2469(set 'carnivores '(lion tiger leopard))
2470@end smallexample
2471
2472Also, @code{setq} can be used to assign different values to
2473different variables. The first argument is bound to the value
2474of the second argument, the third argument is bound to the value of the
2475fourth argument, and so on. For example, you could use the following to
2476assign a list of trees to the symbol @code{trees} and a list of herbivores
2477to the symbol @code{herbivores}:
2478
2479@smallexample
2480@group
2481(setq trees '(pine fir oak maple)
2482 herbivores '(gazelle antelope zebra))
2483@end group
2484@end smallexample
2485
2486@noindent
2487(The expression could just as well have been on one line, but it might
2488not have fit on a page; and humans find it easier to read nicely
2489formatted lists.)
2490
2491Although I have been using the term `assign', there is another way of
2492thinking about the workings of @code{set} and @code{setq}; and that is to
2493say that @code{set} and @code{setq} make the symbol @emph{point} to the
2494list. This latter way of thinking is very common and in forthcoming
2495chapters we shall come upon at least one symbol that has `pointer' as
2496part of its name. The name is chosen because the symbol has a value,
2497specifically a list, attached to it; or, expressed another way,
2498the symbol is set to ``point'' to the list.
2499
2500@node Counting, , Using setq, set & setq
2501@comment node-name, next, previous, up
2502@subsection Counting
2503@cindex Counting
2504
2505Here is an example that shows how to use @code{setq} in a counter. You
2506might use this to count how many times a part of your program repeats
2507itself. First set a variable to zero; then add one to the number each
2508time the program repeats itself. To do this, you need a variable that
2509serves as a counter, and two expressions: an initial @code{setq}
2510expression that sets the counter variable to zero; and a second
2511@code{setq} expression that increments the counter each time it is
2512evaluated.
2513
2514@smallexample
2515@group
2516(setq counter 0) ; @r{Let's call this the initializer.}
2517
2518(setq counter (+ counter 1)) ; @r{This is the incrementer.}
2519
2520counter ; @r{This is the counter.}
2521@end group
2522@end smallexample
2523
2524@noindent
2525(The text following the @samp{;} are comments. @xref{Change a
2526defun, , Change a Function Definition}.)
2527
2528If you evaluate the first of these expressions, the initializer,
2529@code{(setq counter 0)}, and then evaluate the third expression,
2530@code{counter}, the number @code{0} will appear in the echo area. If
2531you then evaluate the second expression, the incrementer, @code{(setq
2532counter (+ counter 1))}, the counter will get the value 1. So if you
2533again evaluate @code{counter}, the number @code{1} will appear in the
2534echo area. Each time you evaluate the second expression, the value of
2535the counter will be incremented.
2536
2537When you evaluate the incrementer, @code{(setq counter (+ counter 1))},
2538the Lisp interpreter first evaluates the innermost list; this is the
2539addition. In order to evaluate this list, it must evaluate the variable
2540@code{counter} and the number @code{1}. When it evaluates the variable
2541@code{counter}, it receives its current value. It passes this value and
2542the number @code{1} to the @code{+} which adds them together. The sum
2543is then returned as the value of the inner list and passed to the
2544@code{setq} which sets the variable @code{counter} to this new value.
2545Thus, the value of the variable, @code{counter}, is changed.
2546
2547@node Summary, Error Message Exercises, set & setq, List Processing
2548@comment node-name, next, previous, up
2549@section Summary
2550
2551Learning Lisp is like climbing a hill in which the first part is the
2552steepest. You have now climbed the most difficult part; what remains
2553becomes easier as you progress onwards.
2554
2555@need 1000
2556In summary,
2557
2558@itemize @bullet
2559
2560@item
2561Lisp programs are made up of expressions, which are lists or single atoms.
2562
2563@item
2564Lists are made up of zero or more atoms or inner lists, separated by whitespace and
2565surrounded by parentheses. A list can be empty.
2566
2567@item
2568Atoms are multi-character symbols, like @code{forward-paragraph}, single
2569character symbols like @code{+}, strings of characters between double
2570quotation marks, or numbers.
2571
2572@item
2573A number evaluates to itself.
2574
2575@item
2576A string between double quotes also evaluates to itself.
2577
2578@item
2579When you evaluate a symbol by itself, its value is returned.
2580
2581@item
2582When you evaluate a list, the Lisp interpreter looks at the first symbol
2583in the list and then at the function definition bound to that symbol.
2584Then the instructions in the function definition are carried out.
2585
2586@item
2587A single quotation mark,
2588@ifinfo
2589'
2590@end ifinfo
2591@ifnotinfo
2592@code{'}
2593@end ifnotinfo
2594, tells the Lisp interpreter that it should
2595return the following expression as written, and not evaluate it as it
2596would if the quote were not there.
2597
2598@item
2599Arguments are the information passed to a function. The arguments to a
2600function are computed by evaluating the rest of the elements of the list
2601of which the function is the first element.
2602
2603@item
2604A function always returns a value when it is evaluated (unless it gets
2605an error); in addition, it may also carry out some action called a
2606``side effect''. In many cases, a function's primary purpose is to
2607create a side effect.
2608@end itemize
2609
2610@node Error Message Exercises, , Summary, List Processing
2611@comment node-name, next, previous, up
2612@section Exercises
2613
2614A few simple exercises:
2615
2616@itemize @bullet
2617@item
2618Generate an error message by evaluating an appropriate symbol that is
2619not within parentheses.
2620
2621@item
2622Generate an error message by evaluating an appropriate symbol that is
2623between parentheses.
2624
2625@item
2626Create a counter that increments by two rather than one.
2627
2628@item
2629Write an expression that prints a message in the echo area when
2630evaluated.
2631@end itemize
2632
2633@node Practicing Evaluation, Writing Defuns, List Processing, Top
2634@comment node-name, next, previous, up
2635@chapter Practicing Evaluation
2636@cindex Practicing evaluation
2637@cindex Evaluation practice
2638
2639Before learning how to write a function definition in Emacs Lisp, it is
2640useful to spend a little time evaluating various expressions that have
2641already been written. These expressions will be lists with the
2642functions as their first (and often only) element. Since some of the
2643functions associated with buffers are both simple and interesting, we
2644will start with those. In this section, we will evaluate a few of
2645these. In another section, we will study the code of several other
2646buffer-related functions, to see how they were written.
2647
2648@menu
2649* How to Evaluate:: Typing editing commands or @kbd{C-x C-e}
2650 causes evaluation.
2651* Buffer Names:: Buffers and files are different.
2652* Getting Buffers:: Getting a buffer itself, not merely its name.
2653* Switching Buffers:: How to change to another buffer.
2654* Buffer Size & Locations:: Where point is located and the size of
2655 the buffer.
2656* Evaluation Exercise::
2657@end menu
2658
2659@node How to Evaluate, Buffer Names, Practicing Evaluation, Practicing Evaluation
2660@ifnottex
2661@unnumberedsec How to Evaluate
2662@end ifnottex
2663
2664@i{Whenever you give an editing command} to Emacs Lisp, such as the
2665command to move the cursor or to scroll the screen, @i{you are evaluating
2666an expression,} the first element of which is a function. @i{This is
2667how Emacs works.}
2668
2669@cindex @samp{interactive function} defined
2670@cindex @samp{command} defined
2671When you type keys, you cause the Lisp interpreter to evaluate an
2672expression and that is how you get your results. Even typing plain text
2673involves evaluating an Emacs Lisp function, in this case, one that uses
2674@code{self-insert-command}, which simply inserts the character you
2675typed. The functions you evaluate by typing keystrokes are called
2676@dfn{interactive} functions, or @dfn{commands}; how you make a function
2677interactive will be illustrated in the chapter on how to write function
2678definitions. @xref{Interactive, , Making a Function Interactive}.
2679
2680In addition to typing keyboard commands, we have seen a second way to
2681evaluate an expression: by positioning the cursor after a list and
2682typing @kbd{C-x C-e}. This is what we will do in the rest of this
2683section. There are other ways to evaluate an expression as well; these
2684will be described as we come to them.
2685
2686Besides being used for practicing evaluation, the functions shown in the
2687next few sections are important in their own right. A study of these
2688functions makes clear the distinction between buffers and files, how to
2689switch to a buffer, and how to determine a location within it.
2690
2691@node Buffer Names, Getting Buffers, How to Evaluate, Practicing Evaluation
2692@comment node-name, next, previous, up
2693@section Buffer Names
2694@findex buffer-name
2695@findex buffer-file-name
2696
2697The two functions, @code{buffer-name} and @code{buffer-file-name}, show
2698the difference between a file and a buffer. When you evaluate the
2699following expression, @code{(buffer-name)}, the name of the buffer
2700appears in the echo area. When you evaluate @code{(buffer-file-name)},
2701the name of the file to which the buffer refers appears in the echo
2702area. Usually, the name returned by @code{(buffer-name)} is the same as
2703the name of the file to which it refers, and the name returned by
2704@code{(buffer-file-name)} is the full path-name of the file.
2705
2706A file and a buffer are two different entities. A file is information
2707recorded permanently in the computer (unless you delete it). A buffer,
2708on the other hand, is information inside of Emacs that will vanish at
2709the end of the editing session (or when you kill the buffer). Usually,
2710a buffer contains information that you have copied from a file; we say
2711the buffer is @dfn{visiting} that file. This copy is what you work on
2712and modify. Changes to the buffer do not change the file, until you
2713save the buffer. When you save the buffer, the buffer is copied to the file
2714and is thus saved permanently.
2715
2716@need 1250
2717If you are reading this in Info inside of GNU Emacs, you can evaluate
2718each of the following expressions by positioning the cursor after it and
2719typing @kbd{C-x C-e}.
2720
2721@example
2722@group
2723(buffer-name)
2724
2725(buffer-file-name)
2726@end group
2727@end example
2728
2729@noindent
2730When I do this in Info, the value returned by evaluating
2731@code{(buffer-name)} is @file{"*info*"}, and the value returned by
2732evaluating @code{(buffer-file-name)} is @file{nil}.
2733
a9097c6d 2734On the other hand, while I am writing this document, the value
8cda6f8f
GM
2735returned by evaluating @code{(buffer-name)} is
2736@file{"introduction.texinfo"}, and the value returned by evaluating
2737@code{(buffer-file-name)} is
2738@file{"/gnu/work/intro/introduction.texinfo"}.
2739
2740@cindex @code{nil}, history of word
2741The former is the name of the buffer and the latter is the name of the
2742file. In Info, the buffer name is @file{"*info*"}. Info does not
2743point to any file, so the result of evaluating
2744@code{(buffer-file-name)} is @file{nil}. The symbol @code{nil} is
2745from the Latin word for `nothing'; in this case, it means that the
2746buffer is not associated with any file. (In Lisp, @code{nil} is also
2747used to mean `false' and is a synonym for the empty list, @code{()}.)
2748
2749When I am writing, the name of my buffer is
2750@file{"introduction.texinfo"}. The name of the file to which it
2751points is @file{"/gnu/work/intro/introduction.texinfo"}.
2752
2753(In the expressions, the parentheses tell the Lisp interpreter to
2754treat @w{@code{buffer-name}} and @w{@code{buffer-file-name}} as
2755functions; without the parentheses, the interpreter would attempt to
2756evaluate the symbols as variables. @xref{Variables}.)
2757
2758In spite of the distinction between files and buffers, you will often
2759find that people refer to a file when they mean a buffer and vice-verse.
2760Indeed, most people say, ``I am editing a file,'' rather than saying,
2761``I am editing a buffer which I will soon save to a file.'' It is
2762almost always clear from context what people mean. When dealing with
2763computer programs, however, it is important to keep the distinction in mind,
2764since the computer is not as smart as a person.
2765
2766@cindex Buffer, history of word
2767The word `buffer', by the way, comes from the meaning of the word as a
2768cushion that deadens the force of a collision. In early computers, a
2769buffer cushioned the interaction between files and the computer's
2770central processing unit. The drums or tapes that held a file and the
2771central processing unit were pieces of equipment that were very
2772different from each other, working at their own speeds, in spurts. The
2773buffer made it possible for them to work together effectively.
2774Eventually, the buffer grew from being an intermediary, a temporary
2775holding place, to being the place where work is done. This
2776transformation is rather like that of a small seaport that grew into a
2777great city: once it was merely the place where cargo was warehoused
2778temporarily before being loaded onto ships; then it became a business
2779and cultural center in its own right.
2780
2781Not all buffers are associated with files. For example, a
2782@file{*scratch*} buffer does not visit any file. Similarly, a
2783@file{*Help*} buffer is not associated with any file.
2784
2785In the old days, when you lacked a @file{~/.emacs} file and started an
2786Emacs session by typing the command @code{emacs} alone, without naming
2787any files, Emacs started with the @file{*scratch*} buffer visible.
2788Nowadays, you will see a splash screen. You can follow one of the
2789commands suggested on the splash screen, visit a file, or press the
2790spacebar to reach the @file{*scratch*} buffer.
2791
2792If you switch to the @file{*scratch*} buffer, type
2793@code{(buffer-name)}, position the cursor after it, and then type
2794@kbd{C-x C-e} to evaluate the expression. The name @code{"*scratch*"}
2795will be returned and will appear in the echo area. @code{"*scratch*"}
2796is the name of the buffer. When you type @code{(buffer-file-name)} in
2797the @file{*scratch*} buffer and evaluate that, @code{nil} will appear
2798in the echo area, just as it does when you evaluate
2799@code{(buffer-file-name)} in Info.
2800
2801Incidentally, if you are in the @file{*scratch*} buffer and want the
2802value returned by an expression to appear in the @file{*scratch*}
2803buffer itself rather than in the echo area, type @kbd{C-u C-x C-e}
2804instead of @kbd{C-x C-e}. This causes the value returned to appear
2805after the expression. The buffer will look like this:
2806
2807@smallexample
2808(buffer-name)"*scratch*"
2809@end smallexample
2810
2811@noindent
2812You cannot do this in Info since Info is read-only and it will not allow
2813you to change the contents of the buffer. But you can do this in any
2814buffer you can edit; and when you write code or documentation (such as
2815this book), this feature is very useful.
2816
2817@node Getting Buffers, Switching Buffers, Buffer Names, Practicing Evaluation
2818@comment node-name, next, previous, up
2819@section Getting Buffers
2820@findex current-buffer
2821@findex other-buffer
2822@cindex Getting a buffer
2823
2824The @code{buffer-name} function returns the @emph{name} of the buffer;
2825to get the buffer @emph{itself}, a different function is needed: the
2826@code{current-buffer} function. If you use this function in code, what
2827you get is the buffer itself.
2828
2829A name and the object or entity to which the name refers are different
2830from each other. You are not your name. You are a person to whom
2831others refer by name. If you ask to speak to George and someone hands you
2832a card with the letters @samp{G}, @samp{e}, @samp{o}, @samp{r},
2833@samp{g}, and @samp{e} written on it, you might be amused, but you would
2834not be satisfied. You do not want to speak to the name, but to the
2835person to whom the name refers. A buffer is similar: the name of the
2836scratch buffer is @file{*scratch*}, but the name is not the buffer. To
2837get a buffer itself, you need to use a function such as
2838@code{current-buffer}.
2839
2840However, there is a slight complication: if you evaluate
2841@code{current-buffer} in an expression on its own, as we will do here,
2842what you see is a printed representation of the name of the buffer
2843without the contents of the buffer. Emacs works this way for two
2844reasons: the buffer may be thousands of lines long---too long to be
2845conveniently displayed; and, another buffer may have the same contents
2846but a different name, and it is important to distinguish between them.
2847
2848@need 800
2849Here is an expression containing the function:
2850
2851@smallexample
2852(current-buffer)
2853@end smallexample
2854
2855@noindent
2856If you evaluate this expression in Info in Emacs in the usual way,
2857@file{#<buffer *info*>} will appear in the echo area. The special
2858format indicates that the buffer itself is being returned, rather than
2859just its name.
2860
2861Incidentally, while you can type a number or symbol into a program, you
2862cannot do that with the printed representation of a buffer: the only way
2863to get a buffer itself is with a function such as @code{current-buffer}.
2864
2865A related function is @code{other-buffer}. This returns the most
2866recently selected buffer other than the one you are in currently, not
2867a printed representation of its name. If you have recently switched
2868back and forth from the @file{*scratch*} buffer, @code{other-buffer}
2869will return that buffer.
2870
2871@need 800
2872You can see this by evaluating the expression:
2873
2874@smallexample
2875(other-buffer)
2876@end smallexample
2877
2878@noindent
2879You should see @file{#<buffer *scratch*>} appear in the echo area, or
2880the name of whatever other buffer you switched back from most
2881recently@footnote{Actually, by default, if the buffer from which you
2882just switched is visible to you in another window, @code{other-buffer}
2883will choose the most recent buffer that you cannot see; this is a
2884subtlety that I often forget.}.
2885
2886@node Switching Buffers, Buffer Size & Locations, Getting Buffers, Practicing Evaluation
2887@comment node-name, next, previous, up
2888@section Switching Buffers
2889@findex switch-to-buffer
2890@findex set-buffer
2891@cindex Switching to a buffer
2892
2893The @code{other-buffer} function actually provides a buffer when it is
2894used as an argument to a function that requires one. We can see this
2895by using @code{other-buffer} and @code{switch-to-buffer} to switch to a
2896different buffer.
2897
2898But first, a brief introduction to the @code{switch-to-buffer}
2899function. When you switched back and forth from Info to the
2900@file{*scratch*} buffer to evaluate @code{(buffer-name)}, you most
2901likely typed @kbd{C-x b} and then typed @file{*scratch*}@footnote{Or
2902rather, to save typing, you probably only typed @kbd{RET} if the
2903default buffer was @file{*scratch*}, or if it was different, then you
2904typed just part of the name, such as @code{*sc}, pressed your
2905@kbd{TAB} key to cause it to expand to the full name, and then typed
2906your @kbd{RET} key.} when prompted in the minibuffer for the name of
2907the buffer to which you wanted to switch. The keystrokes, @kbd{C-x
2908b}, cause the Lisp interpreter to evaluate the interactive function
2909@code{switch-to-buffer}. As we said before, this is how Emacs works:
2910different keystrokes call or run different functions. For example,
2911@kbd{C-f} calls @code{forward-char}, @kbd{M-e} calls
2912@code{forward-sentence}, and so on.
2913
2914By writing @code{switch-to-buffer} in an expression, and giving it a
2915buffer to switch to, we can switch buffers just the way @kbd{C-x b}
2916does.
2917
2918@need 1000
2919Here is the Lisp expression:
2920
2921@smallexample
2922(switch-to-buffer (other-buffer))
2923@end smallexample
2924
2925@noindent
2926The symbol @code{switch-to-buffer} is the first element of the list,
2927so the Lisp interpreter will treat it as a function and carry out the
2928instructions that are attached to it. But before doing that, the
2929interpreter will note that @code{other-buffer} is inside parentheses
2930and work on that symbol first. @code{other-buffer} is the first (and
2931in this case, the only) element of this list, so the Lisp interpreter
2932calls or runs the function. It returns another buffer. Next, the
2933interpreter runs @code{switch-to-buffer}, passing to it, as an
2934argument, the other buffer, which is what Emacs will switch to. If
2935you are reading this in Info, try this now. Evaluate the expression.
2936(To get back, type @kbd{C-x b @key{RET}}.)@footnote{Remember, this
2937expression will move you to your most recent other buffer that you
2938cannot see. If you really want to go to your most recently selected
2939buffer, even if you can still see it, you need to evaluate the
2940following more complex expression:
2941
2942@smallexample
2943(switch-to-buffer (other-buffer (current-buffer) t))
2944@end smallexample
2945
2946@c noindent
2947In this case, the first argument to @code{other-buffer} tells it which
2948buffer to skip---the current one---and the second argument tells
2949@code{other-buffer} it is OK to switch to a visible buffer.
2950In regular use, @code{switch-to-buffer} takes you to an invisible
2951window since you would most likely use @kbd{C-x o} (@code{other-window})
2952to go to another visible buffer.}
2953
2954In the programming examples in later sections of this document, you will
2955see the function @code{set-buffer} more often than
2956@code{switch-to-buffer}. This is because of a difference between
2957computer programs and humans: humans have eyes and expect to see the
2958buffer on which they are working on their computer terminals. This is
2959so obvious, it almost goes without saying. However, programs do not
2960have eyes. When a computer program works on a buffer, that buffer does
2961not need to be visible on the screen.
2962
2963@code{switch-to-buffer} is designed for humans and does two different
2964things: it switches the buffer to which Emacs' attention is directed; and
2965it switches the buffer displayed in the window to the new buffer.
2966@code{set-buffer}, on the other hand, does only one thing: it switches
2967the attention of the computer program to a different buffer. The buffer
2968on the screen remains unchanged (of course, normally nothing happens
2969there until the command finishes running).
2970
2971@cindex @samp{call} defined
2972Also, we have just introduced another jargon term, the word @dfn{call}.
2973When you evaluate a list in which the first symbol is a function, you
2974are calling that function. The use of the term comes from the notion of
2975the function as an entity that can do something for you if you `call'
2976it---just as a plumber is an entity who can fix a leak if you call him
2977or her.
2978
2979@node Buffer Size & Locations, Evaluation Exercise, Switching Buffers, Practicing Evaluation
2980@comment node-name, next, previous, up
2981@section Buffer Size and the Location of Point
2982@cindex Size of buffer
2983@cindex Buffer size
2984@cindex Point location
2985@cindex Location of point
2986
2987Finally, let's look at several rather simple functions,
2988@code{buffer-size}, @code{point}, @code{point-min}, and
2989@code{point-max}. These give information about the size of a buffer and
2990the location of point within it.
2991
2992The function @code{buffer-size} tells you the size of the current
2993buffer; that is, the function returns a count of the number of
2994characters in the buffer.
2995
2996@smallexample
2997(buffer-size)
2998@end smallexample
2999
3000@noindent
3001You can evaluate this in the usual way, by positioning the
3002cursor after the expression and typing @kbd{C-x C-e}.
3003
3004@cindex @samp{point} defined
3005In Emacs, the current position of the cursor is called @dfn{point}.
3006The expression @code{(point)} returns a number that tells you where the
3007cursor is located as a count of the number of characters from the
3008beginning of the buffer up to point.
3009
3010@need 1250
3011You can see the character count for point in this buffer by evaluating
3012the following expression in the usual way:
3013
3014@smallexample
3015(point)
3016@end smallexample
3017
3018@noindent
3019As I write this, the value of @code{point} is 65724. The @code{point}
3020function is frequently used in some of the examples later in this
3021book.
3022
3023@need 1250
3024The value of point depends, of course, on its location within the
3025buffer. If you evaluate point in this spot, the number will be larger:
3026
3027@smallexample
3028(point)
3029@end smallexample
3030
3031@noindent
3032For me, the value of point in this location is 66043, which means that
3033there are 319 characters (including spaces) between the two
3034expressions. (Doubtless, you will see different numbers, since I will
3035have edited this since I first evaluated point.)
3036
3037@cindex @samp{narrowing} defined
3038The function @code{point-min} is somewhat similar to @code{point}, but
3039it returns the value of the minimum permissible value of point in the
3040current buffer. This is the number 1 unless @dfn{narrowing} is in
3041effect. (Narrowing is a mechanism whereby you can restrict yourself,
3042or a program, to operations on just a part of a buffer.
3043@xref{Narrowing & Widening, , Narrowing and Widening}.) Likewise, the
3044function @code{point-max} returns the value of the maximum permissible
3045value of point in the current buffer.
3046
3047@node Evaluation Exercise, , Buffer Size & Locations, Practicing Evaluation
3048@section Exercise
3049
3050Find a file with which you are working and move towards its middle.
3051Find its buffer name, file name, length, and your position in the file.
3052
3053@node Writing Defuns, Buffer Walk Through, Practicing Evaluation, Top
3054@comment node-name, next, previous, up
3055@chapter How To Write Function Definitions
3056@cindex Definition writing
3057@cindex Function definition writing
3058@cindex Writing a function definition
3059
3060When the Lisp interpreter evaluates a list, it looks to see whether the
3061first symbol on the list has a function definition attached to it; or,
3062put another way, whether the symbol points to a function definition. If
3063it does, the computer carries out the instructions in the definition. A
3064symbol that has a function definition is called, simply, a function
3065(although, properly speaking, the definition is the function and the
3066symbol refers to it.)
3067
3068@menu
3069* Primitive Functions::
3070* defun:: The @code{defun} special form.
3071* Install:: Install a function definition.
3072* Interactive:: Making a function interactive.
3073* Interactive Options:: Different options for @code{interactive}.
3074* Permanent Installation:: Installing code permanently.
3075* let:: Creating and initializing local variables.
3076* if:: What if?
3077* else:: If--then--else expressions.
3078* Truth & Falsehood:: What Lisp considers false and true.
3079* save-excursion:: Keeping track of point, mark, and buffer.
3080* Review::
3081* defun Exercises::
3082@end menu
3083
3084@node Primitive Functions, defun, Writing Defuns, Writing Defuns
3085@ifnottex
3086@unnumberedsec An Aside about Primitive Functions
3087@end ifnottex
3088@cindex Primitive functions
3089@cindex Functions, primitive
3090
3091@cindex C language primitives
3092@cindex Primitives written in C
3093All functions are defined in terms of other functions, except for a few
3094@dfn{primitive} functions that are written in the C programming
3095language. When you write functions' definitions, you will write them in
3096Emacs Lisp and use other functions as your building blocks. Some of the
3097functions you will use will themselves be written in Emacs Lisp (perhaps
3098by you) and some will be primitives written in C. The primitive
3099functions are used exactly like those written in Emacs Lisp and behave
3100like them. They are written in C so we can easily run GNU Emacs on any
3101computer that has sufficient power and can run C.
3102
3103Let me re-emphasize this: when you write code in Emacs Lisp, you do not
3104distinguish between the use of functions written in C and the use of
3105functions written in Emacs Lisp. The difference is irrelevant. I
3106mention the distinction only because it is interesting to know. Indeed,
3107unless you investigate, you won't know whether an already-written
3108function is written in Emacs Lisp or C.
3109
3110@node defun, Install, Primitive Functions, Writing Defuns
3111@comment node-name, next, previous, up
3112@section The @code{defun} Special Form
3113@findex defun
3114@cindex Special form of @code{defun}
3115
3116@cindex @samp{function definition} defined
3117In Lisp, a symbol such as @code{mark-whole-buffer} has code attached to
3118it that tells the computer what to do when the function is called.
3119This code is called the @dfn{function definition} and is created by
3120evaluating a Lisp expression that starts with the symbol @code{defun}
3121(which is an abbreviation for @emph{define function}). Because
3122@code{defun} does not evaluate its arguments in the usual way, it is
3123called a @dfn{special form}.
3124
3125In subsequent sections, we will look at function definitions from the
3126Emacs source code, such as @code{mark-whole-buffer}. In this section,
3127we will describe a simple function definition so you can see how it
3128looks. This function definition uses arithmetic because it makes for a
3129simple example. Some people dislike examples using arithmetic; however,
3130if you are such a person, do not despair. Hardly any of the code we
3131will study in the remainder of this introduction involves arithmetic or
3132mathematics. The examples mostly involve text in one way or another.
3133
3134A function definition has up to five parts following the word
3135@code{defun}:
3136
3137@enumerate
3138@item
3139The name of the symbol to which the function definition should be
3140attached.
3141
3142@item
3143A list of the arguments that will be passed to the function. If no
3144arguments will be passed to the function, this is an empty list,
3145@code{()}.
3146
3147@item
3148Documentation describing the function. (Technically optional, but
3149strongly recommended.)
3150
3151@item
3152Optionally, an expression to make the function interactive so you can
3153use it by typing @kbd{M-x} and then the name of the function; or by
3154typing an appropriate key or keychord.
3155
3156@cindex @samp{body} defined
3157@item
3158The code that instructs the computer what to do: the @dfn{body} of the
3159function definition.
3160@end enumerate
3161
3162It is helpful to think of the five parts of a function definition as
3163being organized in a template, with slots for each part:
3164
3165@smallexample
3166@group
3167(defun @var{function-name} (@var{arguments}@dots{})
3168 "@var{optional-documentation}@dots{}"
3169 (interactive @var{argument-passing-info}) ; @r{optional}
3170 @var{body}@dots{})
3171@end group
3172@end smallexample
3173
3174As an example, here is the code for a function that multiplies its
3175argument by 7. (This example is not interactive. @xref{Interactive,
3176, Making a Function Interactive}, for that information.)
3177
3178@smallexample
3179@group
3180(defun multiply-by-seven (number)
3181 "Multiply NUMBER by seven."
3182 (* 7 number))
3183@end group
3184@end smallexample
3185
3186This definition begins with a parenthesis and the symbol @code{defun},
3187followed by the name of the function.
3188
3189@cindex @samp{argument list} defined
3190The name of the function is followed by a list that contains the
3191arguments that will be passed to the function. This list is called
3192the @dfn{argument list}. In this example, the list has only one
3193element, the symbol, @code{number}. When the function is used, the
3194symbol will be bound to the value that is used as the argument to the
3195function.
3196
3197Instead of choosing the word @code{number} for the name of the argument,
3198I could have picked any other name. For example, I could have chosen
3199the word @code{multiplicand}. I picked the word `number' because it
3200tells what kind of value is intended for this slot; but I could just as
3201well have chosen the word `multiplicand' to indicate the role that the
3202value placed in this slot will play in the workings of the function. I
3203could have called it @code{foogle}, but that would have been a bad
3204choice because it would not tell humans what it means. The choice of
3205name is up to the programmer and should be chosen to make the meaning of
3206the function clear.
3207
3208Indeed, you can choose any name you wish for a symbol in an argument
3209list, even the name of a symbol used in some other function: the name
3210you use in an argument list is private to that particular definition.
3211In that definition, the name refers to a different entity than any use
3212of the same name outside the function definition. Suppose you have a
3213nick-name `Shorty' in your family; when your family members refer to
3214`Shorty', they mean you. But outside your family, in a movie, for
3215example, the name `Shorty' refers to someone else. Because a name in an
3216argument list is private to the function definition, you can change the
3217value of such a symbol inside the body of a function without changing
3218its value outside the function. The effect is similar to that produced
3219by a @code{let} expression. (@xref{let, , @code{let}}.)
3220
3221@ignore
3222Note also that we discuss the word `number' in two different ways: as a
3223symbol that appears in the code, and as the name of something that will
3224be replaced by a something else during the evaluation of the function.
3225In the first case, @code{number} is a symbol, not a number; it happens
3226that within the function, it is a variable who value is the number in
3227question, but our primary interest in it is as a symbol. On the other
3228hand, when we are talking about the function, our interest is that we
3229will substitute a number for the word @var{number}. To keep this
3230distinction clear, we use different typography for the two
3231circumstances. When we talk about this function, or about how it works,
3232we refer to this number by writing @var{number}. In the function
3233itself, we refer to it by writing @code{number}.
3234@end ignore
3235
3236The argument list is followed by the documentation string that
3237describes the function. This is what you see when you type
3238@w{@kbd{C-h f}} and the name of a function. Incidentally, when you
3239write a documentation string like this, you should make the first line
3240a complete sentence since some commands, such as @code{apropos}, print
3241only the first line of a multi-line documentation string. Also, you
3242should not indent the second line of a documentation string, if you
3243have one, because that looks odd when you use @kbd{C-h f}
3244(@code{describe-function}). The documentation string is optional, but
3245it is so useful, it should be included in almost every function you
3246write.
3247
3248@findex * @r{(multiplication)}
3249The third line of the example consists of the body of the function
3250definition. (Most functions' definitions, of course, are longer than
3251this.) In this function, the body is the list, @code{(* 7 number)}, which
3252says to multiply the value of @var{number} by 7. (In Emacs Lisp,
3253@code{*} is the function for multiplication, just as @code{+} is the
3254function for addition.)
3255
3256When you use the @code{multiply-by-seven} function, the argument
3257@code{number} evaluates to the actual number you want used. Here is an
3258example that shows how @code{multiply-by-seven} is used; but don't try
3259to evaluate this yet!
3260
3261@smallexample
3262(multiply-by-seven 3)
3263@end smallexample
3264
3265@noindent
3266The symbol @code{number}, specified in the function definition in the
3267next section, is given or ``bound to'' the value 3 in the actual use of
3268the function. Note that although @code{number} was inside parentheses
3269in the function definition, the argument passed to the
3270@code{multiply-by-seven} function is not in parentheses. The
3271parentheses are written in the function definition so the computer can
3272figure out where the argument list ends and the rest of the function
3273definition begins.
3274
3275If you evaluate this example, you are likely to get an error message.
3276(Go ahead, try it!) This is because we have written the function
3277definition, but not yet told the computer about the definition---we have
3278not yet installed (or `loaded') the function definition in Emacs.
3279Installing a function is the process that tells the Lisp interpreter the
3280definition of the function. Installation is described in the next
3281section.
3282
3283@node Install, Interactive, defun, Writing Defuns
3284@comment node-name, next, previous, up
3285@section Install a Function Definition
3286@cindex Install a Function Definition
3287@cindex Definition installation
3288@cindex Function definition installation
3289
3290If you are reading this inside of Info in Emacs, you can try out the
3291@code{multiply-by-seven} function by first evaluating the function
3292definition and then evaluating @code{(multiply-by-seven 3)}. A copy of
3293the function definition follows. Place the cursor after the last
3294parenthesis of the function definition and type @kbd{C-x C-e}. When you
3295do this, @code{multiply-by-seven} will appear in the echo area. (What
3296this means is that when a function definition is evaluated, the value it
3297returns is the name of the defined function.) At the same time, this
3298action installs the function definition.
3299
3300@smallexample
3301@group
3302(defun multiply-by-seven (number)
3303 "Multiply NUMBER by seven."
3304 (* 7 number))
3305@end group
3306@end smallexample
3307
3308@noindent
3309By evaluating this @code{defun}, you have just installed
3310@code{multiply-by-seven} in Emacs. The function is now just as much a
3311part of Emacs as @code{forward-word} or any other editing function you
3312use. (@code{multiply-by-seven} will stay installed until you quit
3313Emacs. To reload code automatically whenever you start Emacs, see
3314@ref{Permanent Installation, , Installing Code Permanently}.)
3315
3316@menu
3317* Effect of installation::
3318* Change a defun:: How to change a function definition.
3319@end menu
3320
3321@node Effect of installation, Change a defun, Install, Install
3322@ifnottex
3323@unnumberedsubsec The effect of installation
3324@end ifnottex
3325
3326You can see the effect of installing @code{multiply-by-seven} by
3327evaluating the following sample. Place the cursor after the following
3328expression and type @kbd{C-x C-e}. The number 21 will appear in the
3329echo area.
3330
3331@smallexample
3332(multiply-by-seven 3)
3333@end smallexample
3334
3335If you wish, you can read the documentation for the function by typing
3336@kbd{C-h f} (@code{describe-function}) and then the name of the
3337function, @code{multiply-by-seven}. When you do this, a
3338@file{*Help*} window will appear on your screen that says:
3339
3340@smallexample
3341@group
3342multiply-by-seven is a Lisp function.
3343(multiply-by-seven NUMBER)
3344
3345Multiply NUMBER by seven.
3346@end group
3347@end smallexample
3348
3349@noindent
3350(To return to a single window on your screen, type @kbd{C-x 1}.)
3351
3352@node Change a defun, , Effect of installation, Install
3353@comment node-name, next, previous, up
3354@subsection Change a Function Definition
3355@cindex Changing a function definition
3356@cindex Function definition, how to change
3357@cindex Definition, how to change
3358
3359If you want to change the code in @code{multiply-by-seven}, just rewrite
3360it. To install the new version in place of the old one, evaluate the
3361function definition again. This is how you modify code in Emacs. It is
3362very simple.
3363
3364As an example, you can change the @code{multiply-by-seven} function to
3365add the number to itself seven times instead of multiplying the number
3366by seven. It produces the same answer, but by a different path. At
3367the same time, we will add a comment to the code; a comment is text
3368that the Lisp interpreter ignores, but that a human reader may find
3369useful or enlightening. The comment is that this is the ``second
3370version''.
3371
3372@smallexample
3373@group
3374(defun multiply-by-seven (number) ; @r{Second version.}
3375 "Multiply NUMBER by seven."
3376 (+ number number number number number number number))
3377@end group
3378@end smallexample
3379
3380@cindex Comments in Lisp code
3381The comment follows a semicolon, @samp{;}. In Lisp, everything on a
3382line that follows a semicolon is a comment. The end of the line is the
3383end of the comment. To stretch a comment over two or more lines, begin
3384each line with a semicolon.
3385
3386@xref{Beginning a .emacs File, , Beginning a @file{.emacs}
3387File}, and @ref{Comments, , Comments, elisp, The GNU Emacs Lisp
3388Reference Manual}, for more about comments.
3389
3390You can install this version of the @code{multiply-by-seven} function by
3391evaluating it in the same way you evaluated the first function: place
3392the cursor after the last parenthesis and type @kbd{C-x C-e}.
3393
3394In summary, this is how you write code in Emacs Lisp: you write a
3395function; install it; test it; and then make fixes or enhancements and
3396install it again.
3397
3398@node Interactive, Interactive Options, Install, Writing Defuns
3399@comment node-name, next, previous, up
3400@section Make a Function Interactive
3401@cindex Interactive functions
3402@findex interactive
3403
3404You make a function interactive by placing a list that begins with
3405the special form @code{interactive} immediately after the
3406documentation. A user can invoke an interactive function by typing
3407@kbd{M-x} and then the name of the function; or by typing the keys to
3408which it is bound, for example, by typing @kbd{C-n} for
3409@code{next-line} or @kbd{C-x h} for @code{mark-whole-buffer}.
3410
3411Interestingly, when you call an interactive function interactively,
3412the value returned is not automatically displayed in the echo area.
3413This is because you often call an interactive function for its side
3414effects, such as moving forward by a word or line, and not for the
3415value returned. If the returned value were displayed in the echo area
3416each time you typed a key, it would be very distracting.
3417
3418@menu
3419* Interactive multiply-by-seven:: An overview.
3420* multiply-by-seven in detail:: The interactive version.
3421@end menu
3422
3423@node Interactive multiply-by-seven, multiply-by-seven in detail, Interactive, Interactive
3424@ifnottex
3425@unnumberedsubsec An Interactive @code{multiply-by-seven}, An Overview
3426@end ifnottex
3427
3428Both the use of the special form @code{interactive} and one way to
3429display a value in the echo area can be illustrated by creating an
3430interactive version of @code{multiply-by-seven}.
3431
3432@need 1250
3433Here is the code:
3434
3435@smallexample
3436@group
3437(defun multiply-by-seven (number) ; @r{Interactive version.}
3438 "Multiply NUMBER by seven."
3439 (interactive "p")
3440 (message "The result is %d" (* 7 number)))
3441@end group
3442@end smallexample
3443
3444@noindent
3445You can install this code by placing your cursor after it and typing
3446@kbd{C-x C-e}. The name of the function will appear in your echo area.
3447Then, you can use this code by typing @kbd{C-u} and a number and then
3448typing @kbd{M-x multiply-by-seven} and pressing @key{RET}. The phrase
3449@samp{The result is @dots{}} followed by the product will appear in the
3450echo area.
3451
3452Speaking more generally, you invoke a function like this in either of two
3453ways:
3454
3455@enumerate
3456@item
3457By typing a prefix argument that contains the number to be passed, and
3458then typing @kbd{M-x} and the name of the function, as with
3459@kbd{C-u 3 M-x forward-sentence}; or,
3460
3461@item
3462By typing whatever key or keychord the function is bound to, as with
3463@kbd{C-u 3 M-e}.
3464@end enumerate
3465
3466@noindent
3467Both the examples just mentioned work identically to move point forward
3468three sentences. (Since @code{multiply-by-seven} is not bound to a key,
3469it could not be used as an example of key binding.)
3470
3471(@xref{Keybindings, , Some Keybindings}, to learn how to bind a command
3472to a key.)
3473
3474A prefix argument is passed to an interactive function by typing the
3475@key{META} key followed by a number, for example, @kbd{M-3 M-e}, or by
3476typing @kbd{C-u} and then a number, for example, @kbd{C-u 3 M-e} (if you
3477type @kbd{C-u} without a number, it defaults to 4).
3478
3479@node multiply-by-seven in detail, , Interactive multiply-by-seven, Interactive
3480@comment node-name, next, previous, up
3481@subsection An Interactive @code{multiply-by-seven}
3482
3483Let's look at the use of the special form @code{interactive} and then at
3484the function @code{message} in the interactive version of
3485@code{multiply-by-seven}. You will recall that the function definition
3486looks like this:
3487
3488@smallexample
3489@group
3490(defun multiply-by-seven (number) ; @r{Interactive version.}
3491 "Multiply NUMBER by seven."
3492 (interactive "p")
3493 (message "The result is %d" (* 7 number)))
3494@end group
3495@end smallexample
3496
3497In this function, the expression, @code{(interactive "p")}, is a list of
3498two elements. The @code{"p"} tells Emacs to pass the prefix argument to
3499the function and use its value for the argument of the function.
3500
3501@need 1000
3502The argument will be a number. This means that the symbol
3503@code{number} will be bound to a number in the line:
3504
3505@smallexample
3506(message "The result is %d" (* 7 number))
3507@end smallexample
3508
3509@need 1250
3510@noindent
3511For example, if your prefix argument is 5, the Lisp interpreter will
3512evaluate the line as if it were:
3513
3514@smallexample
3515(message "The result is %d" (* 7 5))
3516@end smallexample
3517
3518@noindent
3519(If you are reading this in GNU Emacs, you can evaluate this expression
3520yourself.) First, the interpreter will evaluate the inner list, which
3521is @code{(* 7 5)}. This returns a value of 35. Next, it
3522will evaluate the outer list, passing the values of the second and
3523subsequent elements of the list to the function @code{message}.
3524
3525As we have seen, @code{message} is an Emacs Lisp function especially
3526designed for sending a one line message to a user. (@xref{message, ,
3527The @code{message} function}.) In summary, the @code{message}
3528function prints its first argument in the echo area as is, except for
3529occurrences of @samp{%d} or @samp{%s} (and various other %-sequences
3530which we have not mentioned). When it sees a control sequence, the
3531function looks to the second or subsequent arguments and prints the
3532value of the argument in the location in the string where the control
3533sequence is located.
3534
3535In the interactive @code{multiply-by-seven} function, the control string
3536is @samp{%d}, which requires a number, and the value returned by
3537evaluating @code{(* 7 5)} is the number 35. Consequently, the number 35
3538is printed in place of the @samp{%d} and the message is @samp{The result
3539is 35}.
3540
3541(Note that when you call the function @code{multiply-by-seven}, the
3542message is printed without quotes, but when you call @code{message}, the
3543text is printed in double quotes. This is because the value returned by
3544@code{message} is what appears in the echo area when you evaluate an
3545expression whose first element is @code{message}; but when embedded in a
3546function, @code{message} prints the text as a side effect without
3547quotes.)
3548
3549@node Interactive Options, Permanent Installation, Interactive, Writing Defuns
3550@comment node-name, next, previous, up
3551@section Different Options for @code{interactive}
3552@cindex Options for @code{interactive}
3553@cindex Interactive options
3554
3555In the example, @code{multiply-by-seven} used @code{"p"} as the
3556argument to @code{interactive}. This argument told Emacs to interpret
3557your typing either @kbd{C-u} followed by a number or @key{META}
3558followed by a number as a command to pass that number to the function
3559as its argument. Emacs has more than twenty characters predefined for
3560use with @code{interactive}. In almost every case, one of these
3561options will enable you to pass the right information interactively to
3562a function. (@xref{Interactive Codes, , Code Characters for
3563@code{interactive}, elisp, The GNU Emacs Lisp Reference Manual}.)
3564
3565@need 1250
3566Consider the function @code{zap-to-char}. Its interactive expression
3567is
3568
3569@smallexample
3570(interactive "p\ncZap to char: ")
3571@end smallexample
3572
3573The first part of the argument to @code{interactive} is @samp{p}, with
3574which you are already familiar. This argument tells Emacs to
3575interpret a `prefix', as a number to be passed to the function. You
3576can specify a prefix either by typing @kbd{C-u} followed by a number
3577or by typing @key{META} followed by a number. The prefix is the
3578number of specified characters. Thus, if your prefix is three and the
3579specified character is @samp{x}, then you will delete all the text up
3580to and including the third next @samp{x}. If you do not set a prefix,
3581then you delete all the text up to and including the specified
3582character, but no more.
3583
3584The @samp{c} tells the function the name of the character to which to delete.
3585
3586More formally, a function with two or more arguments can have
3587information passed to each argument by adding parts to the string that
3588follows @code{interactive}. When you do this, the information is
3589passed to each argument in the same order it is specified in the
3590@code{interactive} list. In the string, each part is separated from
3591the next part by a @samp{\n}, which is a newline. For example, you
3592can follow @samp{p} with a @samp{\n} and an @samp{cZap to char:@: }.
3593This causes Emacs to pass the value of the prefix argument (if there
3594is one) and the character.
3595
3596In this case, the function definition looks like the following, where
3597@code{arg} and @code{char} are the symbols to which @code{interactive}
3598binds the prefix argument and the specified character:
3599
3600@smallexample
3601@group
3602(defun @var{name-of-function} (arg char)
3603 "@var{documentation}@dots{}"
3604 (interactive "p\ncZap to char: ")
3605 @var{body-of-function}@dots{})
3606@end group
3607@end smallexample
3608
3609@noindent
3610(The space after the colon in the prompt makes it look better when you
3611are prompted. @xref{copy-to-buffer, , The Definition of
3612@code{copy-to-buffer}}, for an example.)
3613
3614When a function does not take arguments, @code{interactive} does not
3615require any. Such a function contains the simple expression
3616@code{(interactive)}. The @code{mark-whole-buffer} function is like
3617this.
3618
3619Alternatively, if the special letter-codes are not right for your
3620application, you can pass your own arguments to @code{interactive} as
3621a list.
3622
3623@xref{append-to-buffer, , The Definition of @code{append-to-buffer}},
3624for an example. @xref{Using Interactive, , Using @code{Interactive},
3625elisp, The GNU Emacs Lisp Reference Manual}, for a more complete
3626explanation about this technique.
3627
3628@node Permanent Installation, let, Interactive Options, Writing Defuns
3629@comment node-name, next, previous, up
3630@section Install Code Permanently
3631@cindex Install code permanently
3632@cindex Permanent code installation
3633@cindex Code installation
3634
3635When you install a function definition by evaluating it, it will stay
3636installed until you quit Emacs. The next time you start a new session
3637of Emacs, the function will not be installed unless you evaluate the
3638function definition again.
3639
3640At some point, you may want to have code installed automatically
3641whenever you start a new session of Emacs. There are several ways of
3642doing this:
3643
3644@itemize @bullet
3645@item
3646If you have code that is just for yourself, you can put the code for the
3647function definition in your @file{.emacs} initialization file. When you
3648start Emacs, your @file{.emacs} file is automatically evaluated and all
3649the function definitions within it are installed.
3650@xref{Emacs Initialization, , Your @file{.emacs} File}.
3651
3652@item
3653Alternatively, you can put the function definitions that you want
3654installed in one or more files of their own and use the @code{load}
3655function to cause Emacs to evaluate and thereby install each of the
3656functions in the files.
3657@xref{Loading Files, , Loading Files}.
3658
3659@item
3660Thirdly, if you have code that your whole site will use, it is usual
3661to put it in a file called @file{site-init.el} that is loaded when
3662Emacs is built. This makes the code available to everyone who uses
3663your machine. (See the @file{INSTALL} file that is part of the Emacs
3664distribution.)
3665@end itemize
3666
3667Finally, if you have code that everyone who uses Emacs may want, you
3668can post it on a computer network or send a copy to the Free Software
3669Foundation. (When you do this, please license the code and its
3670documentation under a license that permits other people to run, copy,
3671study, modify, and redistribute the code and which protects you from
3672having your work taken from you.) If you send a copy of your code to
3673the Free Software Foundation, and properly protect yourself and
3674others, it may be included in the next release of Emacs. In large
3675part, this is how Emacs has grown over the past years, by donations.
3676
3677@node let, if, Permanent Installation, Writing Defuns
3678@comment node-name, next, previous, up
3679@section @code{let}
3680@findex let
3681
3682The @code{let} expression is a special form in Lisp that you will need
3683to use in most function definitions.
3684
3685@code{let} is used to attach or bind a symbol to a value in such a way
3686that the Lisp interpreter will not confuse the variable with a
3687variable of the same name that is not part of the function.
3688
3689To understand why the @code{let} special form is necessary, consider
3690the situation in which you own a home that you generally refer to as
3691`the house', as in the sentence, ``The house needs painting.'' If you
3692are visiting a friend and your host refers to `the house', he is
3693likely to be referring to @emph{his} house, not yours, that is, to a
3694different house.
3695
3696If your friend is referring to his house and you think he is referring
3697to your house, you may be in for some confusion. The same thing could
3698happen in Lisp if a variable that is used inside of one function has
3699the same name as a variable that is used inside of another function,
3700and the two are not intended to refer to the same value. The
3701@code{let} special form prevents this kind of confusion.
3702
3703@menu
3704* Prevent confusion::
3705* Parts of let Expression::
3706* Sample let Expression::
3707* Uninitialized let Variables::
3708@end menu
3709
3710@node Prevent confusion, Parts of let Expression, let, let
3711@ifnottex
3712@unnumberedsubsec @code{let} Prevents Confusion
3713@end ifnottex
3714
3715@cindex @samp{local variable} defined
3716@cindex @samp{variable, local}, defined
3717The @code{let} special form prevents confusion. @code{let} creates a
3718name for a @dfn{local variable} that overshadows any use of the same
3719name outside the @code{let} expression. This is like understanding
3720that whenever your host refers to `the house', he means his house, not
3721yours. (Symbols used in argument lists work the same way.
3722@xref{defun, , The @code{defun} Special Form}.)
3723
3724Local variables created by a @code{let} expression retain their value
3725@emph{only} within the @code{let} expression itself (and within
3726expressions called within the @code{let} expression); the local
3727variables have no effect outside the @code{let} expression.
3728
3729Another way to think about @code{let} is that it is like a @code{setq}
3730that is temporary and local. The values set by @code{let} are
3731automatically undone when the @code{let} is finished. The setting
3732only affects expressions that are inside the bounds of the @code{let}
3733expression. In computer science jargon, we would say ``the binding of
3734a symbol is visible only in functions called in the @code{let} form;
3735in Emacs Lisp, scoping is dynamic, not lexical.''
3736
3737@code{let} can create more than one variable at once. Also,
3738@code{let} gives each variable it creates an initial value, either a
3739value specified by you, or @code{nil}. (In the jargon, this is called
3740`binding the variable to the value'.) After @code{let} has created
3741and bound the variables, it executes the code in the body of the
3742@code{let}, and returns the value of the last expression in the body,
3743as the value of the whole @code{let} expression. (`Execute' is a jargon
3744term that means to evaluate a list; it comes from the use of the word
3745meaning `to give practical effect to' (@cite{Oxford English
3746Dictionary}). Since you evaluate an expression to perform an action,
3747`execute' has evolved as a synonym to `evaluate'.)
3748
3749@node Parts of let Expression, Sample let Expression, Prevent confusion, let
3750@comment node-name, next, previous, up
3751@subsection The Parts of a @code{let} Expression
3752@cindex @code{let} expression, parts of
3753@cindex Parts of @code{let} expression
3754
3755@cindex @samp{varlist} defined
3756A @code{let} expression is a list of three parts. The first part is
3757the symbol @code{let}. The second part is a list, called a
3758@dfn{varlist}, each element of which is either a symbol by itself or a
3759two-element list, the first element of which is a symbol. The third
3760part of the @code{let} expression is the body of the @code{let}. The
3761body usually consists of one or more lists.
3762
3763@need 800
3764A template for a @code{let} expression looks like this:
3765
3766@smallexample
3767(let @var{varlist} @var{body}@dots{})
3768@end smallexample
3769
3770@noindent
3771The symbols in the varlist are the variables that are given initial
3772values by the @code{let} special form. Symbols by themselves are given
3773the initial value of @code{nil}; and each symbol that is the first
3774element of a two-element list is bound to the value that is returned
3775when the Lisp interpreter evaluates the second element.
3776
3777Thus, a varlist might look like this: @code{(thread (needles 3))}. In
3778this case, in a @code{let} expression, Emacs binds the symbol
3779@code{thread} to an initial value of @code{nil}, and binds the symbol
3780@code{needles} to an initial value of 3.
3781
3782When you write a @code{let} expression, what you do is put the
3783appropriate expressions in the slots of the @code{let} expression
3784template.
3785
3786If the varlist is composed of two-element lists, as is often the case,
3787the template for the @code{let} expression looks like this:
3788
3789@smallexample
3790@group
3791(let ((@var{variable} @var{value})
3792 (@var{variable} @var{value})
3793 @dots{})
3794 @var{body}@dots{})
3795@end group
3796@end smallexample
3797
3798@node Sample let Expression, Uninitialized let Variables, Parts of let Expression, let
3799@comment node-name, next, previous, up
3800@subsection Sample @code{let} Expression
3801@cindex Sample @code{let} expression
3802@cindex @code{let} expression sample
3803
3804The following expression creates and gives initial values
3805to the two variables @code{zebra} and @code{tiger}. The body of the
3806@code{let} expression is a list which calls the @code{message} function.
3807
3808@smallexample
3809@group
3810(let ((zebra 'stripes)
3811 (tiger 'fierce))
3812 (message "One kind of animal has %s and another is %s."
3813 zebra tiger))
3814@end group
3815@end smallexample
3816
3817Here, the varlist is @code{((zebra 'stripes) (tiger 'fierce))}.
3818
3819The two variables are @code{zebra} and @code{tiger}. Each variable is
3820the first element of a two-element list and each value is the second
3821element of its two-element list. In the varlist, Emacs binds the
3822variable @code{zebra} to the value @code{stripes}@footnote{According
3823to Jared Diamond in @cite{Guns, Germs, and Steel}, ``@dots{} zebras
3824become impossibly dangerous as they grow older'' but the claim here is
3825that they do not become fierce like a tiger. (1997, W. W. Norton and
3826Co., ISBN 0-393-03894-2, page 171)}, and binds the
3827variable @code{tiger} to the value @code{fierce}. In this example,
3828both values are symbols preceded by a quote. The values could just as
3829well have been another list or a string. The body of the @code{let}
3830follows after the list holding the variables. In this example, the
3831body is a list that uses the @code{message} function to print a string
3832in the echo area.
3833
3834@need 1500
3835You may evaluate the example in the usual fashion, by placing the
3836cursor after the last parenthesis and typing @kbd{C-x C-e}. When you do
3837this, the following will appear in the echo area:
3838
3839@smallexample
3840"One kind of animal has stripes and another is fierce."
3841@end smallexample
3842
3843As we have seen before, the @code{message} function prints its first
3844argument, except for @samp{%s}. In this example, the value of the variable
3845@code{zebra} is printed at the location of the first @samp{%s} and the
3846value of the variable @code{tiger} is printed at the location of the
3847second @samp{%s}.
3848
3849@node Uninitialized let Variables, , Sample let Expression, let
3850@comment node-name, next, previous, up
3851@subsection Uninitialized Variables in a @code{let} Statement
3852@cindex Uninitialized @code{let} variables
3853@cindex @code{let} variables uninitialized
3854
3855If you do not bind the variables in a @code{let} statement to specific
3856initial values, they will automatically be bound to an initial value of
3857@code{nil}, as in the following expression:
3858
3859@smallexample
3860@group
3861(let ((birch 3)
3862 pine
3863 fir
3864 (oak 'some))
3865 (message
3866 "Here are %d variables with %s, %s, and %s value."
3867 birch pine fir oak))
3868@end group
3869@end smallexample
3870
3871@noindent
3872Here, the varlist is @code{((birch 3) pine fir (oak 'some))}.
3873
3874@need 1250
3875If you evaluate this expression in the usual way, the following will
3876appear in your echo area:
3877
3878@smallexample
3879"Here are 3 variables with nil, nil, and some value."
3880@end smallexample
3881
3882@noindent
3883In this example, Emacs binds the symbol @code{birch} to the number 3,
3884binds the symbols @code{pine} and @code{fir} to @code{nil}, and binds
3885the symbol @code{oak} to the value @code{some}.
3886
3887Note that in the first part of the @code{let}, the variables @code{pine}
3888and @code{fir} stand alone as atoms that are not surrounded by
3889parentheses; this is because they are being bound to @code{nil}, the
3890empty list. But @code{oak} is bound to @code{some} and so is a part of
3891the list @code{(oak 'some)}. Similarly, @code{birch} is bound to the
3892number 3 and so is in a list with that number. (Since a number
3893evaluates to itself, the number does not need to be quoted. Also, the
3894number is printed in the message using a @samp{%d} rather than a
3895@samp{%s}.) The four variables as a group are put into a list to
3896delimit them from the body of the @code{let}.
3897
3898@node if, else, let, Writing Defuns
3899@comment node-name, next, previous, up
3900@section The @code{if} Special Form
3901@findex if
3902@cindex Conditional with @code{if}
3903
3904A third special form, in addition to @code{defun} and @code{let}, is the
3905conditional @code{if}. This form is used to instruct the computer to
3906make decisions. You can write function definitions without using
3907@code{if}, but it is used often enough, and is important enough, to be
3908included here. It is used, for example, in the code for the
3909function @code{beginning-of-buffer}.
3910
3911The basic idea behind an @code{if}, is that ``@emph{if} a test is true,
3912@emph{then} an expression is evaluated.'' If the test is not true, the
3913expression is not evaluated. For example, you might make a decision
3914such as, ``if it is warm and sunny, then go to the beach!''
3915
3916@menu
3917* if in more detail::
3918* type-of-animal in detail:: An example of an @code{if} expression.
3919@end menu
3920
3921@node if in more detail, type-of-animal in detail, if, if
3922@ifnottex
3923@unnumberedsubsec @code{if} in more detail
3924@end ifnottex
3925
3926@cindex @samp{if-part} defined
3927@cindex @samp{then-part} defined
3928An @code{if} expression written in Lisp does not use the word `then';
3929the test and the action are the second and third elements of the list
3930whose first element is @code{if}. Nonetheless, the test part of an
3931@code{if} expression is often called the @dfn{if-part} and the second
3932argument is often called the @dfn{then-part}.
3933
3934Also, when an @code{if} expression is written, the true-or-false-test
3935is usually written on the same line as the symbol @code{if}, but the
3936action to carry out if the test is true, the ``then-part'', is written
3937on the second and subsequent lines. This makes the @code{if}
3938expression easier to read.
3939
3940@smallexample
3941@group
3942(if @var{true-or-false-test}
3943 @var{action-to-carry-out-if-test-is-true})
3944@end group
3945@end smallexample
3946
3947@noindent
3948The true-or-false-test will be an expression that
3949is evaluated by the Lisp interpreter.
3950
3951Here is an example that you can evaluate in the usual manner. The test
3952is whether the number 5 is greater than the number 4. Since it is, the
3953message @samp{5 is greater than 4!} will be printed.
3954
3955@smallexample
3956@group
3957(if (> 5 4) ; @r{if-part}
3958 (message "5 is greater than 4!")) ; @r{then-part}
3959@end group
3960@end smallexample
3961
3962@noindent
3963(The function @code{>} tests whether its first argument is greater than
3964its second argument and returns true if it is.)
3965@findex > (greater than)
3966
3967Of course, in actual use, the test in an @code{if} expression will not
3968be fixed for all time as it is by the expression @code{(> 5 4)}.
3969Instead, at least one of the variables used in the test will be bound to
3970a value that is not known ahead of time. (If the value were known ahead
3971of time, we would not need to run the test!)
3972
3973For example, the value may be bound to an argument of a function
3974definition. In the following function definition, the character of the
3975animal is a value that is passed to the function. If the value bound to
3976@code{characteristic} is @code{fierce}, then the message, @samp{It's a
3977tiger!} will be printed; otherwise, @code{nil} will be returned.
3978
3979@smallexample
3980@group
3981(defun type-of-animal (characteristic)
3982 "Print message in echo area depending on CHARACTERISTIC.
3983If the CHARACTERISTIC is the symbol `fierce',
3984then warn of a tiger."
3985 (if (equal characteristic 'fierce)
3986 (message "It's a tiger!")))
3987@end group
3988@end smallexample
3989
3990@need 1500
3991@noindent
3992If you are reading this inside of GNU Emacs, you can evaluate the
3993function definition in the usual way to install it in Emacs, and then you
3994can evaluate the following two expressions to see the results:
3995
3996@smallexample
3997@group
3998(type-of-animal 'fierce)
3999
4000(type-of-animal 'zebra)
4001
4002@end group
4003@end smallexample
4004
4005@c Following sentences rewritten to prevent overfull hbox.
4006@noindent
4007When you evaluate @code{(type-of-animal 'fierce)}, you will see the
4008following message printed in the echo area: @code{"It's a tiger!"}; and
4009when you evaluate @code{(type-of-animal 'zebra)} you will see @code{nil}
4010printed in the echo area.
4011
4012@node type-of-animal in detail, , if in more detail, if
4013@comment node-name, next, previous, up
4014@subsection The @code{type-of-animal} Function in Detail
4015
4016Let's look at the @code{type-of-animal} function in detail.
4017
4018The function definition for @code{type-of-animal} was written by filling
4019the slots of two templates, one for a function definition as a whole, and
4020a second for an @code{if} expression.
4021
4022@need 1250
4023The template for every function that is not interactive is:
4024
4025@smallexample
4026@group
4027(defun @var{name-of-function} (@var{argument-list})
4028 "@var{documentation}@dots{}"
4029 @var{body}@dots{})
4030@end group
4031@end smallexample
4032
4033@need 800
4034The parts of the function that match this template look like this:
4035
4036@smallexample
4037@group
4038(defun type-of-animal (characteristic)
4039 "Print message in echo area depending on CHARACTERISTIC.
4040If the CHARACTERISTIC is the symbol `fierce',
4041then warn of a tiger."
4042 @var{body: the} @code{if} @var{expression})
4043@end group
4044@end smallexample
4045
4046The name of function is @code{type-of-animal}; it is passed the value
4047of one argument. The argument list is followed by a multi-line
4048documentation string. The documentation string is included in the
4049example because it is a good habit to write documentation string for
4050every function definition. The body of the function definition
4051consists of the @code{if} expression.
4052
4053@need 800
4054The template for an @code{if} expression looks like this:
4055
4056@smallexample
4057@group
4058(if @var{true-or-false-test}
4059 @var{action-to-carry-out-if-the-test-returns-true})
4060@end group
4061@end smallexample
4062
4063@need 1250
4064In the @code{type-of-animal} function, the code for the @code{if}
4065looks like this:
4066
4067@smallexample
4068@group
4069(if (equal characteristic 'fierce)
4070 (message "It's a tiger!")))
4071@end group
4072@end smallexample
4073
4074@need 800
4075Here, the true-or-false-test is the expression:
4076
4077@smallexample
4078(equal characteristic 'fierce)
4079@end smallexample
4080
4081@noindent
4082In Lisp, @code{equal} is a function that determines whether its first
4083argument is equal to its second argument. The second argument is the
4084quoted symbol @code{'fierce} and the first argument is the value of the
4085symbol @code{characteristic}---in other words, the argument passed to
4086this function.
4087
4088In the first exercise of @code{type-of-animal}, the argument
4089@code{fierce} is passed to @code{type-of-animal}. Since @code{fierce}
4090is equal to @code{fierce}, the expression, @code{(equal characteristic
4091'fierce)}, returns a value of true. When this happens, the @code{if}
4092evaluates the second argument or then-part of the @code{if}:
4093@code{(message "It's tiger!")}.
4094
4095On the other hand, in the second exercise of @code{type-of-animal}, the
4096argument @code{zebra} is passed to @code{type-of-animal}. @code{zebra}
4097is not equal to @code{fierce}, so the then-part is not evaluated and
4098@code{nil} is returned by the @code{if} expression.
4099
4100@node else, Truth & Falsehood, if, Writing Defuns
4101@comment node-name, next, previous, up
4102@section If--then--else Expressions
4103@cindex Else
4104
4105An @code{if} expression may have an optional third argument, called
4106the @dfn{else-part}, for the case when the true-or-false-test returns
4107false. When this happens, the second argument or then-part of the
4108overall @code{if} expression is @emph{not} evaluated, but the third or
4109else-part @emph{is} evaluated. You might think of this as the cloudy
4110day alternative for the decision ``if it is warm and sunny, then go to
4111the beach, else read a book!''.
4112
4113The word ``else'' is not written in the Lisp code; the else-part of an
4114@code{if} expression comes after the then-part. In the written Lisp, the
4115else-part is usually written to start on a line of its own and is
4116indented less than the then-part:
4117
4118@smallexample
4119@group
4120(if @var{true-or-false-test}
4121 @var{action-to-carry-out-if-the-test-returns-true}
4122 @var{action-to-carry-out-if-the-test-returns-false})
4123@end group
4124@end smallexample
4125
4126For example, the following @code{if} expression prints the message @samp{4
4127is not greater than 5!} when you evaluate it in the usual way:
4128
4129@smallexample
4130@group
4131(if (> 4 5) ; @r{if-part}
4132 (message "4 falsely greater than 5!") ; @r{then-part}
4133 (message "4 is not greater than 5!")) ; @r{else-part}
4134@end group
4135@end smallexample
4136
4137@noindent
4138Note that the different levels of indentation make it easy to
4139distinguish the then-part from the else-part. (GNU Emacs has several
4140commands that automatically indent @code{if} expressions correctly.
4141@xref{Typing Lists, , GNU Emacs Helps You Type Lists}.)
4142
4143We can extend the @code{type-of-animal} function to include an
4144else-part by simply incorporating an additional part to the @code{if}
4145expression.
4146
4147@need 1500
4148You can see the consequences of doing this if you evaluate the following
4149version of the @code{type-of-animal} function definition to install it
4150and then evaluate the two subsequent expressions to pass different
4151arguments to the function.
4152
4153@smallexample
4154@group
4155(defun type-of-animal (characteristic) ; @r{Second version.}
4156 "Print message in echo area depending on CHARACTERISTIC.
4157If the CHARACTERISTIC is the symbol `fierce',
4158then warn of a tiger;
4159else say it's not fierce."
4160 (if (equal characteristic 'fierce)
4161 (message "It's a tiger!")
4162 (message "It's not fierce!")))
4163@end group
4164@end smallexample
4165@sp 1
4166
4167@smallexample
4168@group
4169(type-of-animal 'fierce)
4170
4171(type-of-animal 'zebra)
4172
4173@end group
4174@end smallexample
4175
4176@c Following sentence rewritten to prevent overfull hbox.
4177@noindent
4178When you evaluate @code{(type-of-animal 'fierce)}, you will see the
4179following message printed in the echo area: @code{"It's a tiger!"}; but
4180when you evaluate @code{(type-of-animal 'zebra)}, you will see
4181@code{"It's not fierce!"}.
4182
4183(Of course, if the @var{characteristic} were @code{ferocious}, the
4184message @code{"It's not fierce!"} would be printed; and it would be
4185misleading! When you write code, you need to take into account the
4186possibility that some such argument will be tested by the @code{if}
4187and write your program accordingly.)
4188
4189@node Truth & Falsehood, save-excursion, else, Writing Defuns
4190@comment node-name, next, previous, up
4191@section Truth and Falsehood in Emacs Lisp
4192@cindex Truth and falsehood in Emacs Lisp
4193@cindex Falsehood and truth in Emacs Lisp
4194@findex nil
4195
4196There is an important aspect to the truth test in an @code{if}
4197expression. So far, we have spoken of `true' and `false' as values of
4198predicates as if they were new kinds of Emacs Lisp objects. In fact,
4199`false' is just our old friend @code{nil}. Anything else---anything
4200at all---is `true'.
4201
4202The expression that tests for truth is interpreted as @dfn{true}
4203if the result of evaluating it is a value that is not @code{nil}. In
4204other words, the result of the test is considered true if the value
4205returned is a number such as 47, a string such as @code{"hello"}, or a
4206symbol (other than @code{nil}) such as @code{flowers}, or a list (so
4207long as it is not empty), or even a buffer!
4208
4209@menu
4210* nil explained:: @code{nil} has two meanings.
4211@end menu
4212
4213@node nil explained, , Truth & Falsehood, Truth & Falsehood
4214@ifnottex
4215@unnumberedsubsec An explanation of @code{nil}
4216@end ifnottex
4217
4218Before illustrating a test for truth, we need an explanation of @code{nil}.
4219
4220In Emacs Lisp, the symbol @code{nil} has two meanings. First, it means the
4221empty list. Second, it means false and is the value returned when a
4222true-or-false-test tests false. @code{nil} can be written as an empty
4223list, @code{()}, or as @code{nil}. As far as the Lisp interpreter is
4224concerned, @code{()} and @code{nil} are the same. Humans, however, tend
4225to use @code{nil} for false and @code{()} for the empty list.
4226
4227In Emacs Lisp, any value that is not @code{nil}---is not the empty
4228list---is considered true. This means that if an evaluation returns
4229something that is not an empty list, an @code{if} expression will test
4230true. For example, if a number is put in the slot for the test, it
4231will be evaluated and will return itself, since that is what numbers
4232do when evaluated. In this conditional, the @code{if} expression will
4233test true. The expression tests false only when @code{nil}, an empty
4234list, is returned by evaluating the expression.
4235
4236You can see this by evaluating the two expressions in the following examples.
4237
4238In the first example, the number 4 is evaluated as the test in the
4239@code{if} expression and returns itself; consequently, the then-part
4240of the expression is evaluated and returned: @samp{true} appears in
4241the echo area. In the second example, the @code{nil} indicates false;
4242consequently, the else-part of the expression is evaluated and
4243returned: @samp{false} appears in the echo area.
4244
4245@smallexample
4246@group
4247(if 4
4248 'true
4249 'false)
4250@end group
4251
4252@group
4253(if nil
4254 'true
4255 'false)
4256@end group
4257@end smallexample
4258
4259@need 1250
4260Incidentally, if some other useful value is not available for a test that
4261returns true, then the Lisp interpreter will return the symbol @code{t}
4262for true. For example, the expression @code{(> 5 4)} returns @code{t}
4263when evaluated, as you can see by evaluating it in the usual way:
4264
4265@smallexample
4266(> 5 4)
4267@end smallexample
4268
4269@need 1250
4270@noindent
4271On the other hand, this function returns @code{nil} if the test is false.
4272
4273@smallexample
4274(> 4 5)
4275@end smallexample
4276
4277@node save-excursion, Review, Truth & Falsehood, Writing Defuns
4278@comment node-name, next, previous, up
4279@section @code{save-excursion}
4280@findex save-excursion
4281@cindex Region, what it is
4282@cindex Preserving point, mark, and buffer
4283@cindex Point, mark, buffer preservation
4284@findex point
4285@findex mark
4286
4287The @code{save-excursion} function is the fourth and final special form
4288that we will discuss in this chapter.
4289
4290In Emacs Lisp programs used for editing, the @code{save-excursion}
4291function is very common. It saves the location of point and mark,
4292executes the body of the function, and then restores point and mark to
4293their previous positions if their locations were changed. Its primary
4294purpose is to keep the user from being surprised and disturbed by
4295unexpected movement of point or mark.
4296
4297@menu
4298* Point and mark:: A review of various locations.
4299* Template for save-excursion::
4300@end menu
4301
4302@node Point and mark, Template for save-excursion, save-excursion, save-excursion
4303@ifnottex
4304@unnumberedsubsec Point and Mark
4305@end ifnottex
4306
4307Before discussing @code{save-excursion}, however, it may be useful
4308first to review what point and mark are in GNU Emacs. @dfn{Point} is
4309the current location of the cursor. Wherever the cursor
4310is, that is point. More precisely, on terminals where the cursor
4311appears to be on top of a character, point is immediately before the
4312character. In Emacs Lisp, point is an integer. The first character in
4313a buffer is number one, the second is number two, and so on. The
4314function @code{point} returns the current position of the cursor as a
4315number. Each buffer has its own value for point.
4316
4317The @dfn{mark} is another position in the buffer; its value can be set
4318with a command such as @kbd{C-@key{SPC}} (@code{set-mark-command}). If
4319a mark has been set, you can use the command @kbd{C-x C-x}
4320(@code{exchange-point-and-mark}) to cause the cursor to jump to the mark
4321and set the mark to be the previous position of point. In addition, if
4322you set another mark, the position of the previous mark is saved in the
4323mark ring. Many mark positions can be saved this way. You can jump the
4324cursor to a saved mark by typing @kbd{C-u C-@key{SPC}} one or more
4325times.
4326
4327The part of the buffer between point and mark is called @dfn{the
4328region}. Numerous commands work on the region, including
4329@code{center-region}, @code{count-lines-region}, @code{kill-region}, and
4330@code{print-region}.
4331
4332The @code{save-excursion} special form saves the locations of point and
4333mark and restores those positions after the code within the body of the
4334special form is evaluated by the Lisp interpreter. Thus, if point were
4335in the beginning of a piece of text and some code moved point to the end
4336of the buffer, the @code{save-excursion} would put point back to where
4337it was before, after the expressions in the body of the function were
4338evaluated.
4339
4340In Emacs, a function frequently moves point as part of its internal
4341workings even though a user would not expect this. For example,
4342@code{count-lines-region} moves point. To prevent the user from being
4343bothered by jumps that are both unexpected and (from the user's point of
4344view) unnecessary, @code{save-excursion} is often used to keep point and
4345mark in the location expected by the user. The use of
4346@code{save-excursion} is good housekeeping.
4347
4348To make sure the house stays clean, @code{save-excursion} restores the
4349values of point and mark even if something goes wrong in the code inside
4350of it (or, to be more precise and to use the proper jargon, ``in case of
4351abnormal exit''). This feature is very helpful.
4352
4353In addition to recording the values of point and mark,
4354@code{save-excursion} keeps track of the current buffer, and restores
4355it, too. This means you can write code that will change the buffer and
4356have @code{save-excursion} switch you back to the original buffer.
4357This is how @code{save-excursion} is used in @code{append-to-buffer}.
4358(@xref{append-to-buffer, , The Definition of @code{append-to-buffer}}.)
4359
4360@node Template for save-excursion, , Point and mark, save-excursion
4361@comment node-name, next, previous, up
4362@subsection Template for a @code{save-excursion} Expression
4363
4364@need 800
4365The template for code using @code{save-excursion} is simple:
4366
4367@smallexample
4368@group
4369(save-excursion
4370 @var{body}@dots{})
4371@end group
4372@end smallexample
4373
4374@noindent
4375The body of the function is one or more expressions that will be
4376evaluated in sequence by the Lisp interpreter. If there is more than
4377one expression in the body, the value of the last one will be returned
4378as the value of the @code{save-excursion} function. The other
4379expressions in the body are evaluated only for their side effects; and
4380@code{save-excursion} itself is used only for its side effect (which
4381is restoring the positions of point and mark).
4382
4383@need 1250
4384In more detail, the template for a @code{save-excursion} expression
4385looks like this:
4386
4387@smallexample
4388@group
4389(save-excursion
4390 @var{first-expression-in-body}
4391 @var{second-expression-in-body}
4392 @var{third-expression-in-body}
4393 @dots{}
4394 @var{last-expression-in-body})
4395@end group
4396@end smallexample
4397
4398@noindent
4399An expression, of course, may be a symbol on its own or a list.
4400
4401In Emacs Lisp code, a @code{save-excursion} expression often occurs
4402within the body of a @code{let} expression. It looks like this:
4403
4404@smallexample
4405@group
4406(let @var{varlist}
4407 (save-excursion
4408 @var{body}@dots{}))
4409@end group
4410@end smallexample
4411
4412@node Review, defun Exercises, save-excursion, Writing Defuns
4413@comment node-name, next, previous, up
4414@section Review
4415
4416In the last few chapters we have introduced a fair number of functions
4417and special forms. Here they are described in brief, along with a few
4418similar functions that have not been mentioned yet.
4419
4420@table @code
4421@item eval-last-sexp
4422Evaluate the last symbolic expression before the current location of
4423point. The value is printed in the echo area unless the function is
4424invoked with an argument; in that case, the output is printed in the
4425current buffer. This command is normally bound to @kbd{C-x C-e}.
4426
4427@item defun
4428Define function. This special form has up to five parts: the name,
4429a template for the arguments that will be passed to the function,
4430documentation, an optional interactive declaration, and the body of the
4431definition.
4432
4433@need 1250
4434For example, in an early version of Emacs, the function definition was
4435as follows. (It is slightly more complex now that it seeks the first
4436non-whitespace character rather than the first visible character.)
4437
4438@smallexample
4439@group
4440(defun back-to-indentation ()
4441 "Move point to first visible character on line."
4442 (interactive)
4443 (beginning-of-line 1)
4444 (skip-chars-forward " \t"))
4445@end group
4446@end smallexample
4447
4448@ignore
4449In GNU Emacs 22,
4450
4451(defun backward-to-indentation (&optional arg)
4452 "Move backward ARG lines and position at first nonblank character."
4453 (interactive "p")
4454 (forward-line (- (or arg 1)))
4455 (skip-chars-forward " \t"))
4456
4457(defun back-to-indentation ()
4458 "Move point to the first non-whitespace character on this line."
4459 (interactive)
4460 (beginning-of-line 1)
4461 (skip-syntax-forward " " (line-end-position))
4462 ;; Move back over chars that have whitespace syntax but have the p flag.
4463 (backward-prefix-chars))
4464@end ignore
4465
4466@item interactive
4467Declare to the interpreter that the function can be used
4468interactively. This special form may be followed by a string with one
4469or more parts that pass the information to the arguments of the
4470function, in sequence. These parts may also tell the interpreter to
4471prompt for information. Parts of the string are separated by
4472newlines, @samp{\n}.
4473
4474@need 1000
4475Common code characters are:
4476
4477@table @code
4478@item b
4479The name of an existing buffer.
4480
4481@item f
4482The name of an existing file.
4483
4484@item p
4485The numeric prefix argument. (Note that this `p' is lower case.)
4486
4487@item r
4488Point and the mark, as two numeric arguments, smallest first. This
4489is the only code letter that specifies two successive arguments
4490rather than one.
4491@end table
4492
4493@xref{Interactive Codes, , Code Characters for @samp{interactive},
4494elisp, The GNU Emacs Lisp Reference Manual}, for a complete list of
4495code characters.
4496
4497@item let
4498Declare that a list of variables is for use within the body of the
4499@code{let} and give them an initial value, either @code{nil} or a
4500specified value; then evaluate the rest of the expressions in the body
4501of the @code{let} and return the value of the last one. Inside the
4502body of the @code{let}, the Lisp interpreter does not see the values of
4503the variables of the same names that are bound outside of the
4504@code{let}.
4505
4506@need 1250
4507For example,
4508
4509@smallexample
4510@group
4511(let ((foo (buffer-name))
4512 (bar (buffer-size)))
4513 (message
4514 "This buffer is %s and has %d characters."
4515 foo bar))
4516@end group
4517@end smallexample
4518
4519@item save-excursion
4520Record the values of point and mark and the current buffer before
4521evaluating the body of this special form. Restore the values of point
4522and mark and buffer afterward.
4523
4524@need 1250
4525For example,
4526
4527@smallexample
4528@group
4529(message "We are %d characters into this buffer."
4530 (- (point)
4531 (save-excursion
4532 (goto-char (point-min)) (point))))
4533@end group
4534@end smallexample
4535
4536@item if
4537Evaluate the first argument to the function; if it is true, evaluate
4538the second argument; else evaluate the third argument, if there is one.
4539
4540The @code{if} special form is called a @dfn{conditional}. There are
4541other conditionals in Emacs Lisp, but @code{if} is perhaps the most
4542commonly used.
4543
4544@need 1250
4545For example,
4546
4547@smallexample
4548@group
4549(if (= 22 emacs-major-version)
4550 (message "This is version 22 Emacs")
4551 (message "This is not version 22 Emacs"))
4552@end group
4553@end smallexample
4554
4555@need 1250
4556@item <
4557@itemx >
4558@itemx <=
4559@itemx >=
4560The @code{<} function tests whether its first argument is smaller than
4561its second argument. A corresponding function, @code{>}, tests whether
4562the first argument is greater than the second. Likewise, @code{<=}
4563tests whether the first argument is less than or equal to the second and
4564@code{>=} tests whether the first argument is greater than or equal to
4565the second. In all cases, both arguments must be numbers or markers
4566(markers indicate positions in buffers).
4567
4568@need 800
4569@item =
4570The @code{=} function tests whether two arguments, both numbers or
4571markers, are equal.
4572
4573@need 1250
4574@item equal
4575@itemx eq
4576Test whether two objects are the same. @code{equal} uses one meaning
4577of the word `same' and @code{eq} uses another: @code{equal} returns
4578true if the two objects have a similar structure and contents, such as
4579two copies of the same book. On the other hand, @code{eq}, returns
4580true if both arguments are actually the same object.
4581@findex equal
4582@findex eq
4583
4584@need 1250
4585@item string<
4586@itemx string-lessp
4587@itemx string=
4588@itemx string-equal
4589The @code{string-lessp} function tests whether its first argument is
4590smaller than the second argument. A shorter, alternative name for the
4591same function (a @code{defalias}) is @code{string<}.
4592
4593The arguments to @code{string-lessp} must be strings or symbols; the
4594ordering is lexicographic, so case is significant. The print names of
4595symbols are used instead of the symbols themselves.
4596
4597@cindex @samp{empty string} defined
4598An empty string, @samp{""}, a string with no characters in it, is
4599smaller than any string of characters.
4600
4601@code{string-equal} provides the corresponding test for equality. Its
4602shorter, alternative name is @code{string=}. There are no string test
4603functions that correspond to @var{>}, @code{>=}, or @code{<=}.
4604
4605@item message
4606Print a message in the echo area. The first argument is a string that
4607can contain @samp{%s}, @samp{%d}, or @samp{%c} to print the value of
4608arguments that follow the string. The argument used by @samp{%s} must
4609be a string or a symbol; the argument used by @samp{%d} must be a
4610number. The argument used by @samp{%c} must be an @sc{ascii} code
4611number; it will be printed as the character with that @sc{ascii} code.
4612(Various other %-sequences have not been mentioned.)
4613
4614@item setq
4615@itemx set
4616The @code{setq} function sets the value of its first argument to the
4617value of the second argument. The first argument is automatically
4618quoted by @code{setq}. It does the same for succeeding pairs of
4619arguments. Another function, @code{set}, takes only two arguments and
4620evaluates both of them before setting the value returned by its first
4621argument to the value returned by its second argument.
4622
4623@item buffer-name
4624Without an argument, return the name of the buffer, as a string.
4625
4626@itemx buffer-file-name
4627Without an argument, return the name of the file the buffer is
4628visiting.
4629
4630@item current-buffer
4631Return the buffer in which Emacs is active; it may not be
4632the buffer that is visible on the screen.
4633
4634@item other-buffer
4635Return the most recently selected buffer (other than the buffer passed
4636to @code{other-buffer} as an argument and other than the current
4637buffer).
4638
4639@item switch-to-buffer
4640Select a buffer for Emacs to be active in and display it in the current
4641window so users can look at it. Usually bound to @kbd{C-x b}.
4642
4643@item set-buffer
4644Switch Emacs' attention to a buffer on which programs will run. Don't
4645alter what the window is showing.
4646
4647@item buffer-size
4648Return the number of characters in the current buffer.
4649
4650@item point
4651Return the value of the current position of the cursor, as an
4652integer counting the number of characters from the beginning of the
4653buffer.
4654
4655@item point-min
4656Return the minimum permissible value of point in
4657the current buffer. This is 1, unless narrowing is in effect.
4658
4659@item point-max
4660Return the value of the maximum permissible value of point in the
4661current buffer. This is the end of the buffer, unless narrowing is in
4662effect.
4663@end table
4664
4665@need 1500
4666@node defun Exercises, , Review, Writing Defuns
4667@section Exercises
4668
4669@itemize @bullet
4670@item
4671Write a non-interactive function that doubles the value of its
4672argument, a number. Make that function interactive.
4673
4674@item
4675Write a function that tests whether the current value of
4676@code{fill-column} is greater than the argument passed to the function,
4677and if so, prints an appropriate message.
4678@end itemize
4679
4680@node Buffer Walk Through, More Complex, Writing Defuns, Top
4681@comment node-name, next, previous, up
4682@chapter A Few Buffer--Related Functions
4683
4684In this chapter we study in detail several of the functions used in GNU
4685Emacs. This is called a ``walk-through''. These functions are used as
4686examples of Lisp code, but are not imaginary examples; with the
4687exception of the first, simplified function definition, these functions
4688show the actual code used in GNU Emacs. You can learn a great deal from
4689these definitions. The functions described here are all related to
4690buffers. Later, we will study other functions.
4691
4692@menu
4693* Finding More:: How to find more information.
4694* simplified-beginning-of-buffer:: Shows @code{goto-char},
4695 @code{point-min}, and @code{push-mark}.
4696* mark-whole-buffer:: Almost the same as @code{beginning-of-buffer}.
4697* append-to-buffer:: Uses @code{save-excursion} and
4698 @code{insert-buffer-substring}.
4699* Buffer Related Review:: Review.
4700* Buffer Exercises::
4701@end menu
4702
4703@node Finding More, simplified-beginning-of-buffer, Buffer Walk Through, Buffer Walk Through
4704@section Finding More Information
4705
4706@findex describe-function, @r{introduced}
4707@cindex Find function documentation
4708In this walk-through, I will describe each new function as we come to
4709it, sometimes in detail and sometimes briefly. If you are interested,
4710you can get the full documentation of any Emacs Lisp function at any
4711time by typing @kbd{C-h f} and then the name of the function (and then
4712@key{RET}). Similarly, you can get the full documentation for a
4713variable by typing @kbd{C-h v} and then the name of the variable (and
4714then @key{RET}).
4715
4716@cindex Find source of function
4717@c In version 22, tells location both of C and of Emacs Lisp
4718Also, @code{describe-function} will tell you the location of the
4719function definition.
4720
4721Put point into the name of the file that contains the function and
4722press the @key{RET} key. In this case, @key{RET} means
4723@code{push-button} rather than `return' or `enter'. Emacs will take
4724you directly to the function definition.
4725
4726@ignore
4727Not In version 22
4728
4729If you move point over the file name and press
4730the @key{RET} key, which in this case means @code{help-follow} rather
4731than `return' or `enter', Emacs will take you directly to the function
4732definition.
4733@end ignore
4734
4735More generally, if you want to see a function in its original source
88c26f5c
GM
4736file, you can use the @code{find-tag} function to jump to it.
4737@code{find-tag} works with a wide variety of languages, not just
8cda6f8f 4738Lisp, and C, and it works with non-programming text as well. For
88c26f5c 4739example, @code{find-tag} will jump to the various nodes in the
8cda6f8f 4740Texinfo source file of this document.
88c26f5c 4741The @code{find-tag} function depends on `tags tables' that record
8cda6f8f 4742the locations of the functions, variables, and other items to which
88c26f5c 4743@code{find-tag} jumps.
8cda6f8f 4744
88c26f5c 4745To use the @code{find-tag} command, type @kbd{M-.} (i.e., press the
8cda6f8f
GM
4746period key while holding down the @key{META} key, or else type the
4747@key{ESC} key and then type the period key), and then, at the prompt,
4748type in the name of the function whose source code you want to see,
4749such as @code{mark-whole-buffer}, and then type @key{RET}. Emacs will
4750switch buffers and display the source code for the function on your
4751screen. To switch back to your current buffer, type @kbd{C-x b
09e80d9f 4752@key{RET}}. (On some keyboards, the @key{META} key is labeled
8cda6f8f
GM
4753@key{ALT}.)
4754
4755@c !!! 22.1.1 tags table location in this paragraph
4756@cindex TAGS table, specifying
88c26f5c 4757@findex find-tag
8cda6f8f
GM
4758Depending on how the initial default values of your copy of Emacs are
4759set, you may also need to specify the location of your `tags table',
4760which is a file called @file{TAGS}. For example, if you are
4761interested in Emacs sources, the tags table you will most likely want,
4762if it has already been created for you, will be in a subdirectory of
4763the @file{/usr/local/share/emacs/} directory; thus you would use the
4764@code{M-x visit-tags-table} command and specify a pathname such as
4765@file{/usr/local/share/emacs/22.1.1/lisp/TAGS}. If the tags table
4766has not already been created, you will have to create it yourself. It
0ca10bb7 4767will be in a file such as @file{/usr/local/src/emacs/src/TAGS}.
8cda6f8f
GM
4768
4769@need 1250
4770To create a @file{TAGS} file in a specific directory, switch to that
4771directory in Emacs using @kbd{M-x cd} command, or list the directory
4772with @kbd{C-x d} (@code{dired}). Then run the compile command, with
4773@w{@code{etags *.el}} as the command to execute:
4774
4775@smallexample
4776M-x compile RET etags *.el RET
4777@end smallexample
4778
4779For more information, see @ref{etags, , Create Your Own @file{TAGS} File}.
4780
4781After you become more familiar with Emacs Lisp, you will find that you will
88c26f5c 4782frequently use @code{find-tag} to navigate your way around source code;
8cda6f8f
GM
4783and you will create your own @file{TAGS} tables.
4784
4785@cindex Library, as term for `file'
4786Incidentally, the files that contain Lisp code are conventionally
4787called @dfn{libraries}. The metaphor is derived from that of a
4788specialized library, such as a law library or an engineering library,
4789rather than a general library. Each library, or file, contains
4790functions that relate to a particular topic or activity, such as
4791@file{abbrev.el} for handling abbreviations and other typing
4792shortcuts, and @file{help.el} for on-line help. (Sometimes several
4793libraries provide code for a single activity, as the various
4794@file{rmail@dots{}} files provide code for reading electronic mail.)
4795In @cite{The GNU Emacs Manual}, you will see sentences such as ``The
4796@kbd{C-h p} command lets you search the standard Emacs Lisp libraries
4797by topic keywords.''
4798
4799@node simplified-beginning-of-buffer, mark-whole-buffer, Finding More, Buffer Walk Through
4800@comment node-name, next, previous, up
4801@section A Simplified @code{beginning-of-buffer} Definition
4802@findex simplified-beginning-of-buffer
4803
4804The @code{beginning-of-buffer} command is a good function to start with
4805since you are likely to be familiar with it and it is easy to
4806understand. Used as an interactive command, @code{beginning-of-buffer}
4807moves the cursor to the beginning of the buffer, leaving the mark at the
4808previous position. It is generally bound to @kbd{M-<}.
4809
4810In this section, we will discuss a shortened version of the function
4811that shows how it is most frequently used. This shortened function
4812works as written, but it does not contain the code for a complex option.
4813In another section, we will describe the entire function.
4814(@xref{beginning-of-buffer, , Complete Definition of
4815@code{beginning-of-buffer}}.)
4816
4817Before looking at the code, let's consider what the function
4818definition has to contain: it must include an expression that makes
4819the function interactive so it can be called by typing @kbd{M-x
4820beginning-of-buffer} or by typing a keychord such as @kbd{M-<}; it
4821must include code to leave a mark at the original position in the
4822buffer; and it must include code to move the cursor to the beginning
4823of the buffer.
4824
4825@need 1250
4826Here is the complete text of the shortened version of the function:
4827
4828@smallexample
4829@group
4830(defun simplified-beginning-of-buffer ()
4831 "Move point to the beginning of the buffer;
4832leave mark at previous position."
4833 (interactive)
4834 (push-mark)
4835 (goto-char (point-min)))
4836@end group
4837@end smallexample
4838
4839Like all function definitions, this definition has five parts following
4840the special form @code{defun}:
4841
4842@enumerate
4843@item
4844The name: in this example, @code{simplified-beginning-of-buffer}.
4845
4846@item
4847A list of the arguments: in this example, an empty list, @code{()},
4848
4849@item
4850The documentation string.
4851
4852@item
4853The interactive expression.
4854
4855@item
4856The body.
4857@end enumerate
4858
4859@noindent
4860In this function definition, the argument list is empty; this means that
4861this function does not require any arguments. (When we look at the
4862definition for the complete function, we will see that it may be passed
4863an optional argument.)
4864
4865The interactive expression tells Emacs that the function is intended to
4866be used interactively. In this example, @code{interactive} does not have
4867an argument because @code{simplified-beginning-of-buffer} does not
4868require one.
4869
4870@need 800
4871The body of the function consists of the two lines:
4872
4873@smallexample
4874@group
4875(push-mark)
4876(goto-char (point-min))
4877@end group
4878@end smallexample
4879
4880The first of these lines is the expression, @code{(push-mark)}. When
4881this expression is evaluated by the Lisp interpreter, it sets a mark at
4882the current position of the cursor, wherever that may be. The position
4883of this mark is saved in the mark ring.
4884
4885The next line is @code{(goto-char (point-min))}. This expression
4886jumps the cursor to the minimum point in the buffer, that is, to the
4887beginning of the buffer (or to the beginning of the accessible portion
4888of the buffer if it is narrowed. @xref{Narrowing & Widening, ,
4889Narrowing and Widening}.)
4890
4891The @code{push-mark} command sets a mark at the place where the cursor
4892was located before it was moved to the beginning of the buffer by the
4893@code{(goto-char (point-min))} expression. Consequently, you can, if
4894you wish, go back to where you were originally by typing @kbd{C-x C-x}.
4895
4896That is all there is to the function definition!
4897
4898@findex describe-function
4899When you are reading code such as this and come upon an unfamiliar
4900function, such as @code{goto-char}, you can find out what it does by
4901using the @code{describe-function} command. To use this command, type
4902@kbd{C-h f} and then type in the name of the function and press
4903@key{RET}. The @code{describe-function} command will print the
4904function's documentation string in a @file{*Help*} window. For
4905example, the documentation for @code{goto-char} is:
4906
4907@smallexample
4908@group
4909Set point to POSITION, a number or marker.
4910Beginning of buffer is position (point-min), end is (point-max).
4911@end group
4912@end smallexample
4913
4914@noindent
4915The function's one argument is the desired position.
4916
4917@noindent
4918(The prompt for @code{describe-function} will offer you the symbol
4919under or preceding the cursor, so you can save typing by positioning
4920the cursor right over or after the function and then typing @kbd{C-h f
4921@key{RET}}.)
4922
4923The @code{end-of-buffer} function definition is written in the same way as
4924the @code{beginning-of-buffer} definition except that the body of the
4925function contains the expression @code{(goto-char (point-max))} in place
4926of @code{(goto-char (point-min))}.
4927
4928@node mark-whole-buffer, append-to-buffer, simplified-beginning-of-buffer, Buffer Walk Through
4929@comment node-name, next, previous, up
4930@section The Definition of @code{mark-whole-buffer}
4931@findex mark-whole-buffer
4932
4933The @code{mark-whole-buffer} function is no harder to understand than the
4934@code{simplified-beginning-of-buffer} function. In this case, however,
4935we will look at the complete function, not a shortened version.
4936
4937The @code{mark-whole-buffer} function is not as commonly used as the
4938@code{beginning-of-buffer} function, but is useful nonetheless: it
4939marks a whole buffer as a region by putting point at the beginning and
4940a mark at the end of the buffer. It is generally bound to @kbd{C-x
4941h}.
4942
4943@menu
4944* mark-whole-buffer overview::
4945* Body of mark-whole-buffer:: Only three lines of code.
4946@end menu
4947
4948@node mark-whole-buffer overview, Body of mark-whole-buffer, mark-whole-buffer, mark-whole-buffer
4949@ifnottex
4950@unnumberedsubsec An overview of @code{mark-whole-buffer}
4951@end ifnottex
4952
4953@need 1250
4954In GNU Emacs 22, the code for the complete function looks like this:
4955
4956@smallexample
4957@group
4958(defun mark-whole-buffer ()
4959 "Put point at beginning and mark at end of buffer.
4960You probably should not use this function in Lisp programs;
4961it is usually a mistake for a Lisp function to use any subroutine
4962that uses or sets the mark."
4963 (interactive)
4964 (push-mark (point))
4965 (push-mark (point-max) nil t)
4966 (goto-char (point-min)))
4967@end group
4968@end smallexample
4969
4970@need 1250
4971Like all other functions, the @code{mark-whole-buffer} function fits
4972into the template for a function definition. The template looks like
4973this:
4974
4975@smallexample
4976@group
4977(defun @var{name-of-function} (@var{argument-list})
4978 "@var{documentation}@dots{}"
4979 (@var{interactive-expression}@dots{})
4980 @var{body}@dots{})
4981@end group
4982@end smallexample
4983
4984Here is how the function works: the name of the function is
4985@code{mark-whole-buffer}; it is followed by an empty argument list,
4986@samp{()}, which means that the function does not require arguments.
4987The documentation comes next.
4988
4989The next line is an @code{(interactive)} expression that tells Emacs
4990that the function will be used interactively. These details are similar
4991to the @code{simplified-beginning-of-buffer} function described in the
4992previous section.
4993
4994@need 1250
4995@node Body of mark-whole-buffer, , mark-whole-buffer overview, mark-whole-buffer
4996@comment node-name, next, previous, up
4997@subsection Body of @code{mark-whole-buffer}
4998
4999The body of the @code{mark-whole-buffer} function consists of three
5000lines of code:
5001
5002@c GNU Emacs 22
5003@smallexample
5004@group
5005(push-mark (point))
5006(push-mark (point-max) nil t)
5007(goto-char (point-min))
5008@end group
5009@end smallexample
5010
5011The first of these lines is the expression, @code{(push-mark (point))}.
5012
5013This line does exactly the same job as the first line of the body of
5014the @code{simplified-beginning-of-buffer} function, which is written
5015@code{(push-mark)}. In both cases, the Lisp interpreter sets a mark
5016at the current position of the cursor.
5017
5018I don't know why the expression in @code{mark-whole-buffer} is written
5019@code{(push-mark (point))} and the expression in
5020@code{beginning-of-buffer} is written @code{(push-mark)}. Perhaps
5021whoever wrote the code did not know that the arguments for
5022@code{push-mark} are optional and that if @code{push-mark} is not
5023passed an argument, the function automatically sets mark at the
5024location of point by default. Or perhaps the expression was written
5025so as to parallel the structure of the next line. In any case, the
5026line causes Emacs to determine the position of point and set a mark
5027there.
5028
5029In earlier versions of GNU Emacs, the next line of
5030@code{mark-whole-buffer} was @code{(push-mark (point-max))}. This
5031expression sets a mark at the point in the buffer that has the highest
5032number. This will be the end of the buffer (or, if the buffer is
5033narrowed, the end of the accessible portion of the buffer.
5034@xref{Narrowing & Widening, , Narrowing and Widening}, for more about
5035narrowing.) After this mark has been set, the previous mark, the one
5036set at point, is no longer set, but Emacs remembers its position, just
5037as all other recent marks are always remembered. This means that you
5038can, if you wish, go back to that position by typing @kbd{C-u
5039C-@key{SPC}} twice.
5040
5041@need 1250
5042In GNU Emacs 22, the @code{(point-max)} is slightly more complicated.
5043The line reads
5044
5045@smallexample
5046(push-mark (point-max) nil t)
5047@end smallexample
5048
5049@noindent
5050The expression works nearly the same as before. It sets a mark at the
5051highest numbered place in the buffer that it can. However, in this
5052version, @code{push-mark} has two additional arguments. The second
5053argument to @code{push-mark} is @code{nil}. This tells the function
5054it @emph{should} display a message that says `Mark set' when it pushes
5055the mark. The third argument is @code{t}. This tells
5056@code{push-mark} to activate the mark when Transient Mark mode is
5057turned on. Transient Mark mode highlights the currently active
5058region. It is often turned off.
5059
5060Finally, the last line of the function is @code{(goto-char
5061(point-min)))}. This is written exactly the same way as it is written
5062in @code{beginning-of-buffer}. The expression moves the cursor to
5063the minimum point in the buffer, that is, to the beginning of the buffer
5064(or to the beginning of the accessible portion of the buffer). As a
5065result of this, point is placed at the beginning of the buffer and mark
5066is set at the end of the buffer. The whole buffer is, therefore, the
5067region.
5068
5069@node append-to-buffer, Buffer Related Review, mark-whole-buffer, Buffer Walk Through
5070@comment node-name, next, previous, up
5071@section The Definition of @code{append-to-buffer}
5072@findex append-to-buffer
5073
5074The @code{append-to-buffer} command is more complex than the
5075@code{mark-whole-buffer} command. What it does is copy the region
5076(that is, the part of the buffer between point and mark) from the
5077current buffer to a specified buffer.
5078
5079@menu
5080* append-to-buffer overview::
5081* append interactive:: A two part interactive expression.
5082* append-to-buffer body:: Incorporates a @code{let} expression.
5083* append save-excursion:: How the @code{save-excursion} works.
5084@end menu
5085
5086@node append-to-buffer overview, append interactive, append-to-buffer, append-to-buffer
5087@ifnottex
5088@unnumberedsubsec An Overview of @code{append-to-buffer}
5089@end ifnottex
5090
5091@findex insert-buffer-substring
5092The @code{append-to-buffer} command uses the
5093@code{insert-buffer-substring} function to copy the region.
5094@code{insert-buffer-substring} is described by its name: it takes a
5095string of characters from part of a buffer, a ``substring'', and
5096inserts them into another buffer.
5097
5098Most of @code{append-to-buffer} is
5099concerned with setting up the conditions for
5100@code{insert-buffer-substring} to work: the code must specify both the
5101buffer to which the text will go, the window it comes from and goes
5102to, and the region that will be copied.
5103
5104@need 1250
5105Here is the complete text of the function:
5106
5107@smallexample
5108@group
5109(defun append-to-buffer (buffer start end)
5110 "Append to specified buffer the text of the region.
5111It is inserted into that buffer before its point.
5112@end group
5113
5114@group
5115When calling from a program, give three arguments:
5116BUFFER (or buffer name), START and END.
5117START and END specify the portion of the current buffer to be copied."
5118 (interactive
5119 (list (read-buffer "Append to buffer: " (other-buffer
5120 (current-buffer) t))
5121 (region-beginning) (region-end)))
5122@end group
5123@group
5124 (let ((oldbuf (current-buffer)))
5125 (save-excursion
5126 (let* ((append-to (get-buffer-create buffer))
5127 (windows (get-buffer-window-list append-to t t))
5128 point)
5129 (set-buffer append-to)
5130 (setq point (point))
5131 (barf-if-buffer-read-only)
5132 (insert-buffer-substring oldbuf start end)
5133 (dolist (window windows)
5134 (when (= (window-point window) point)
5135 (set-window-point window (point))))))))
5136@end group
5137@end smallexample
5138
5139The function can be understood by looking at it as a series of
5140filled-in templates.
5141
5142The outermost template is for the function definition. In this
5143function, it looks like this (with several slots filled in):
5144
5145@smallexample
5146@group
5147(defun append-to-buffer (buffer start end)
5148 "@var{documentation}@dots{}"
5149 (interactive @dots{})
5150 @var{body}@dots{})
5151@end group
5152@end smallexample
5153
5154The first line of the function includes its name and three arguments.
5155The arguments are the @code{buffer} to which the text will be copied, and
5156the @code{start} and @code{end} of the region in the current buffer that
5157will be copied.
5158
5159The next part of the function is the documentation, which is clear and
5160complete. As is conventional, the three arguments are written in
5161upper case so you will notice them easily. Even better, they are
5162described in the same order as in the argument list.
5163
5164Note that the documentation distinguishes between a buffer and its
5165name. (The function can handle either.)
5166
5167@node append interactive, append-to-buffer body, append-to-buffer overview, append-to-buffer
5168@comment node-name, next, previous, up
5169@subsection The @code{append-to-buffer} Interactive Expression
5170
5171Since the @code{append-to-buffer} function will be used interactively,
5172the function must have an @code{interactive} expression. (For a
5173review of @code{interactive}, see @ref{Interactive, , Making a
5174Function Interactive}.) The expression reads as follows:
5175
5176@smallexample
5177@group
5178(interactive
5179 (list (read-buffer
5180 "Append to buffer: "
5181 (other-buffer (current-buffer) t))
5182 (region-beginning)
5183 (region-end)))
5184@end group
5185@end smallexample
5186
5187@noindent
5188This expression is not one with letters standing for parts, as
5189described earlier. Instead, it starts a list with these parts:
5190
5191The first part of the list is an expression to read the name of a
5192buffer and return it as a string. That is @code{read-buffer}. The
5193function requires a prompt as its first argument, @samp{"Append to
5194buffer: "}. Its second argument tells the command what value to
5195provide if you don't specify anything.
5196
5197In this case that second argument is an expression containing the
5198function @code{other-buffer}, an exception, and a @samp{t}, standing
5199for true.
5200
5201The first argument to @code{other-buffer}, the exception, is yet
5202another function, @code{current-buffer}. That is not going to be
5203returned. The second argument is the symbol for true, @code{t}. that
5204tells @code{other-buffer} that it may show visible buffers (except in
5205this case, it will not show the current buffer, which makes sense).
5206
5207@need 1250
5208The expression looks like this:
5209
5210@smallexample
5211(other-buffer (current-buffer) t)
5212@end smallexample
5213
5214The second and third arguments to the @code{list} expression are
5215@code{(region-beginning)} and @code{(region-end)}. These two
5216functions specify the beginning and end of the text to be appended.
5217
5218@need 1250
5219Originally, the command used the letters @samp{B} and @samp{r}.
5220The whole @code{interactive} expression looked like this:
5221
5222@smallexample
5223(interactive "BAppend to buffer:@: \nr")
5224@end smallexample
5225
5226@noindent
5227But when that was done, the default value of the buffer switched to
5228was invisible. That was not wanted.
5229
5230(The prompt was separated from the second argument with a newline,
5231@samp{\n}. It was followed by an @samp{r} that told Emacs to bind the
5232two arguments that follow the symbol @code{buffer} in the function's
5233argument list (that is, @code{start} and @code{end}) to the values of
5234point and mark. That argument worked fine.)
5235
5236@node append-to-buffer body, append save-excursion, append interactive, append-to-buffer
5237@comment node-name, next, previous, up
5238@subsection The Body of @code{append-to-buffer}
5239
5240@ignore
5241in GNU Emacs 22 in /usr/local/src/emacs/lisp/simple.el
5242
5243(defun append-to-buffer (buffer start end)
5244 "Append to specified buffer the text of the region.
5245It is inserted into that buffer before its point.
5246
5247When calling from a program, give three arguments:
5248BUFFER (or buffer name), START and END.
5249START and END specify the portion of the current buffer to be copied."
5250 (interactive
5251 (list (read-buffer "Append to buffer: " (other-buffer (current-buffer) t))
5252 (region-beginning) (region-end)))
5253 (let ((oldbuf (current-buffer)))
5254 (save-excursion
5255 (let* ((append-to (get-buffer-create buffer))
5256 (windows (get-buffer-window-list append-to t t))
5257 point)
5258 (set-buffer append-to)
5259 (setq point (point))
5260 (barf-if-buffer-read-only)
5261 (insert-buffer-substring oldbuf start end)
5262 (dolist (window windows)
5263 (when (= (window-point window) point)
5264 (set-window-point window (point))))))))
5265@end ignore
5266
5267The body of the @code{append-to-buffer} function begins with @code{let}.
5268
5269As we have seen before (@pxref{let, , @code{let}}), the purpose of a
5270@code{let} expression is to create and give initial values to one or
5271more variables that will only be used within the body of the
5272@code{let}. This means that such a variable will not be confused with
5273any variable of the same name outside the @code{let} expression.
5274
5275We can see how the @code{let} expression fits into the function as a
5276whole by showing a template for @code{append-to-buffer} with the
5277@code{let} expression in outline:
5278
5279@smallexample
5280@group
5281(defun append-to-buffer (buffer start end)
5282 "@var{documentation}@dots{}"
5283 (interactive @dots{})
5284 (let ((@var{variable} @var{value}))
5285 @var{body}@dots{})
5286@end group
5287@end smallexample
5288
5289The @code{let} expression has three elements:
5290
5291@enumerate
5292@item
5293The symbol @code{let};
5294
5295@item
5296A varlist containing, in this case, a single two-element list,
5297@code{(@var{variable} @var{value})};
5298
5299@item
5300The body of the @code{let} expression.
5301@end enumerate
5302
5303@need 800
5304In the @code{append-to-buffer} function, the varlist looks like this:
5305
5306@smallexample
5307(oldbuf (current-buffer))
5308@end smallexample
5309
5310@noindent
5311In this part of the @code{let} expression, the one variable,
5312@code{oldbuf}, is bound to the value returned by the
5313@code{(current-buffer)} expression. The variable, @code{oldbuf}, is
5314used to keep track of the buffer in which you are working and from
5315which you will copy.
5316
5317The element or elements of a varlist are surrounded by a set of
5318parentheses so the Lisp interpreter can distinguish the varlist from
5319the body of the @code{let}. As a consequence, the two-element list
5320within the varlist is surrounded by a circumscribing set of parentheses.
5321The line looks like this:
5322
5323@smallexample
5324@group
5325(let ((oldbuf (current-buffer)))
5326 @dots{} )
5327@end group
5328@end smallexample
5329
5330@noindent
5331The two parentheses before @code{oldbuf} might surprise you if you did
5332not realize that the first parenthesis before @code{oldbuf} marks the
5333boundary of the varlist and the second parenthesis marks the beginning
5334of the two-element list, @code{(oldbuf (current-buffer))}.
5335
5336@node append save-excursion, , append-to-buffer body, append-to-buffer
5337@comment node-name, next, previous, up
5338@subsection @code{save-excursion} in @code{append-to-buffer}
5339
5340The body of the @code{let} expression in @code{append-to-buffer}
5341consists of a @code{save-excursion} expression.
5342
5343The @code{save-excursion} function saves the locations of point and
5344mark, and restores them to those positions after the expressions in the
5345body of the @code{save-excursion} complete execution. In addition,
5346@code{save-excursion} keeps track of the original buffer, and
5347restores it. This is how @code{save-excursion} is used in
5348@code{append-to-buffer}.
5349
5350@need 1500
5351@cindex Indentation for formatting
5352@cindex Formatting convention
5353Incidentally, it is worth noting here that a Lisp function is normally
5354formatted so that everything that is enclosed in a multi-line spread is
5355indented more to the right than the first symbol. In this function
5356definition, the @code{let} is indented more than the @code{defun}, and
5357the @code{save-excursion} is indented more than the @code{let}, like
5358this:
5359
5360@smallexample
5361@group
5362(defun @dots{}
5363 @dots{}
5364 @dots{}
5365 (let@dots{}
5366 (save-excursion
5367 @dots{}
5368@end group
5369@end smallexample
5370
5371@need 1500
5372@noindent
5373This formatting convention makes it easy to see that the lines in
5374the body of the @code{save-excursion} are enclosed by the parentheses
5375associated with @code{save-excursion}, just as the
5376@code{save-excursion} itself is enclosed by the parentheses associated
5377with the @code{let}:
5378
5379@smallexample
5380@group
5381(let ((oldbuf (current-buffer)))
5382 (save-excursion
5383 @dots{}
5384 (set-buffer @dots{})
5385 (insert-buffer-substring oldbuf start end)
5386 @dots{}))
5387@end group
5388@end smallexample
5389
5390@need 1200
5391The use of the @code{save-excursion} function can be viewed as a process
5392of filling in the slots of a template:
5393
5394@smallexample
5395@group
5396(save-excursion
5397 @var{first-expression-in-body}
5398 @var{second-expression-in-body}
5399 @dots{}
5400 @var{last-expression-in-body})
5401@end group
5402@end smallexample
5403
5404@need 1200
5405@noindent
5406In this function, the body of the @code{save-excursion} contains only
5407one expression, the @code{let*} expression. You know about a
5408@code{let} function. The @code{let*} function is different. It has a
5409@samp{*} in its name. It enables Emacs to set each variable in its
5410varlist in sequence, one after another.
5411
5412Its critical feature is that variables later in the varlist can make
5413use of the values to which Emacs set variables earlier in the varlist.
5414@xref{fwd-para let, , The @code{let*} expression}.
5415
5416We will skip functions like @code{let*} and focus on two: the
5417@code{set-buffer} function and the @code{insert-buffer-substring}
5418function.
5419
5420@need 1250
5421In the old days, the @code{set-buffer} expression was simply
5422
5423@smallexample
5424(set-buffer (get-buffer-create buffer))
5425@end smallexample
5426
5427@need 1250
5428@noindent
5429but now it is
5430
5431@smallexample
5432(set-buffer append-to)
5433@end smallexample
5434
5435@noindent
5436@code{append-to} is bound to @code{(get-buffer-create buffer)} earlier
5437on in the @code{let*} expression. That extra binding would not be
5438necessary except for that @code{append-to} is used later in the
5439varlist as an argument to @code{get-buffer-window-list}.
5440
5441@ignore
5442in GNU Emacs 22
5443
5444 (let ((oldbuf (current-buffer)))
5445 (save-excursion
5446 (let* ((append-to (get-buffer-create buffer))
5447 (windows (get-buffer-window-list append-to t t))
5448 point)
5449 (set-buffer append-to)
5450 (setq point (point))
5451 (barf-if-buffer-read-only)
5452 (insert-buffer-substring oldbuf start end)
5453 (dolist (window windows)
5454 (when (= (window-point window) point)
5455 (set-window-point window (point))))))))
5456@end ignore
5457
5458The @code{append-to-buffer} function definition inserts text from the
5459buffer in which you are currently to a named buffer. It happens that
5460@code{insert-buffer-substring} copies text from another buffer to the
5461current buffer, just the reverse---that is why the
5462@code{append-to-buffer} definition starts out with a @code{let} that
5463binds the local symbol @code{oldbuf} to the value returned by
5464@code{current-buffer}.
5465
5466@need 1250
5467The @code{insert-buffer-substring} expression looks like this:
5468
5469@smallexample
5470(insert-buffer-substring oldbuf start end)
5471@end smallexample
5472
5473@noindent
5474The @code{insert-buffer-substring} function copies a string
5475@emph{from} the buffer specified as its first argument and inserts the
5476string into the present buffer. In this case, the argument to
5477@code{insert-buffer-substring} is the value of the variable created
5478and bound by the @code{let}, namely the value of @code{oldbuf}, which
5479was the current buffer when you gave the @code{append-to-buffer}
5480command.
5481
5482After @code{insert-buffer-substring} has done its work,
5483@code{save-excursion} will restore the action to the original buffer
5484and @code{append-to-buffer} will have done its job.
5485
5486@need 800
5487Written in skeletal form, the workings of the body look like this:
5488
5489@smallexample
5490@group
5491(let (@var{bind-}@code{oldbuf}@var{-to-value-of-}@code{current-buffer})
5492 (save-excursion ; @r{Keep track of buffer.}
5493 @var{change-buffer}
5494 @var{insert-substring-from-}@code{oldbuf}@var{-into-buffer})
5495
5496 @var{change-back-to-original-buffer-when-finished}
5497@var{let-the-local-meaning-of-}@code{oldbuf}@var{-disappear-when-finished}
5498@end group
5499@end smallexample
5500
5501In summary, @code{append-to-buffer} works as follows: it saves the
5502value of the current buffer in the variable called @code{oldbuf}. It
5503gets the new buffer (creating one if need be) and switches Emacs'
5504attention to it. Using the value of @code{oldbuf}, it inserts the
5505region of text from the old buffer into the new buffer; and then using
5506@code{save-excursion}, it brings you back to your original buffer.
5507
5508In looking at @code{append-to-buffer}, you have explored a fairly
5509complex function. It shows how to use @code{let} and
5510@code{save-excursion}, and how to change to and come back from another
5511buffer. Many function definitions use @code{let},
5512@code{save-excursion}, and @code{set-buffer} this way.
5513
5514@node Buffer Related Review, Buffer Exercises, append-to-buffer, Buffer Walk Through
5515@comment node-name, next, previous, up
5516@section Review
5517
5518Here is a brief summary of the various functions discussed in this chapter.
5519
5520@table @code
5521@item describe-function
5522@itemx describe-variable
5523Print the documentation for a function or variable.
5524Conventionally bound to @kbd{C-h f} and @kbd{C-h v}.
5525
5526@item find-tag
5527Find the file containing the source for a function or variable and
5528switch buffers to it, positioning point at the beginning of the item.
5529Conventionally bound to @kbd{M-.} (that's a period following the
5530@key{META} key).
5531
5532@item save-excursion
5533Save the location of point and mark and restore their values after the
5534arguments to @code{save-excursion} have been evaluated. Also, remember
5535the current buffer and return to it.
5536
5537@item push-mark
5538Set mark at a location and record the value of the previous mark on the
5539mark ring. The mark is a location in the buffer that will keep its
5540relative position even if text is added to or removed from the buffer.
5541
5542@item goto-char
5543Set point to the location specified by the value of the argument, which
5544can be a number, a marker, or an expression that returns the number of
5545a position, such as @code{(point-min)}.
5546
5547@item insert-buffer-substring
5548Copy a region of text from a buffer that is passed to the function as
5549an argument and insert the region into the current buffer.
5550
5551@item mark-whole-buffer
5552Mark the whole buffer as a region. Normally bound to @kbd{C-x h}.
5553
5554@item set-buffer
5555Switch the attention of Emacs to another buffer, but do not change the
5556window being displayed. Used when the program rather than a human is
5557to work on a different buffer.
5558
5559@item get-buffer-create
5560@itemx get-buffer
5561Find a named buffer or create one if a buffer of that name does not
5562exist. The @code{get-buffer} function returns @code{nil} if the named
5563buffer does not exist.
5564@end table
5565
5566@need 1500
5567@node Buffer Exercises, , Buffer Related Review, Buffer Walk Through
5568@section Exercises
5569
5570@itemize @bullet
5571@item
5572Write your own @code{simplified-end-of-buffer} function definition;
5573then test it to see whether it works.
5574
5575@item
5576Use @code{if} and @code{get-buffer} to write a function that prints a
5577message telling you whether a buffer exists.
5578
5579@item
5580Using @code{find-tag}, find the source for the @code{copy-to-buffer}
5581function.
5582@end itemize
5583
5584@node More Complex, Narrowing & Widening, Buffer Walk Through, Top
5585@comment node-name, next, previous, up
5586@chapter A Few More Complex Functions
5587
5588In this chapter, we build on what we have learned in previous chapters
5589by looking at more complex functions. The @code{copy-to-buffer}
5590function illustrates use of two @code{save-excursion} expressions in
5591one definition, while the @code{insert-buffer} function illustrates
5592use of an asterisk in an @code{interactive} expression, use of
5593@code{or}, and the important distinction between a name and the object
5594to which the name refers.
5595
5596@menu
5597* copy-to-buffer:: With @code{set-buffer}, @code{get-buffer-create}.
5598* insert-buffer:: Read-only, and with @code{or}.
5599* beginning-of-buffer:: Shows @code{goto-char},
5600 @code{point-min}, and @code{push-mark}.
5601* Second Buffer Related Review::
5602* optional Exercise::
5603@end menu
5604
5605@node copy-to-buffer, insert-buffer, More Complex, More Complex
5606@comment node-name, next, previous, up
5607@section The Definition of @code{copy-to-buffer}
5608@findex copy-to-buffer
5609
5610After understanding how @code{append-to-buffer} works, it is easy to
5611understand @code{copy-to-buffer}. This function copies text into a
5612buffer, but instead of adding to the second buffer, it replaces all the
5613previous text in the second buffer.
5614
5615@need 800
5616The body of @code{copy-to-buffer} looks like this,
5617
5618@smallexample
5619@group
5620@dots{}
5621(interactive "BCopy to buffer: \nr")
5622(let ((oldbuf (current-buffer)))
5623 (with-current-buffer (get-buffer-create buffer)
5624 (barf-if-buffer-read-only)
5625 (erase-buffer)
5626 (save-excursion
5627 (insert-buffer-substring oldbuf start end)))))
5628@end group
5629@end smallexample
5630
5631The @code{copy-to-buffer} function has a simpler @code{interactive}
5632expression than @code{append-to-buffer}.
5633
5634@need 800
5635The definition then says
5636
5637@smallexample
5638(with-current-buffer (get-buffer-create buffer) @dots{}
5639@end smallexample
5640
5641First, look at the earliest inner expression; that is evaluated first.
5642That expression starts with @code{get-buffer-create buffer}. The
5643function tells the computer to use the buffer with the name specified
5644as the one to which you are copying, or if such a buffer does not
5645exist, to create it. Then, the @code{with-current-buffer} function
5646evaluates its body with that buffer temporarily current.
5647
5648(This demonstrates another way to shift the computer's attention but
5649not the user's. The @code{append-to-buffer} function showed how to do
5650the same with @code{save-excursion} and @code{set-buffer}.
5651@code{with-current-buffer} is a newer, and arguably easier,
5652mechanism.)
5653
5654The @code{barf-if-buffer-read-only} function sends you an error
5655message saying the buffer is read-only if you cannot modify it.
5656
5657The next line has the @code{erase-buffer} function as its sole
5658contents. That function erases the buffer.
5659
5660Finally, the last two lines contain the @code{save-excursion}
5661expression with @code{insert-buffer-substring} as its body.
5662The @code{insert-buffer-substring} expression copies the text from
5663the buffer you are in (and you have not seen the computer shift its
5664attention, so you don't know that that buffer is now called
5665@code{oldbuf}).
5666
5667Incidentally, this is what is meant by `replacement'. To replace text,
5668Emacs erases the previous text and then inserts new text.
5669
5670@need 1250
5671In outline, the body of @code{copy-to-buffer} looks like this:
5672
5673@smallexample
5674@group
5675(let (@var{bind-}@code{oldbuf}@var{-to-value-of-}@code{current-buffer})
5676 (@var{with-the-buffer-you-are-copying-to}
5677 (@var{but-do-not-erase-or-copy-to-a-read-only-buffer})
5678 (erase-buffer)
5679 (save-excursion
5680 @var{insert-substring-from-}@code{oldbuf}@var{-into-buffer})))
5681@end group
5682@end smallexample
5683
5684@node insert-buffer, beginning-of-buffer, copy-to-buffer, More Complex
5685@comment node-name, next, previous, up
5686@section The Definition of @code{insert-buffer}
5687@findex insert-buffer
5688
5689@code{insert-buffer} is yet another buffer-related function. This
5690command copies another buffer @emph{into} the current buffer. It is the
5691reverse of @code{append-to-buffer} or @code{copy-to-buffer}, since they
5692copy a region of text @emph{from} the current buffer to another buffer.
5693
5694Here is a discussion based on the original code. The code was
5695simplified in 2003 and is harder to understand.
5696
5697(@xref{New insert-buffer, , New Body for @code{insert-buffer}}, to see
5698a discussion of the new body.)
5699
5700In addition, this code illustrates the use of @code{interactive} with a
5701buffer that might be @dfn{read-only} and the important distinction
5702between the name of an object and the object actually referred to.
5703
5704@menu
5705* insert-buffer code::
5706* insert-buffer interactive:: When you can read, but not write.
5707* insert-buffer body:: The body has an @code{or} and a @code{let}.
5708* if & or:: Using an @code{if} instead of an @code{or}.
5709* Insert or:: How the @code{or} expression works.
5710* Insert let:: Two @code{save-excursion} expressions.
5711* New insert-buffer::
5712@end menu
5713
5714@node insert-buffer code, insert-buffer interactive, insert-buffer, insert-buffer
5715@ifnottex
5716@unnumberedsubsec The Code for @code{insert-buffer}
5717@end ifnottex
5718
5719@need 800
5720Here is the earlier code:
5721
5722@smallexample
5723@group
5724(defun insert-buffer (buffer)
5725 "Insert after point the contents of BUFFER.
5726Puts mark after the inserted text.
5727BUFFER may be a buffer or a buffer name."
5728 (interactive "*bInsert buffer:@: ")
5729@end group
5730@group
5731 (or (bufferp buffer)
5732 (setq buffer (get-buffer buffer)))
5733 (let (start end newmark)
5734 (save-excursion
5735 (save-excursion
5736 (set-buffer buffer)
5737 (setq start (point-min) end (point-max)))
5738@end group
5739@group
5740 (insert-buffer-substring buffer start end)
5741 (setq newmark (point)))
5742 (push-mark newmark)))
5743@end group
5744@end smallexample
5745
5746@need 1200
5747As with other function definitions, you can use a template to see an
5748outline of the function:
5749
5750@smallexample
5751@group
5752(defun insert-buffer (buffer)
5753 "@var{documentation}@dots{}"
5754 (interactive "*bInsert buffer:@: ")
5755 @var{body}@dots{})
5756@end group
5757@end smallexample
5758
5759@node insert-buffer interactive, insert-buffer body, insert-buffer code, insert-buffer
5760@comment node-name, next, previous, up
5761@subsection The Interactive Expression in @code{insert-buffer}
5762@findex interactive, @r{example use of}
5763
5764In @code{insert-buffer}, the argument to the @code{interactive}
5765declaration has two parts, an asterisk, @samp{*}, and @samp{bInsert
5766buffer:@: }.
5767
5768@menu
5769* Read-only buffer:: When a buffer cannot be modified.
5770* b for interactive:: An existing buffer or else its name.
5771@end menu
5772
5773@node Read-only buffer, b for interactive, insert-buffer interactive, insert-buffer interactive
5774@comment node-name, next, previous, up
5775@unnumberedsubsubsec A Read-only Buffer
5776@cindex Read-only buffer
5777@cindex Asterisk for read-only buffer
5778@findex * @r{for read-only buffer}
5779
5780The asterisk is for the situation when the current buffer is a
5781read-only buffer---a buffer that cannot be modified. If
5782@code{insert-buffer} is called when the current buffer is read-only, a
5783message to this effect is printed in the echo area and the terminal
5784may beep or blink at you; you will not be permitted to insert anything
5785into current buffer. The asterisk does not need to be followed by a
5786newline to separate it from the next argument.
5787
5788@node b for interactive, , Read-only buffer, insert-buffer interactive
5789@comment node-name, next, previous, up
5790@unnumberedsubsubsec @samp{b} in an Interactive Expression
5791
5792The next argument in the interactive expression starts with a lower
5793case @samp{b}. (This is different from the code for
5794@code{append-to-buffer}, which uses an upper-case @samp{B}.
5795@xref{append-to-buffer, , The Definition of @code{append-to-buffer}}.)
5796The lower-case @samp{b} tells the Lisp interpreter that the argument
5797for @code{insert-buffer} should be an existing buffer or else its
5798name. (The upper-case @samp{B} option provides for the possibility
5799that the buffer does not exist.) Emacs will prompt you for the name
5800of the buffer, offering you a default buffer, with name completion
5801enabled. If the buffer does not exist, you receive a message that
5802says ``No match''; your terminal may beep at you as well.
5803
5804The new and simplified code generates a list for @code{interactive}.
5805It uses the @code{barf-if-buffer-read-only} and @code{read-buffer}
5806functions with which we are already familiar and the @code{progn}
5807special form with which we are not. (It will be described later.)
5808
5809@node insert-buffer body, if & or, insert-buffer interactive, insert-buffer
5810@comment node-name, next, previous, up
5811@subsection The Body of the @code{insert-buffer} Function
5812
5813The body of the @code{insert-buffer} function has two major parts: an
5814@code{or} expression and a @code{let} expression. The purpose of the
5815@code{or} expression is to ensure that the argument @code{buffer} is
5816bound to a buffer and not just the name of a buffer. The body of the
5817@code{let} expression contains the code which copies the other buffer
5818into the current buffer.
5819
5820@need 1250
5821In outline, the two expressions fit into the @code{insert-buffer}
5822function like this:
5823
5824@smallexample
5825@group
5826(defun insert-buffer (buffer)
5827 "@var{documentation}@dots{}"
5828 (interactive "*bInsert buffer:@: ")
5829 (or @dots{}
5830 @dots{}
5831@end group
5832@group
5833 (let (@var{varlist})
5834 @var{body-of-}@code{let}@dots{} )
5835@end group
5836@end smallexample
5837
5838To understand how the @code{or} expression ensures that the argument
5839@code{buffer} is bound to a buffer and not to the name of a buffer, it
5840is first necessary to understand the @code{or} function.
5841
5842Before doing this, let me rewrite this part of the function using
5843@code{if} so that you can see what is done in a manner that will be familiar.
5844
5845@node if & or, Insert or, insert-buffer body, insert-buffer
5846@comment node-name, next, previous, up
5847@subsection @code{insert-buffer} With an @code{if} Instead of an @code{or}
5848
5849The job to be done is to make sure the value of @code{buffer} is a
5850buffer itself and not the name of a buffer. If the value is the name,
5851then the buffer itself must be got.
5852
5853You can imagine yourself at a conference where an usher is wandering
5854around holding a list with your name on it and looking for you: the
5855usher is ``bound'' to your name, not to you; but when the usher finds
5856you and takes your arm, the usher becomes ``bound'' to you.
5857
5858@need 800
5859In Lisp, you might describe this situation like this:
5860
5861@smallexample
5862@group
5863(if (not (holding-on-to-guest))
5864 (find-and-take-arm-of-guest))
5865@end group
5866@end smallexample
5867
5868We want to do the same thing with a buffer---if we do not have the
5869buffer itself, we want to get it.
5870
5871@need 1200
5872Using a predicate called @code{bufferp} that tells us whether we have a
5873buffer (rather than its name), we can write the code like this:
5874
5875@smallexample
5876@group
5877(if (not (bufferp buffer)) ; @r{if-part}
5878 (setq buffer (get-buffer buffer))) ; @r{then-part}
5879@end group
5880@end smallexample
5881
5882@noindent
5883Here, the true-or-false-test of the @code{if} expression is
5884@w{@code{(not (bufferp buffer))}}; and the then-part is the expression
5885@w{@code{(setq buffer (get-buffer buffer))}}.
5886
5887In the test, the function @code{bufferp} returns true if its argument is
5888a buffer---but false if its argument is the name of the buffer. (The
5889last character of the function name @code{bufferp} is the character
5890@samp{p}; as we saw earlier, such use of @samp{p} is a convention that
5891indicates that the function is a predicate, which is a term that means
5892that the function will determine whether some property is true or false.
5893@xref{Wrong Type of Argument, , Using the Wrong Type Object as an
5894Argument}.)
5895
5896@need 1200
5897The function @code{not} precedes the expression @code{(bufferp buffer)},
5898so the true-or-false-test looks like this:
5899
5900@smallexample
5901(not (bufferp buffer))
5902@end smallexample
5903
5904@noindent
5905@code{not} is a function that returns true if its argument is false
5906and false if its argument is true. So if @code{(bufferp buffer)}
5907returns true, the @code{not} expression returns false and vice-verse:
5908what is ``not true'' is false and what is ``not false'' is true.
5909
5910Using this test, the @code{if} expression works as follows: when the
5911value of the variable @code{buffer} is actually a buffer rather than
5912its name, the true-or-false-test returns false and the @code{if}
5913expression does not evaluate the then-part. This is fine, since we do
5914not need to do anything to the variable @code{buffer} if it really is
5915a buffer.
5916
5917On the other hand, when the value of @code{buffer} is not a buffer
5918itself, but the name of a buffer, the true-or-false-test returns true
5919and the then-part of the expression is evaluated. In this case, the
5920then-part is @code{(setq buffer (get-buffer buffer))}. This
5921expression uses the @code{get-buffer} function to return an actual
5922buffer itself, given its name. The @code{setq} then sets the variable
5923@code{buffer} to the value of the buffer itself, replacing its previous
5924value (which was the name of the buffer).
5925
5926@node Insert or, Insert let, if & or, insert-buffer
5927@comment node-name, next, previous, up
5928@subsection The @code{or} in the Body
5929
5930The purpose of the @code{or} expression in the @code{insert-buffer}
5931function is to ensure that the argument @code{buffer} is bound to a
5932buffer and not just to the name of a buffer. The previous section shows
5933how the job could have been done using an @code{if} expression.
5934However, the @code{insert-buffer} function actually uses @code{or}.
5935To understand this, it is necessary to understand how @code{or} works.
5936
5937@findex or
5938An @code{or} function can have any number of arguments. It evaluates
5939each argument in turn and returns the value of the first of its
5940arguments that is not @code{nil}. Also, and this is a crucial feature
5941of @code{or}, it does not evaluate any subsequent arguments after
5942returning the first non-@code{nil} value.
5943
5944@need 800
5945The @code{or} expression looks like this:
5946
5947@smallexample
5948@group
5949(or (bufferp buffer)
5950 (setq buffer (get-buffer buffer)))
5951@end group
5952@end smallexample
5953
5954@noindent
5955The first argument to @code{or} is the expression @code{(bufferp buffer)}.
5956This expression returns true (a non-@code{nil} value) if the buffer is
5957actually a buffer, and not just the name of a buffer. In the @code{or}
5958expression, if this is the case, the @code{or} expression returns this
5959true value and does not evaluate the next expression---and this is fine
5960with us, since we do not want to do anything to the value of
5961@code{buffer} if it really is a buffer.
5962
5963On the other hand, if the value of @code{(bufferp buffer)} is @code{nil},
5964which it will be if the value of @code{buffer} is the name of a buffer,
5965the Lisp interpreter evaluates the next element of the @code{or}
5966expression. This is the expression @code{(setq buffer (get-buffer
5967buffer))}. This expression returns a non-@code{nil} value, which
5968is the value to which it sets the variable @code{buffer}---and this
5969value is a buffer itself, not the name of a buffer.
5970
5971The result of all this is that the symbol @code{buffer} is always
5972bound to a buffer itself rather than to the name of a buffer. All
5973this is necessary because the @code{set-buffer} function in a
5974following line only works with a buffer itself, not with the name to a
5975buffer.
5976
5977@need 1250
5978Incidentally, using @code{or}, the situation with the usher would be
5979written like this:
5980
5981@smallexample
5982(or (holding-on-to-guest) (find-and-take-arm-of-guest))
5983@end smallexample
5984
5985@node Insert let, New insert-buffer, Insert or, insert-buffer
5986@comment node-name, next, previous, up
5987@subsection The @code{let} Expression in @code{insert-buffer}
5988
5989After ensuring that the variable @code{buffer} refers to a buffer itself
5990and not just to the name of a buffer, the @code{insert-buffer function}
5991continues with a @code{let} expression. This specifies three local
5992variables, @code{start}, @code{end}, and @code{newmark} and binds them
5993to the initial value @code{nil}. These variables are used inside the
5994remainder of the @code{let} and temporarily hide any other occurrence of
5995variables of the same name in Emacs until the end of the @code{let}.
5996
5997@need 1200
5998The body of the @code{let} contains two @code{save-excursion}
5999expressions. First, we will look at the inner @code{save-excursion}
6000expression in detail. The expression looks like this:
6001
6002@smallexample
6003@group
6004(save-excursion
6005 (set-buffer buffer)
6006 (setq start (point-min) end (point-max)))
6007@end group
6008@end smallexample
6009
6010@noindent
6011The expression @code{(set-buffer buffer)} changes Emacs' attention
6012from the current buffer to the one from which the text will copied.
6013In that buffer, the variables @code{start} and @code{end} are set to
6014the beginning and end of the buffer, using the commands
6015@code{point-min} and @code{point-max}. Note that we have here an
6016illustration of how @code{setq} is able to set two variables in the
6017same expression. The first argument of @code{setq} is set to the
6018value of its second, and its third argument is set to the value of its
6019fourth.
6020
6021After the body of the inner @code{save-excursion} is evaluated, the
6022@code{save-excursion} restores the original buffer, but @code{start} and
6023@code{end} remain set to the values of the beginning and end of the
6024buffer from which the text will be copied.
6025
6026@need 1250
6027The outer @code{save-excursion} expression looks like this:
6028
6029@smallexample
6030@group
6031(save-excursion
6032 (@var{inner-}@code{save-excursion}@var{-expression}
6033 (@var{go-to-new-buffer-and-set-}@code{start}@var{-and-}@code{end})
6034 (insert-buffer-substring buffer start end)
6035 (setq newmark (point)))
6036@end group
6037@end smallexample
6038
6039@noindent
6040The @code{insert-buffer-substring} function copies the text
6041@emph{into} the current buffer @emph{from} the region indicated by
6042@code{start} and @code{end} in @code{buffer}. Since the whole of the
6043second buffer lies between @code{start} and @code{end}, the whole of
6044the second buffer is copied into the buffer you are editing. Next,
6045the value of point, which will be at the end of the inserted text, is
6046recorded in the variable @code{newmark}.
6047
6048After the body of the outer @code{save-excursion} is evaluated, point
6049and mark are relocated to their original places.
6050
6051However, it is convenient to locate a mark at the end of the newly
6052inserted text and locate point at its beginning. The @code{newmark}
6053variable records the end of the inserted text. In the last line of
6054the @code{let} expression, the @code{(push-mark newmark)} expression
6055function sets a mark to this location. (The previous location of the
6056mark is still accessible; it is recorded on the mark ring and you can
6057go back to it with @kbd{C-u C-@key{SPC}}.) Meanwhile, point is
6058located at the beginning of the inserted text, which is where it was
6059before you called the insert function, the position of which was saved
6060by the first @code{save-excursion}.
6061
6062@need 1250
6063The whole @code{let} expression looks like this:
6064
6065@smallexample
6066@group
6067(let (start end newmark)
6068 (save-excursion
6069 (save-excursion
6070 (set-buffer buffer)
6071 (setq start (point-min) end (point-max)))
6072 (insert-buffer-substring buffer start end)
6073 (setq newmark (point)))
6074 (push-mark newmark))
6075@end group
6076@end smallexample
6077
6078Like the @code{append-to-buffer} function, the @code{insert-buffer}
6079function uses @code{let}, @code{save-excursion}, and
6080@code{set-buffer}. In addition, the function illustrates one way to
6081use @code{or}. All these functions are building blocks that we will
6082find and use again and again.
6083
6084@node New insert-buffer, , Insert let, insert-buffer
6085@comment node-name, next, previous, up
6086@subsection New Body for @code{insert-buffer}
6087@findex insert-buffer, new version body
6088@findex new version body for insert-buffer
6089
6090The body in the GNU Emacs 22 version is more confusing than the original.
6091
6092@need 1250
6093It consists of two expressions,
6094
6095@smallexample
6096@group
6097 (push-mark
6098 (save-excursion
6099 (insert-buffer-substring (get-buffer buffer))
6100 (point)))
6101
6102 nil
6103@end group
6104@end smallexample
6105
6106@noindent
6107except, and this is what confuses novices, very important work is done
6108inside the @code{push-mark} expression.
6109
6110The @code{get-buffer} function returns a buffer with the name
6111provided. You will note that the function is @emph{not} called
6112@code{get-buffer-create}; it does not create a buffer if one does not
6113already exist. The buffer returned by @code{get-buffer}, an existing
6114buffer, is passed to @code{insert-buffer-substring}, which inserts the
6115whole of the buffer (since you did not specify anything else).
6116
6117The location into which the buffer is inserted is recorded by
6118@code{push-mark}. Then the function returns @code{nil}, the value of
6119its last command. Put another way, the @code{insert-buffer} function
6120exists only to produce a side effect, inserting another buffer, not to
6121return any value.
6122
6123@node beginning-of-buffer, Second Buffer Related Review, insert-buffer, More Complex
6124@comment node-name, next, previous, up
6125@section Complete Definition of @code{beginning-of-buffer}
6126@findex beginning-of-buffer
6127
6128The basic structure of the @code{beginning-of-buffer} function has
6129already been discussed. (@xref{simplified-beginning-of-buffer, , A
6130Simplified @code{beginning-of-buffer} Definition}.)
6131This section describes the complex part of the definition.
6132
6133As previously described, when invoked without an argument,
6134@code{beginning-of-buffer} moves the cursor to the beginning of the
6135buffer (in truth, the beginning of the accessible portion of the
6136buffer), leaving the mark at the previous position. However, when the
6137command is invoked with a number between one and ten, the function
6138considers that number to be a fraction of the length of the buffer,
6139measured in tenths, and Emacs moves the cursor that fraction of the
6140way from the beginning of the buffer. Thus, you can either call this
6141function with the key command @kbd{M-<}, which will move the cursor to
6142the beginning of the buffer, or with a key command such as @kbd{C-u 7
6143M-<} which will move the cursor to a point 70% of the way through the
6144buffer. If a number bigger than ten is used for the argument, it
6145moves to the end of the buffer.
6146
6147The @code{beginning-of-buffer} function can be called with or without an
6148argument. The use of the argument is optional.
6149
6150@menu
6151* Optional Arguments::
6152* beginning-of-buffer opt arg:: Example with optional argument.
6153* beginning-of-buffer complete::
6154@end menu
6155
6156@node Optional Arguments, beginning-of-buffer opt arg, beginning-of-buffer, beginning-of-buffer
6157@subsection Optional Arguments
6158
6159Unless told otherwise, Lisp expects that a function with an argument in
6160its function definition will be called with a value for that argument.
6161If that does not happen, you get an error and a message that says
6162@samp{Wrong number of arguments}.
6163
6164@cindex Optional arguments
6165@cindex Keyword
6166@findex optional
6167However, optional arguments are a feature of Lisp: a particular
6168@dfn{keyword} is used to tell the Lisp interpreter that an argument is
6169optional. The keyword is @code{&optional}. (The @samp{&} in front of
6170@samp{optional} is part of the keyword.) In a function definition, if
6171an argument follows the keyword @code{&optional}, no value need be
6172passed to that argument when the function is called.
6173
6174@need 1200
6175The first line of the function definition of @code{beginning-of-buffer}
6176therefore looks like this:
6177
6178@smallexample
6179(defun beginning-of-buffer (&optional arg)
6180@end smallexample
6181
6182@need 1250
6183In outline, the whole function looks like this:
6184
6185@smallexample
6186@group
6187(defun beginning-of-buffer (&optional arg)
6188 "@var{documentation}@dots{}"
6189 (interactive "P")
6190 (or (@var{is-the-argument-a-cons-cell} arg)
6191 (and @var{are-both-transient-mark-mode-and-mark-active-true})
6192 (push-mark))
6193 (let (@var{determine-size-and-set-it})
6194 (goto-char
6195 (@var{if-there-is-an-argument}
6196 @var{figure-out-where-to-go}
6197 @var{else-go-to}
6198 (point-min))))
6199 @var{do-nicety}
6200@end group
6201@end smallexample
6202
6203The function is similar to the @code{simplified-beginning-of-buffer}
6204function except that the @code{interactive} expression has @code{"P"}
6205as an argument and the @code{goto-char} function is followed by an
6206if-then-else expression that figures out where to put the cursor if
6207there is an argument that is not a cons cell.
6208
6209(Since I do not explain a cons cell for many more chapters, please
6210consider ignoring the function @code{consp}. @xref{List
6211Implementation, , How Lists are Implemented}, and @ref{Cons Cell Type,
6212, Cons Cell and List Types, elisp, The GNU Emacs Lisp Reference
6213Manual}.)
6214
6215The @code{"P"} in the @code{interactive} expression tells Emacs to
6216pass a prefix argument, if there is one, to the function in raw form.
6217A prefix argument is made by typing the @key{META} key followed by a
6218number, or by typing @kbd{C-u} and then a number. (If you don't type
6219a number, @kbd{C-u} defaults to a cons cell with a 4. A lowercase
6220@code{"p"} in the @code{interactive} expression causes the function to
6221convert a prefix arg to a number.)
6222
6223The true-or-false-test of the @code{if} expression looks complex, but
6224it is not: it checks whether @code{arg} has a value that is not
6225@code{nil} and whether it is a cons cell. (That is what @code{consp}
6226does; it checks whether its argument is a cons cell.) If @code{arg}
6227has a value that is not @code{nil} (and is not a cons cell), which
6228will be the case if @code{beginning-of-buffer} is called with a
6229numeric argument, then this true-or-false-test will return true and
6230the then-part of the @code{if} expression will be evaluated. On the
6231other hand, if @code{beginning-of-buffer} is not called with an
6232argument, the value of @code{arg} will be @code{nil} and the else-part
6233of the @code{if} expression will be evaluated. The else-part is
6234simply @code{point-min}, and when this is the outcome, the whole
6235@code{goto-char} expression is @code{(goto-char (point-min))}, which
6236is how we saw the @code{beginning-of-buffer} function in its
6237simplified form.
6238
6239@node beginning-of-buffer opt arg, beginning-of-buffer complete, Optional Arguments, beginning-of-buffer
6240@subsection @code{beginning-of-buffer} with an Argument
6241
6242When @code{beginning-of-buffer} is called with an argument, an
6243expression is evaluated which calculates what value to pass to
6244@code{goto-char}. This expression is rather complicated at first sight.
6245It includes an inner @code{if} expression and much arithmetic. It looks
6246like this:
6247
6248@smallexample
6249@group
6250(if (> (buffer-size) 10000)
6251 ;; @r{Avoid overflow for large buffer sizes!}
6252 (* (prefix-numeric-value arg)
6253 (/ size 10))
6254 (/
6255 (+ 10
6256 (*
6257 size (prefix-numeric-value arg))) 10)))
6258@end group
6259@end smallexample
6260
6261@menu
6262* Disentangle beginning-of-buffer::
6263* Large buffer case::
6264* Small buffer case::
6265@end menu
6266
6267@node Disentangle beginning-of-buffer, Large buffer case, beginning-of-buffer opt arg, beginning-of-buffer opt arg
6268@ifnottex
6269@unnumberedsubsubsec Disentangle @code{beginning-of-buffer}
6270@end ifnottex
6271
6272Like other complex-looking expressions, the conditional expression
6273within @code{beginning-of-buffer} can be disentangled by looking at it
6274as parts of a template, in this case, the template for an if-then-else
6275expression. In skeletal form, the expression looks like this:
6276
6277@smallexample
6278@group
6279(if (@var{buffer-is-large}
6280 @var{divide-buffer-size-by-10-and-multiply-by-arg}
6281 @var{else-use-alternate-calculation}
6282@end group
6283@end smallexample
6284
6285The true-or-false-test of this inner @code{if} expression checks the
6286size of the buffer. The reason for this is that the old version 18
6287Emacs used numbers that are no bigger than eight million or so and in
6288the computation that followed, the programmer feared that Emacs might
6289try to use over-large numbers if the buffer were large. The term
6290`overflow', mentioned in the comment, means numbers that are over
6291large. More recent versions of Emacs use larger numbers, but this
6292code has not been touched, if only because people now look at buffers
6293that are far, far larger than ever before.
6294
6295There are two cases: if the buffer is large and if it is not.
6296
6297@node Large buffer case, Small buffer case, Disentangle beginning-of-buffer, beginning-of-buffer opt arg
6298@comment node-name, next, previous, up
6299@unnumberedsubsubsec What happens in a large buffer
6300
6301In @code{beginning-of-buffer}, the inner @code{if} expression tests
6302whether the size of the buffer is greater than 10,000 characters. To do
6303this, it uses the @code{>} function and the computation of @code{size}
6304that comes from the let expression.
6305
6306In the old days, the function @code{buffer-size} was used. Not only
6307was that function called several times, it gave the size of the whole
6308buffer, not the accessible part. The computation makes much more
6309sense when it handles just the accessible part. (@xref{Narrowing &
6310Widening, , Narrowing and Widening}, for more information on focusing
6311attention to an `accessible' part.)
6312
6313@need 800
6314The line looks like this:
6315
6316@smallexample
6317(if (> size 10000)
6318@end smallexample
6319
6320@need 1200
6321@noindent
6322When the buffer is large, the then-part of the @code{if} expression is
6323evaluated. It reads like this (after formatting for easy reading):
6324
6325@smallexample
6326@group
6327(*
6328 (prefix-numeric-value arg)
6329 (/ size 10))
6330@end group
6331@end smallexample
6332
6333@noindent
6334This expression is a multiplication, with two arguments to the function
6335@code{*}.
6336
6337The first argument is @code{(prefix-numeric-value arg)}. When
6338@code{"P"} is used as the argument for @code{interactive}, the value
6339passed to the function as its argument is passed a ``raw prefix
6340argument'', and not a number. (It is a number in a list.) To perform
6341the arithmetic, a conversion is necessary, and
6342@code{prefix-numeric-value} does the job.
6343
6344@findex / @r{(division)}
6345@cindex Division
6346The second argument is @code{(/ size 10)}. This expression divides
6347the numeric value by ten --- the numeric value of the size of the
6348accessible portion of the buffer. This produces a number that tells
6349how many characters make up one tenth of the buffer size. (In Lisp,
6350@code{/} is used for division, just as @code{*} is used for
6351multiplication.)
6352
6353@need 1200
6354In the multiplication expression as a whole, this amount is multiplied
6355by the value of the prefix argument---the multiplication looks like this:
6356
6357@smallexample
6358@group
6359(* @var{numeric-value-of-prefix-arg}
6360 @var{number-of-characters-in-one-tenth-of-the-accessible-buffer})
6361@end group
6362@end smallexample
6363
6364@noindent
6365If, for example, the prefix argument is @samp{7}, the one-tenth value
6366will be multiplied by 7 to give a position 70% of the way through.
6367
6368@need 1200
6369The result of all this is that if the accessible portion of the buffer
6370is large, the @code{goto-char} expression reads like this:
6371
6372@smallexample
6373@group
6374(goto-char (* (prefix-numeric-value arg)
6375 (/ size 10)))
6376@end group
6377@end smallexample
6378
6379This puts the cursor where we want it.
6380
6381@node Small buffer case, , Large buffer case, beginning-of-buffer opt arg
6382@comment node-name, next, previous, up
6383@unnumberedsubsubsec What happens in a small buffer
6384
6385If the buffer contains fewer than 10,000 characters, a slightly
6386different computation is performed. You might think this is not
6387necessary, since the first computation could do the job. However, in
6388a small buffer, the first method may not put the cursor on exactly the
6389desired line; the second method does a better job.
6390
6391@need 800
6392The code looks like this:
6393
6394@c Keep this on one line.
6395@smallexample
6396(/ (+ 10 (* size (prefix-numeric-value arg))) 10))
6397@end smallexample
6398
6399@need 1200
6400@noindent
6401This is code in which you figure out what happens by discovering how the
6402functions are embedded in parentheses. It is easier to read if you
6403reformat it with each expression indented more deeply than its
6404enclosing expression:
6405
6406@smallexample
6407@group
6408 (/
6409 (+ 10
6410 (*
6411 size
6412 (prefix-numeric-value arg)))
6413 10))
6414@end group
6415@end smallexample
6416
6417@need 1200
6418@noindent
6419Looking at parentheses, we see that the innermost operation is
6420@code{(prefix-numeric-value arg)}, which converts the raw argument to
6421a number. In the following expression, this number is multiplied by
6422the size of the accessible portion of the buffer:
6423
6424@smallexample
6425(* size (prefix-numeric-value arg))
6426@end smallexample
6427
6428@noindent
6429This multiplication creates a number that may be larger than the size of
6430the buffer---seven times larger if the argument is 7, for example. Ten
6431is then added to this number and finally the large number is divided by
6432ten to provide a value that is one character larger than the percentage
6433position in the buffer.
6434
6435The number that results from all this is passed to @code{goto-char} and
6436the cursor is moved to that point.
6437
6438@need 1500
6439@node beginning-of-buffer complete, , beginning-of-buffer opt arg, beginning-of-buffer
6440@comment node-name, next, previous, up
6441@subsection The Complete @code{beginning-of-buffer}
6442
6443@need 1000
6444Here is the complete text of the @code{beginning-of-buffer} function:
6445@sp 1
6446
6447@c In GNU Emacs 22
6448@smallexample
6449@group
6450(defun beginning-of-buffer (&optional arg)
6451 "Move point to the beginning of the buffer;
6452leave mark at previous position.
6453With \\[universal-argument] prefix,
6454do not set mark at previous position.
6455With numeric arg N,
6456put point N/10 of the way from the beginning.
6457
6458If the buffer is narrowed,
6459this command uses the beginning and size
6460of the accessible part of the buffer.
6461@end group
6462
6463@group
6464Don't use this command in Lisp programs!
6465\(goto-char (point-min)) is faster
6466and avoids clobbering the mark."
6467 (interactive "P")
6468 (or (consp arg)
6469 (and transient-mark-mode mark-active)
6470 (push-mark))
6471@end group
6472@group
6473 (let ((size (- (point-max) (point-min))))
6474 (goto-char (if (and arg (not (consp arg)))
6475 (+ (point-min)
6476 (if (> size 10000)
6477 ;; Avoid overflow for large buffer sizes!
6478 (* (prefix-numeric-value arg)
6479 (/ size 10))
a9097c6d
KB
6480 (/ (+ 10 (* size (prefix-numeric-value arg)))
6481 10)))
8cda6f8f
GM
6482 (point-min))))
6483 (if arg (forward-line 1)))
6484@end group
6485@end smallexample
6486
6487@ignore
6488From before GNU Emacs 22
6489@smallexample
6490@group
6491(defun beginning-of-buffer (&optional arg)
6492 "Move point to the beginning of the buffer;
6493leave mark at previous position.
6494With arg N, put point N/10 of the way
6495from the true beginning.
6496@end group
6497@group
6498Don't use this in Lisp programs!
6499\(goto-char (point-min)) is faster
6500and does not set the mark."
6501 (interactive "P")
6502 (push-mark)
6503@end group
6504@group
6505 (goto-char
6506 (if arg
6507 (if (> (buffer-size) 10000)
6508 ;; @r{Avoid overflow for large buffer sizes!}
6509 (* (prefix-numeric-value arg)
6510 (/ (buffer-size) 10))
6511@end group
6512@group
6513 (/ (+ 10 (* (buffer-size)
6514 (prefix-numeric-value arg)))
6515 10))
6516 (point-min)))
6517 (if arg (forward-line 1)))
6518@end group
6519@end smallexample
6520@end ignore
6521
6522@noindent
6523Except for two small points, the previous discussion shows how this
6524function works. The first point deals with a detail in the
6525documentation string, and the second point concerns the last line of
6526the function.
6527
6528@need 800
6529In the documentation string, there is reference to an expression:
6530
6531@smallexample
6532\\[universal-argument]
6533@end smallexample
6534
6535@noindent
6536A @samp{\\} is used before the first square bracket of this
6537expression. This @samp{\\} tells the Lisp interpreter to substitute
6538whatever key is currently bound to the @samp{[@dots{}]}. In the case
6539of @code{universal-argument}, that is usually @kbd{C-u}, but it might
6540be different. (@xref{Documentation Tips, , Tips for Documentation
6541Strings, elisp, The GNU Emacs Lisp Reference Manual}, for more
6542information.)
6543
6544@need 1200
6545Finally, the last line of the @code{beginning-of-buffer} command says
6546to move point to the beginning of the next line if the command is
6547invoked with an argument:
6548
6549@smallexample
6550(if arg (forward-line 1)))
6551@end smallexample
6552
6553@noindent
6554This puts the cursor at the beginning of the first line after the
6555appropriate tenths position in the buffer. This is a flourish that
6556means that the cursor is always located @emph{at least} the requested
6557tenths of the way through the buffer, which is a nicety that is,
6558perhaps, not necessary, but which, if it did not occur, would be sure
6559to draw complaints.
6560
6561On the other hand, it also means that if you specify the command with
6562a @kbd{C-u}, but without a number, that is to say, if the `raw prefix
6563argument' is simply a cons cell, then the command puts you at the
6564beginning of the second line @dots{} I don't know whether this is
6565intended or whether no one has dealt with the code to avoid this
6566happening.
6567
6568@node Second Buffer Related Review, optional Exercise, beginning-of-buffer, More Complex
6569@comment node-name, next, previous, up
6570@section Review
6571
6572Here is a brief summary of some of the topics covered in this chapter.
6573
6574@table @code
6575@item or
6576Evaluate each argument in sequence, and return the value of the first
6577argument that is not @code{nil}; if none return a value that is not
6578@code{nil}, return @code{nil}. In brief, return the first true value
6579of the arguments; return a true value if one @emph{or} any of the
6580others are true.
6581
6582@item and
6583Evaluate each argument in sequence, and if any are @code{nil}, return
6584@code{nil}; if none are @code{nil}, return the value of the last
6585argument. In brief, return a true value only if all the arguments are
6586true; return a true value if one @emph{and} each of the others is
6587true.
6588
6589@item &optional
6590A keyword used to indicate that an argument to a function definition
6591is optional; this means that the function can be evaluated without the
6592argument, if desired.
6593
6594@item prefix-numeric-value
6595Convert the `raw prefix argument' produced by @code{(interactive
6596"P")} to a numeric value.
6597
6598@item forward-line
6599Move point forward to the beginning of the next line, or if the argument
6600is greater than one, forward that many lines. If it can't move as far
6601forward as it is supposed to, @code{forward-line} goes forward as far as
6602it can and then returns a count of the number of additional lines it was
6603supposed to move but couldn't.
6604
6605@item erase-buffer
6606Delete the entire contents of the current buffer.
6607
6608@item bufferp
6609Return @code{t} if its argument is a buffer; otherwise return @code{nil}.
6610@end table
6611
6612@node optional Exercise, , Second Buffer Related Review, More Complex
6613@section @code{optional} Argument Exercise
6614
6615Write an interactive function with an optional argument that tests
6616whether its argument, a number, is greater than or equal to, or else,
6617less than the value of @code{fill-column}, and tells you which, in a
6618message. However, if you do not pass an argument to the function, use
661956 as a default value.
6620
6621@node Narrowing & Widening, car cdr & cons, More Complex, Top
6622@comment node-name, next, previous, up
6623@chapter Narrowing and Widening
6624@cindex Focusing attention (narrowing)
6625@cindex Narrowing
6626@cindex Widening
6627
6628Narrowing is a feature of Emacs that makes it possible for you to focus
6629on a specific part of a buffer, and work without accidentally changing
6630other parts. Narrowing is normally disabled since it can confuse
6631novices.
6632
6633@menu
6634* Narrowing advantages:: The advantages of narrowing
6635* save-restriction:: The @code{save-restriction} special form.
6636* what-line:: The number of the line that point is on.
6637* narrow Exercise::
6638@end menu
6639
6640@node Narrowing advantages, save-restriction, Narrowing & Widening, Narrowing & Widening
6641@ifnottex
6642@unnumberedsec The Advantages of Narrowing
6643@end ifnottex
6644
6645With narrowing, the rest of a buffer is made invisible, as if it weren't
6646there. This is an advantage if, for example, you want to replace a word
6647in one part of a buffer but not in another: you narrow to the part you want
6648and the replacement is carried out only in that section, not in the rest
6649of the buffer. Searches will only work within a narrowed region, not
6650outside of one, so if you are fixing a part of a document, you can keep
6651yourself from accidentally finding parts you do not need to fix by
6652narrowing just to the region you want.
6653(The key binding for @code{narrow-to-region} is @kbd{C-x n n}.)
6654
6655However, narrowing does make the rest of the buffer invisible, which
6656can scare people who inadvertently invoke narrowing and think they
6657have deleted a part of their file. Moreover, the @code{undo} command
6658(which is usually bound to @kbd{C-x u}) does not turn off narrowing
6659(nor should it), so people can become quite desperate if they do not
6660know that they can return the rest of a buffer to visibility with the
6661@code{widen} command.
6662(The key binding for @code{widen} is @kbd{C-x n w}.)
6663
6664Narrowing is just as useful to the Lisp interpreter as to a human.
6665Often, an Emacs Lisp function is designed to work on just part of a
6666buffer; or conversely, an Emacs Lisp function needs to work on all of a
6667buffer that has been narrowed. The @code{what-line} function, for
6668example, removes the narrowing from a buffer, if it has any narrowing
6669and when it has finished its job, restores the narrowing to what it was.
6670On the other hand, the @code{count-lines} function, which is called by
6671@code{what-line}, uses narrowing to restrict itself to just that portion
6672of the buffer in which it is interested and then restores the previous
6673situation.
6674
6675@node save-restriction, what-line, Narrowing advantages, Narrowing & Widening
6676@comment node-name, next, previous, up
6677@section The @code{save-restriction} Special Form
6678@findex save-restriction
6679
6680In Emacs Lisp, you can use the @code{save-restriction} special form to
6681keep track of whatever narrowing is in effect, if any. When the Lisp
6682interpreter meets with @code{save-restriction}, it executes the code
6683in the body of the @code{save-restriction} expression, and then undoes
6684any changes to narrowing that the code caused. If, for example, the
6685buffer is narrowed and the code that follows @code{save-restriction}
6686gets rid of the narrowing, @code{save-restriction} returns the buffer
6687to its narrowed region afterwards. In the @code{what-line} command,
6688any narrowing the buffer may have is undone by the @code{widen}
6689command that immediately follows the @code{save-restriction} command.
6690Any original narrowing is restored just before the completion of the
6691function.
6692
6693@need 1250
6694The template for a @code{save-restriction} expression is simple:
6695
6696@smallexample
6697@group
6698(save-restriction
6699 @var{body}@dots{} )
6700@end group
6701@end smallexample
6702
6703@noindent
6704The body of the @code{save-restriction} is one or more expressions that
6705will be evaluated in sequence by the Lisp interpreter.
6706
6707Finally, a point to note: when you use both @code{save-excursion} and
6708@code{save-restriction}, one right after the other, you should use
6709@code{save-excursion} outermost. If you write them in reverse order,
6710you may fail to record narrowing in the buffer to which Emacs switches
6711after calling @code{save-excursion}. Thus, when written together,
6712@code{save-excursion} and @code{save-restriction} should be written
6713like this:
6714
6715@smallexample
6716@group
6717(save-excursion
6718 (save-restriction
6719 @var{body}@dots{}))
6720@end group
6721@end smallexample
6722
6723In other circumstances, when not written together, the
6724@code{save-excursion} and @code{save-restriction} special forms must
6725be written in the order appropriate to the function.
6726
6727@need 1250
6728For example,
6729
6730@smallexample
6731@group
6732 (save-restriction
6733 (widen)
6734 (save-excursion
6735 @var{body}@dots{}))
6736@end group
6737@end smallexample
6738
6739@ignore
6740Emacs 22
6741/usr/local/src/emacs/lisp/simple.el
6742
6743(defun what-line ()
6744 "Print the current buffer line number and narrowed line number of point."
6745 (interactive)
6746 (let ((start (point-min))
6747 (n (line-number-at-pos)))
6748 (if (= start 1)
6749 (message "Line %d" n)
6750 (save-excursion
6751 (save-restriction
6752 (widen)
6753 (message "line %d (narrowed line %d)"
6754 (+ n (line-number-at-pos start) -1) n))))))
6755
6756(defun line-number-at-pos (&optional pos)
6757 "Return (narrowed) buffer line number at position POS.
6758If POS is nil, use current buffer location.
6759Counting starts at (point-min), so the value refers
6760to the contents of the accessible portion of the buffer."
6761 (let ((opoint (or pos (point))) start)
6762 (save-excursion
6763 (goto-char (point-min))
6764 (setq start (point))
6765 (goto-char opoint)
6766 (forward-line 0)
6767 (1+ (count-lines start (point))))))
6768
6769(defun count-lines (start end)
6770 "Return number of lines between START and END.
6771This is usually the number of newlines between them,
6772but can be one more if START is not equal to END
6773and the greater of them is not at the start of a line."
6774 (save-excursion
6775 (save-restriction
6776 (narrow-to-region start end)
6777 (goto-char (point-min))
6778 (if (eq selective-display t)
6779 (save-match-data
6780 (let ((done 0))
6781 (while (re-search-forward "[\n\C-m]" nil t 40)
6782 (setq done (+ 40 done)))
6783 (while (re-search-forward "[\n\C-m]" nil t 1)
6784 (setq done (+ 1 done)))
6785 (goto-char (point-max))
6786 (if (and (/= start end)
6787 (not (bolp)))
6788 (1+ done)
6789 done)))
6790 (- (buffer-size) (forward-line (buffer-size)))))))
6791@end ignore
6792
6793@node what-line, narrow Exercise, save-restriction, Narrowing & Widening
6794@comment node-name, next, previous, up
6795@section @code{what-line}
6796@findex what-line
6797@cindex Widening, example of
6798
6799The @code{what-line} command tells you the number of the line in which
6800the cursor is located. The function illustrates the use of the
6801@code{save-restriction} and @code{save-excursion} commands. Here is the
6802original text of the function:
6803
6804@smallexample
6805@group
6806(defun what-line ()
6807 "Print the current line number (in the buffer) of point."
6808 (interactive)
6809 (save-restriction
6810 (widen)
6811 (save-excursion
6812 (beginning-of-line)
6813 (message "Line %d"
6814 (1+ (count-lines 1 (point)))))))
6815@end group
6816@end smallexample
6817
6818(In recent versions of GNU Emacs, the @code{what-line} function has
6819been expanded to tell you your line number in a narrowed buffer as
6820well as your line number in a widened buffer. The recent version is
6821more complex than the version shown here. If you feel adventurous,
6822you might want to look at it after figuring out how this version
6823works. You will probably need to use @kbd{C-h f}
6824(@code{describe-function}). The newer version uses a conditional to
6825determine whether the buffer has been narrowed.
6826
6827(Also, it uses @code{line-number-at-pos}, which among other simple
6828expressions, such as @code{(goto-char (point-min))}, moves point to
6829the beginning of the current line with @code{(forward-line 0)} rather
6830than @code{beginning-of-line}.)
6831
6832The @code{what-line} function as shown here has a documentation line
6833and is interactive, as you would expect. The next two lines use the
6834functions @code{save-restriction} and @code{widen}.
6835
6836The @code{save-restriction} special form notes whatever narrowing is in
6837effect, if any, in the current buffer and restores that narrowing after
6838the code in the body of the @code{save-restriction} has been evaluated.
6839
6840The @code{save-restriction} special form is followed by @code{widen}.
6841This function undoes any narrowing the current buffer may have had
6842when @code{what-line} was called. (The narrowing that was there is
6843the narrowing that @code{save-restriction} remembers.) This widening
6844makes it possible for the line counting commands to count from the
6845beginning of the buffer. Otherwise, they would have been limited to
6846counting within the accessible region. Any original narrowing is
6847restored just before the completion of the function by the
6848@code{save-restriction} special form.
6849
6850The call to @code{widen} is followed by @code{save-excursion}, which
6851saves the location of the cursor (i.e., of point) and of the mark, and
6852restores them after the code in the body of the @code{save-excursion}
6853uses the @code{beginning-of-line} function to move point.
6854
6855(Note that the @code{(widen)} expression comes between the
6856@code{save-restriction} and @code{save-excursion} special forms. When
6857you write the two @code{save- @dots{}} expressions in sequence, write
6858@code{save-excursion} outermost.)
6859
6860@need 1200
6861The last two lines of the @code{what-line} function are functions to
6862count the number of lines in the buffer and then print the number in the
6863echo area.
6864
6865@smallexample
6866@group
6867(message "Line %d"
6868 (1+ (count-lines 1 (point)))))))
6869@end group
6870@end smallexample
6871
6872The @code{message} function prints a one-line message at the bottom of
6873the Emacs screen. The first argument is inside of quotation marks and
6874is printed as a string of characters. However, it may contain a
6875@samp{%d} expression to print a following argument. @samp{%d} prints
6876the argument as a decimal, so the message will say something such as
6877@samp{Line 243}.
6878
6879@need 1200
6880The number that is printed in place of the @samp{%d} is computed by the
6881last line of the function:
6882
6883@smallexample
6884(1+ (count-lines 1 (point)))
6885@end smallexample
6886
6887@ignore
6888GNU Emacs 22
6889
6890(defun count-lines (start end)
6891 "Return number of lines between START and END.
6892This is usually the number of newlines between them,
6893but can be one more if START is not equal to END
6894and the greater of them is not at the start of a line."
6895 (save-excursion
6896 (save-restriction
6897 (narrow-to-region start end)
6898 (goto-char (point-min))
6899 (if (eq selective-display t)
6900 (save-match-data
6901 (let ((done 0))
6902 (while (re-search-forward "[\n\C-m]" nil t 40)
6903 (setq done (+ 40 done)))
6904 (while (re-search-forward "[\n\C-m]" nil t 1)
6905 (setq done (+ 1 done)))
6906 (goto-char (point-max))
6907 (if (and (/= start end)
6908 (not (bolp)))
6909 (1+ done)
6910 done)))
6911 (- (buffer-size) (forward-line (buffer-size)))))))
6912@end ignore
6913
6914@noindent
6915What this does is count the lines from the first position of the
6916buffer, indicated by the @code{1}, up to @code{(point)}, and then add
6917one to that number. (The @code{1+} function adds one to its
6918argument.) We add one to it because line 2 has only one line before
6919it, and @code{count-lines} counts only the lines @emph{before} the
6920current line.
6921
6922After @code{count-lines} has done its job, and the message has been
6923printed in the echo area, the @code{save-excursion} restores point and
6924mark to their original positions; and @code{save-restriction} restores
6925the original narrowing, if any.
6926
6927@node narrow Exercise, , what-line, Narrowing & Widening
6928@section Exercise with Narrowing
6929
6930Write a function that will display the first 60 characters of the
6931current buffer, even if you have narrowed the buffer to its latter
6932half so that the first line is inaccessible. Restore point, mark, and
6933narrowing. For this exercise, you need to use a whole potpourri of
6934functions, including @code{save-restriction}, @code{widen},
6935@code{goto-char}, @code{point-min}, @code{message}, and
6936@code{buffer-substring}.
6937
6938@cindex Properties, mention of @code{buffer-substring-no-properties}
6939(@code{buffer-substring} is a previously unmentioned function you will
6940have to investigate yourself; or perhaps you will have to use
6941@code{buffer-substring-no-properties} or
6942@code{filter-buffer-substring} @dots{}, yet other functions. Text
6943properties are a feature otherwise not discussed here. @xref{Text
6944Properties, , Text Properties, elisp, The GNU Emacs Lisp Reference
6945Manual}.)
6946
6947Additionally, do you really need @code{goto-char} or @code{point-min}?
6948Or can you write the function without them?
6949
6950@node car cdr & cons, Cutting & Storing Text, Narrowing & Widening, Top
6951@comment node-name, next, previous, up
6952@chapter @code{car}, @code{cdr}, @code{cons}: Fundamental Functions
6953@findex car, @r{introduced}
6954@findex cdr, @r{introduced}
6955
6956In Lisp, @code{car}, @code{cdr}, and @code{cons} are fundamental
6957functions. The @code{cons} function is used to construct lists, and
6958the @code{car} and @code{cdr} functions are used to take them apart.
6959
6960In the walk through of the @code{copy-region-as-kill} function, we
6961will see @code{cons} as well as two variants on @code{cdr},
6962namely, @code{setcdr} and @code{nthcdr}. (@xref{copy-region-as-kill}.)
6963
6964@menu
6965* Strange Names:: An historical aside: why the strange names?
6966* car & cdr:: Functions for extracting part of a list.
6967* cons:: Constructing a list.
6968* nthcdr:: Calling @code{cdr} repeatedly.
6969* nth::
6970* setcar:: Changing the first element of a list.
6971* setcdr:: Changing the rest of a list.
6972* cons Exercise::
6973@end menu
6974
6975@node Strange Names, car & cdr, car cdr & cons, car cdr & cons
6976@ifnottex
6977@unnumberedsec Strange Names
6978@end ifnottex
6979
6980The name of the @code{cons} function is not unreasonable: it is an
6981abbreviation of the word `construct'. The origins of the names for
6982@code{car} and @code{cdr}, on the other hand, are esoteric: @code{car}
6983is an acronym from the phrase `Contents of the Address part of the
6984Register'; and @code{cdr} (pronounced `could-er') is an acronym from
6985the phrase `Contents of the Decrement part of the Register'. These
6986phrases refer to specific pieces of hardware on the very early
6987computer on which the original Lisp was developed. Besides being
6988obsolete, the phrases have been completely irrelevant for more than 25
6989years to anyone thinking about Lisp. Nonetheless, although a few
6990brave scholars have begun to use more reasonable names for these
6991functions, the old terms are still in use. In particular, since the
6992terms are used in the Emacs Lisp source code, we will use them in this
6993introduction.
6994
6995@node car & cdr, cons, Strange Names, car cdr & cons
6996@comment node-name, next, previous, up
6997@section @code{car} and @code{cdr}
6998
6999The @sc{car} of a list is, quite simply, the first item in the list.
7000Thus the @sc{car} of the list @code{(rose violet daisy buttercup)} is
7001@code{rose}.
7002
7003@need 1200
7004If you are reading this in Info in GNU Emacs, you can see this by
7005evaluating the following:
7006
7007@smallexample
7008(car '(rose violet daisy buttercup))
7009@end smallexample
7010
7011@noindent
7012After evaluating the expression, @code{rose} will appear in the echo
7013area.
7014
7015Clearly, a more reasonable name for the @code{car} function would be
7016@code{first} and this is often suggested.
7017
7018@code{car} does not remove the first item from the list; it only reports
7019what it is. After @code{car} has been applied to a list, the list is
7020still the same as it was. In the jargon, @code{car} is
7021`non-destructive'. This feature turns out to be important.
7022
7023The @sc{cdr} of a list is the rest of the list, that is, the
7024@code{cdr} function returns the part of the list that follows the
7025first item. Thus, while the @sc{car} of the list @code{'(rose violet
7026daisy buttercup)} is @code{rose}, the rest of the list, the value
7027returned by the @code{cdr} function, is @code{(violet daisy
7028buttercup)}.
7029
7030@need 800
7031You can see this by evaluating the following in the usual way:
7032
7033@smallexample
7034(cdr '(rose violet daisy buttercup))
7035@end smallexample
7036
7037@noindent
7038When you evaluate this, @code{(violet daisy buttercup)} will appear in
7039the echo area.
7040
7041Like @code{car}, @code{cdr} does not remove any elements from the
7042list---it just returns a report of what the second and subsequent
7043elements are.
7044
7045Incidentally, in the example, the list of flowers is quoted. If it were
7046not, the Lisp interpreter would try to evaluate the list by calling
7047@code{rose} as a function. In this example, we do not want to do that.
7048
7049Clearly, a more reasonable name for @code{cdr} would be @code{rest}.
7050
7051(There is a lesson here: when you name new functions, consider very
7052carefully what you are doing, since you may be stuck with the names
7053for far longer than you expect. The reason this document perpetuates
7054these names is that the Emacs Lisp source code uses them, and if I did
7055not use them, you would have a hard time reading the code; but do,
7056please, try to avoid using these terms yourself. The people who come
7057after you will be grateful to you.)
7058
7059When @code{car} and @code{cdr} are applied to a list made up of symbols,
7060such as the list @code{(pine fir oak maple)}, the element of the list
7061returned by the function @code{car} is the symbol @code{pine} without
7062any parentheses around it. @code{pine} is the first element in the
7063list. However, the @sc{cdr} of the list is a list itself, @code{(fir
7064oak maple)}, as you can see by evaluating the following expressions in
7065the usual way:
7066
7067@smallexample
7068@group
7069(car '(pine fir oak maple))
7070
7071(cdr '(pine fir oak maple))
7072@end group
7073@end smallexample
7074
7075On the other hand, in a list of lists, the first element is itself a
7076list. @code{car} returns this first element as a list. For example,
7077the following list contains three sub-lists, a list of carnivores, a
7078list of herbivores and a list of sea mammals:
7079
7080@smallexample
7081@group
7082(car '((lion tiger cheetah)
7083 (gazelle antelope zebra)
7084 (whale dolphin seal)))
7085@end group
7086@end smallexample
7087
7088@noindent
7089In this example, the first element or @sc{car} of the list is the list of
7090carnivores, @code{(lion tiger cheetah)}, and the rest of the list is
7091@code{((gazelle antelope zebra) (whale dolphin seal))}.
7092
7093@smallexample
7094@group
7095(cdr '((lion tiger cheetah)
7096 (gazelle antelope zebra)
7097 (whale dolphin seal)))
7098@end group
7099@end smallexample
7100
7101It is worth saying again that @code{car} and @code{cdr} are
7102non-destructive---that is, they do not modify or change lists to which
7103they are applied. This is very important for how they are used.
7104
7105Also, in the first chapter, in the discussion about atoms, I said that
7106in Lisp, ``certain kinds of atom, such as an array, can be separated
7107into parts; but the mechanism for doing this is different from the
7108mechanism for splitting a list. As far as Lisp is concerned, the
7109atoms of a list are unsplittable.'' (@xref{Lisp Atoms}.) The
7110@code{car} and @code{cdr} functions are used for splitting lists and
7111are considered fundamental to Lisp. Since they cannot split or gain
7112access to the parts of an array, an array is considered an atom.
7113Conversely, the other fundamental function, @code{cons}, can put
7114together or construct a list, but not an array. (Arrays are handled
7115by array-specific functions. @xref{Arrays, , Arrays, elisp, The GNU
7116Emacs Lisp Reference Manual}.)
7117
7118@node cons, nthcdr, car & cdr, car cdr & cons
7119@comment node-name, next, previous, up
7120@section @code{cons}
7121@findex cons, @r{introduced}
7122
7123The @code{cons} function constructs lists; it is the inverse of
7124@code{car} and @code{cdr}. For example, @code{cons} can be used to make
7125a four element list from the three element list, @code{(fir oak maple)}:
7126
7127@smallexample
7128(cons 'pine '(fir oak maple))
7129@end smallexample
7130
7131@need 800
7132@noindent
7133After evaluating this list, you will see
7134
7135@smallexample
7136(pine fir oak maple)
7137@end smallexample
7138
7139@noindent
7140appear in the echo area. @code{cons} causes the creation of a new
7141list in which the element is followed by the elements of the original
7142list.
7143
7144We often say that `@code{cons} puts a new element at the beginning of
7145a list; it attaches or pushes elements onto the list', but this
7146phrasing can be misleading, since @code{cons} does not change an
7147existing list, but creates a new one.
7148
7149Like @code{car} and @code{cdr}, @code{cons} is non-destructive.
7150
7151@menu
7152* Build a list::
7153* length:: How to find the length of a list.
7154@end menu
7155
7156@node Build a list, length, cons, cons
7157@ifnottex
7158@unnumberedsubsec Build a list
7159@end ifnottex
7160
7161@code{cons} must have a list to attach to.@footnote{Actually, you can
7162@code{cons} an element to an atom to produce a dotted pair. Dotted
7163pairs are not discussed here; see @ref{Dotted Pair Notation, , Dotted
7164Pair Notation, elisp, The GNU Emacs Lisp Reference Manual}.} You
7165cannot start from absolutely nothing. If you are building a list, you
7166need to provide at least an empty list at the beginning. Here is a
7167series of @code{cons} expressions that build up a list of flowers. If
7168you are reading this in Info in GNU Emacs, you can evaluate each of
7169the expressions in the usual way; the value is printed in this text
7170after @samp{@result{}}, which you may read as `evaluates to'.
7171
7172@smallexample
7173@group
7174(cons 'buttercup ())
7175 @result{} (buttercup)
7176@end group
7177
7178@group
7179(cons 'daisy '(buttercup))
7180 @result{} (daisy buttercup)
7181@end group
7182
7183@group
7184(cons 'violet '(daisy buttercup))
7185 @result{} (violet daisy buttercup)
7186@end group
7187
7188@group
7189(cons 'rose '(violet daisy buttercup))
7190 @result{} (rose violet daisy buttercup)
7191@end group
7192@end smallexample
7193
7194@noindent
7195In the first example, the empty list is shown as @code{()} and a list
7196made up of @code{buttercup} followed by the empty list is constructed.
7197As you can see, the empty list is not shown in the list that was
7198constructed. All that you see is @code{(buttercup)}. The empty list is
7199not counted as an element of a list because there is nothing in an empty
7200list. Generally speaking, an empty list is invisible.
7201
7202The second example, @code{(cons 'daisy '(buttercup))} constructs a new,
7203two element list by putting @code{daisy} in front of @code{buttercup};
7204and the third example constructs a three element list by putting
7205@code{violet} in front of @code{daisy} and @code{buttercup}.
7206
7207@node length, , Build a list, cons
7208@comment node-name, next, previous, up
7209@subsection Find the Length of a List: @code{length}
7210@findex length
7211
7212You can find out how many elements there are in a list by using the Lisp
7213function @code{length}, as in the following examples:
7214
7215@smallexample
7216@group
7217(length '(buttercup))
7218 @result{} 1
7219@end group
7220
7221@group
7222(length '(daisy buttercup))
7223 @result{} 2
7224@end group
7225
7226@group
7227(length (cons 'violet '(daisy buttercup)))
7228 @result{} 3
7229@end group
7230@end smallexample
7231
7232@noindent
7233In the third example, the @code{cons} function is used to construct a
7234three element list which is then passed to the @code{length} function as
7235its argument.
7236
7237@need 1200
7238We can also use @code{length} to count the number of elements in an
7239empty list:
7240
7241@smallexample
7242@group
7243(length ())
7244 @result{} 0
7245@end group
7246@end smallexample
7247
7248@noindent
7249As you would expect, the number of elements in an empty list is zero.
7250
7251An interesting experiment is to find out what happens if you try to find
7252the length of no list at all; that is, if you try to call @code{length}
7253without giving it an argument, not even an empty list:
7254
7255@smallexample
7256(length )
7257@end smallexample
7258
7259@need 800
7260@noindent
7261What you see, if you evaluate this, is the error message
7262
7263@smallexample
7264Lisp error: (wrong-number-of-arguments length 0)
7265@end smallexample
7266
7267@noindent
7268This means that the function receives the wrong number of
7269arguments, zero, when it expects some other number of arguments. In
7270this case, one argument is expected, the argument being a list whose
7271length the function is measuring. (Note that @emph{one} list is
7272@emph{one} argument, even if the list has many elements inside it.)
7273
7274The part of the error message that says @samp{length} is the name of
7275the function.
7276
7277@ignore
7278@code{length} is still a subroutine, but you need C-h f to discover that.
7279
7280In an earlier version:
7281 This is written with a special notation, @samp{#<subr},
7282 that indicates that the function @code{length} is one of the primitive
7283 functions written in C rather than in Emacs Lisp. (@samp{subr} is an
7284 abbreviation for `subroutine'.) @xref{What Is a Function, , What Is a
7285 Function?, elisp , The GNU Emacs Lisp Reference Manual}, for more
7286 about subroutines.
7287@end ignore
7288
7289@node nthcdr, nth, cons, car cdr & cons
7290@comment node-name, next, previous, up
7291@section @code{nthcdr}
7292@findex nthcdr
7293
7294The @code{nthcdr} function is associated with the @code{cdr} function.
7295What it does is take the @sc{cdr} of a list repeatedly.
7296
7297If you take the @sc{cdr} of the list @code{(pine fir
7298oak maple)}, you will be returned the list @code{(fir oak maple)}. If you
7299repeat this on what was returned, you will be returned the list
7300@code{(oak maple)}. (Of course, repeated @sc{cdr}ing on the original
7301list will just give you the original @sc{cdr} since the function does
7302not change the list. You need to evaluate the @sc{cdr} of the
7303@sc{cdr} and so on.) If you continue this, eventually you will be
7304returned an empty list, which in this case, instead of being shown as
7305@code{()} is shown as @code{nil}.
7306
7307@need 1200
7308For review, here is a series of repeated @sc{cdr}s, the text following
7309the @samp{@result{}} shows what is returned.
7310
7311@smallexample
7312@group
7313(cdr '(pine fir oak maple))
7314 @result{}(fir oak maple)
7315@end group
7316
7317@group
7318(cdr '(fir oak maple))
7319 @result{} (oak maple)
7320@end group
7321
7322@group
7323(cdr '(oak maple))
7324 @result{}(maple)
7325@end group
7326
7327@group
7328(cdr '(maple))
7329 @result{} nil
7330@end group
7331
7332@group
7333(cdr 'nil)
7334 @result{} nil
7335@end group
7336
7337@group
7338(cdr ())
7339 @result{} nil
7340@end group
7341@end smallexample
7342
7343@need 1200
7344You can also do several @sc{cdr}s without printing the values in
7345between, like this:
7346
7347@smallexample
7348@group
7349(cdr (cdr '(pine fir oak maple)))
7350 @result{} (oak maple)
7351@end group
7352@end smallexample
7353
7354@noindent
7355In this example, the Lisp interpreter evaluates the innermost list first.
7356The innermost list is quoted, so it just passes the list as it is to the
7357innermost @code{cdr}. This @code{cdr} passes a list made up of the
7358second and subsequent elements of the list to the outermost @code{cdr},
7359which produces a list composed of the third and subsequent elements of
7360the original list. In this example, the @code{cdr} function is repeated
7361and returns a list that consists of the original list without its
7362first two elements.
7363
7364The @code{nthcdr} function does the same as repeating the call to
7365@code{cdr}. In the following example, the argument 2 is passed to the
7366function @code{nthcdr}, along with the list, and the value returned is
7367the list without its first two items, which is exactly the same
7368as repeating @code{cdr} twice on the list:
7369
7370@smallexample
7371@group
7372(nthcdr 2 '(pine fir oak maple))
7373 @result{} (oak maple)
7374@end group
7375@end smallexample
7376
7377@need 1200
7378Using the original four element list, we can see what happens when
7379various numeric arguments are passed to @code{nthcdr}, including 0, 1,
7380and 5:
7381
7382@smallexample
7383@group
7384;; @r{Leave the list as it was.}
7385(nthcdr 0 '(pine fir oak maple))
7386 @result{} (pine fir oak maple)
7387@end group
7388
7389@group
7390;; @r{Return a copy without the first element.}
7391(nthcdr 1 '(pine fir oak maple))
7392 @result{} (fir oak maple)
7393@end group
7394
7395@group
7396;; @r{Return a copy of the list without three elements.}
7397(nthcdr 3 '(pine fir oak maple))
7398 @result{} (maple)
7399@end group
7400
7401@group
7402;; @r{Return a copy lacking all four elements.}
7403(nthcdr 4 '(pine fir oak maple))
7404 @result{} nil
7405@end group
7406
7407@group
7408;; @r{Return a copy lacking all elements.}
7409(nthcdr 5 '(pine fir oak maple))
7410 @result{} nil
7411@end group
7412@end smallexample
7413
7414@node nth, setcar, nthcdr, car cdr & cons
7415@comment node-name, next, previous, up
7416@section @code{nth}
7417@findex nth
7418
7419The @code{nthcdr} function takes the @sc{cdr} of a list repeatedly.
7420The @code{nth} function takes the @sc{car} of the result returned by
7421@code{nthcdr}. It returns the Nth element of the list.
7422
7423@need 1500
7424Thus, if it were not defined in C for speed, the definition of
7425@code{nth} would be:
7426
7427@smallexample
7428@group
7429(defun nth (n list)
7430 "Returns the Nth element of LIST.
7431N counts from zero. If LIST is not that long, nil is returned."
7432 (car (nthcdr n list)))
7433@end group
7434@end smallexample
7435
7436@noindent
7437(Originally, @code{nth} was defined in Emacs Lisp in @file{subr.el},
7438but its definition was redone in C in the 1980s.)
7439
7440The @code{nth} function returns a single element of a list.
7441This can be very convenient.
7442
7443Note that the elements are numbered from zero, not one. That is to
7444say, the first element of a list, its @sc{car} is the zeroth element.
7445This is called `zero-based' counting and often bothers people who
7446are accustomed to the first element in a list being number one, which
7447is `one-based'.
7448
7449@need 1250
7450For example:
7451
7452@smallexample
7453@group
7454(nth 0 '("one" "two" "three"))
7455 @result{} "one"
7456
7457(nth 1 '("one" "two" "three"))
7458 @result{} "two"
7459@end group
7460@end smallexample
7461
7462It is worth mentioning that @code{nth}, like @code{nthcdr} and
7463@code{cdr}, does not change the original list---the function is
7464non-destructive. This is in sharp contrast to the @code{setcar} and
7465@code{setcdr} functions.
7466
7467@node setcar, setcdr, nth, car cdr & cons
7468@comment node-name, next, previous, up
7469@section @code{setcar}
7470@findex setcar
7471
7472As you might guess from their names, the @code{setcar} and @code{setcdr}
7473functions set the @sc{car} or the @sc{cdr} of a list to a new value.
7474They actually change the original list, unlike @code{car} and @code{cdr}
7475which leave the original list as it was. One way to find out how this
7476works is to experiment. We will start with the @code{setcar} function.
7477
7478@need 1200
7479First, we can make a list and then set the value of a variable to the
7480list, using the @code{setq} function. Here is a list of animals:
7481
7482@smallexample
7483(setq animals '(antelope giraffe lion tiger))
7484@end smallexample
7485
7486@noindent
7487If you are reading this in Info inside of GNU Emacs, you can evaluate
7488this expression in the usual fashion, by positioning the cursor after
7489the expression and typing @kbd{C-x C-e}. (I'm doing this right here
7490as I write this. This is one of the advantages of having the
7491interpreter built into the computing environment. Incidentally, when
7492there is nothing on the line after the final parentheses, such as a
7493comment, point can be on the next line. Thus, if your cursor is in
7494the first column of the next line, you do not need to move it.
7495Indeed, Emacs permits any amount of white space after the final
7496parenthesis.)
7497
7498@need 1200
7499When we evaluate the variable @code{animals}, we see that it is bound to
7500the list @code{(antelope giraffe lion tiger)}:
7501
7502@smallexample
7503@group
7504animals
7505 @result{} (antelope giraffe lion tiger)
7506@end group
7507@end smallexample
7508
7509@noindent
7510Put another way, the variable @code{animals} points to the list
7511@code{(antelope giraffe lion tiger)}.
7512
7513Next, evaluate the function @code{setcar} while passing it two
7514arguments, the variable @code{animals} and the quoted symbol
7515@code{hippopotamus}; this is done by writing the three element list
7516@code{(setcar animals 'hippopotamus)} and then evaluating it in the
7517usual fashion:
7518
7519@smallexample
7520(setcar animals 'hippopotamus)
7521@end smallexample
7522
7523@need 1200
7524@noindent
7525After evaluating this expression, evaluate the variable @code{animals}
7526again. You will see that the list of animals has changed:
7527
7528@smallexample
7529@group
7530animals
7531 @result{} (hippopotamus giraffe lion tiger)
7532@end group
7533@end smallexample
7534
7535@noindent
7536The first element on the list, @code{antelope} is replaced by
7537@code{hippopotamus}.
7538
7539So we can see that @code{setcar} did not add a new element to the list
7540as @code{cons} would have; it replaced @code{antelope} with
7541@code{hippopotamus}; it @emph{changed} the list.
7542
7543@node setcdr, cons Exercise, setcar, car cdr & cons
7544@comment node-name, next, previous, up
7545@section @code{setcdr}
7546@findex setcdr
7547
7548The @code{setcdr} function is similar to the @code{setcar} function,
7549except that the function replaces the second and subsequent elements of
7550a list rather than the first element.
7551
7552(To see how to change the last element of a list, look ahead to
7553@ref{kill-new function, , The @code{kill-new} function}, which uses
7554the @code{nthcdr} and @code{setcdr} functions.)
7555
7556@need 1200
7557To see how this works, set the value of the variable to a list of
7558domesticated animals by evaluating the following expression:
7559
7560@smallexample
7561(setq domesticated-animals '(horse cow sheep goat))
7562@end smallexample
7563
7564@need 1200
7565@noindent
7566If you now evaluate the list, you will be returned the list
7567@code{(horse cow sheep goat)}:
7568
7569@smallexample
7570@group
7571domesticated-animals
7572 @result{} (horse cow sheep goat)
7573@end group
7574@end smallexample
7575
7576@need 1200
7577Next, evaluate @code{setcdr} with two arguments, the name of the
7578variable which has a list as its value, and the list to which the
7579@sc{cdr} of the first list will be set;
7580
7581@smallexample
7582(setcdr domesticated-animals '(cat dog))
7583@end smallexample
7584
7585@noindent
7586If you evaluate this expression, the list @code{(cat dog)} will appear
7587in the echo area. This is the value returned by the function. The
7588result we are interested in is the ``side effect'', which we can see by
7589evaluating the variable @code{domesticated-animals}:
7590
7591@smallexample
7592@group
7593domesticated-animals
7594 @result{} (horse cat dog)
7595@end group
7596@end smallexample
7597
7598@noindent
7599Indeed, the list is changed from @code{(horse cow sheep goat)} to
7600@code{(horse cat dog)}. The @sc{cdr} of the list is changed from
7601@code{(cow sheep goat)} to @code{(cat dog)}.
7602
7603@node cons Exercise, , setcdr, car cdr & cons
7604@section Exercise
7605
7606Construct a list of four birds by evaluating several expressions with
7607@code{cons}. Find out what happens when you @code{cons} a list onto
7608itself. Replace the first element of the list of four birds with a
7609fish. Replace the rest of that list with a list of other fish.
7610
7611@node Cutting & Storing Text, List Implementation, car cdr & cons, Top
7612@comment node-name, next, previous, up
7613@chapter Cutting and Storing Text
7614@cindex Cutting and storing text
7615@cindex Storing and cutting text
7616@cindex Killing text
7617@cindex Clipping text
7618@cindex Erasing text
7619@cindex Deleting text
7620
7621Whenever you cut or clip text out of a buffer with a `kill' command in
7622GNU Emacs, it is stored in a list and you can bring it back with a
7623`yank' command.
7624
7625(The use of the word `kill' in Emacs for processes which specifically
7626@emph{do not} destroy the values of the entities is an unfortunate
7627historical accident. A much more appropriate word would be `clip' since
7628that is what the kill commands do; they clip text out of a buffer and
7629put it into storage from which it can be brought back. I have often
7630been tempted to replace globally all occurrences of `kill' in the Emacs
7631sources with `clip' and all occurrences of `killed' with `clipped'.)
7632
7633@menu
7634* Storing Text:: Text is stored in a list.
7635* zap-to-char:: Cutting out text up to a character.
7636* kill-region:: Cutting text out of a region.
7637* copy-region-as-kill:: A definition for copying text.
7638* Digression into C:: Minor note on C programming language macros.
7639* defvar:: How to give a variable an initial value.
7640* cons & search-fwd Review::
7641* search Exercises::
7642@end menu
7643
7644@node Storing Text, zap-to-char, Cutting & Storing Text, Cutting & Storing Text
7645@ifnottex
7646@unnumberedsec Storing Text in a List
7647@end ifnottex
7648
7649When text is cut out of a buffer, it is stored on a list. Successive
7650pieces of text are stored on the list successively, so the list might
7651look like this:
7652
7653@smallexample
7654("a piece of text" "previous piece")
7655@end smallexample
7656
7657@need 1200
7658@noindent
7659The function @code{cons} can be used to create a new list from a piece
7660of text (an `atom', to use the jargon) and an existing list, like
7661this:
7662
7663@smallexample
7664@group
7665(cons "another piece"
7666 '("a piece of text" "previous piece"))
7667@end group
7668@end smallexample
7669
7670@need 1200
7671@noindent
7672If you evaluate this expression, a list of three elements will appear in
7673the echo area:
7674
7675@smallexample
7676("another piece" "a piece of text" "previous piece")
7677@end smallexample
7678
7679With the @code{car} and @code{nthcdr} functions, you can retrieve
7680whichever piece of text you want. For example, in the following code,
7681@code{nthcdr 1 @dots{}} returns the list with the first item removed;
7682and the @code{car} returns the first element of that remainder---the
7683second element of the original list:
7684
7685@smallexample
7686@group
7687(car (nthcdr 1 '("another piece"
7688 "a piece of text"
7689 "previous piece")))
7690 @result{} "a piece of text"
7691@end group
7692@end smallexample
7693
7694The actual functions in Emacs are more complex than this, of course.
7695The code for cutting and retrieving text has to be written so that
7696Emacs can figure out which element in the list you want---the first,
7697second, third, or whatever. In addition, when you get to the end of
7698the list, Emacs should give you the first element of the list, rather
7699than nothing at all.
7700
7701The list that holds the pieces of text is called the @dfn{kill ring}.
7702This chapter leads up to a description of the kill ring and how it is
7703used by first tracing how the @code{zap-to-char} function works. This
7704function uses (or `calls') a function that invokes a function that
7705manipulates the kill ring. Thus, before reaching the mountains, we
7706climb the foothills.
7707
7708A subsequent chapter describes how text that is cut from the buffer is
7709retrieved. @xref{Yanking, , Yanking Text Back}.
7710
7711@node zap-to-char, kill-region, Storing Text, Cutting & Storing Text
7712@comment node-name, next, previous, up
7713@section @code{zap-to-char}
7714@findex zap-to-char
7715
7716The @code{zap-to-char} function changed little between GNU Emacs
7717version 19 and GNU Emacs version 22. However, @code{zap-to-char}
7718calls another function, @code{kill-region}, which enjoyed a major
7719rewrite.
7720
7721The @code{kill-region} function in Emacs 19 is complex, but does not
7722use code that is important at this time. We will skip it.
7723
7724The @code{kill-region} function in Emacs 22 is easier to read than the
7725same function in Emacs 19 and introduces a very important concept,
7726that of error handling. We will walk through the function.
7727
7728But first, let us look at the interactive @code{zap-to-char} function.
7729
7730@menu
7731* Complete zap-to-char:: The complete implementation.
7732* zap-to-char interactive:: A three part interactive expression.
7733* zap-to-char body:: A short overview.
7734* search-forward:: How to search for a string.
7735* progn:: The @code{progn} special form.
7736* Summing up zap-to-char:: Using @code{point} and @code{search-forward}.
7737@end menu
7738
7739@node Complete zap-to-char, zap-to-char interactive, zap-to-char, zap-to-char
7740@ifnottex
7741@unnumberedsubsec The Complete @code{zap-to-char} Implementation
7742@end ifnottex
7743
7744The @code{zap-to-char} function removes the text in the region between
7745the location of the cursor (i.e., of point) up to and including the
7746next occurrence of a specified character. The text that
7747@code{zap-to-char} removes is put in the kill ring; and it can be
7748retrieved from the kill ring by typing @kbd{C-y} (@code{yank}). If
7749the command is given an argument, it removes text through that number
7750of occurrences. Thus, if the cursor were at the beginning of this
7751sentence and the character were @samp{s}, @samp{Thus} would be
7752removed. If the argument were two, @samp{Thus, if the curs} would be
7753removed, up to and including the @samp{s} in @samp{cursor}.
7754
7755If the specified character is not found, @code{zap-to-char} will say
7756``Search failed'', tell you the character you typed, and not remove
7757any text.
7758
7759In order to determine how much text to remove, @code{zap-to-char} uses
7760a search function. Searches are used extensively in code that
7761manipulates text, and we will focus attention on them as well as on the
7762deletion command.
7763
7764@ignore
7765@c GNU Emacs version 19
7766(defun zap-to-char (arg char) ; version 19 implementation
7767 "Kill up to and including ARG'th occurrence of CHAR.
7768Goes backward if ARG is negative; error if CHAR not found."
7769 (interactive "*p\ncZap to char: ")
7770 (kill-region (point)
7771 (progn
7772 (search-forward
7773 (char-to-string char) nil nil arg)
7774 (point))))
7775@end ignore
7776
7777@need 1250
7778Here is the complete text of the version 22 implementation of the function:
7779
7780@c GNU Emacs 22
7781@smallexample
7782@group
7783(defun zap-to-char (arg char)
7784 "Kill up to and including ARG'th occurrence of CHAR.
7785Case is ignored if `case-fold-search' is non-nil in the current buffer.
7786Goes backward if ARG is negative; error if CHAR not found."
7787 (interactive "p\ncZap to char: ")
7788 (if (char-table-p translation-table-for-input)
7789 (setq char (or (aref translation-table-for-input char) char)))
7790 (kill-region (point) (progn
a9097c6d
KB
7791 (search-forward (char-to-string char)
7792 nil nil arg)
8cda6f8f
GM
7793 (point))))
7794@end group
7795@end smallexample
7796
7797The documentation is thorough. You do need to know the jargon meaning
7798of the word `kill'.
7799
7800@node zap-to-char interactive, zap-to-char body, Complete zap-to-char, zap-to-char
7801@comment node-name, next, previous, up
7802@subsection The @code{interactive} Expression
7803
7804@need 800
7805The interactive expression in the @code{zap-to-char} command looks like
7806this:
7807
7808@smallexample
7809(interactive "p\ncZap to char: ")
7810@end smallexample
7811
7812The part within quotation marks, @code{"p\ncZap to char:@: "}, specifies
7813two different things. First, and most simply, is the @samp{p}.
7814This part is separated from the next part by a newline, @samp{\n}.
7815The @samp{p} means that the first argument to the function will be
7816passed the value of a `processed prefix'. The prefix argument is
7817passed by typing @kbd{C-u} and a number, or @kbd{M-} and a number. If
7818the function is called interactively without a prefix, 1 is passed to
7819this argument.
7820
7821The second part of @code{"p\ncZap to char:@: "} is
7822@samp{cZap to char:@: }. In this part, the lower case @samp{c}
7823indicates that @code{interactive} expects a prompt and that the
7824argument will be a character. The prompt follows the @samp{c} and is
7825the string @samp{Zap to char:@: } (with a space after the colon to
7826make it look good).
7827
7828What all this does is prepare the arguments to @code{zap-to-char} so they
7829are of the right type, and give the user a prompt.
7830
7831In a read-only buffer, the @code{zap-to-char} function copies the text
7832to the kill ring, but does not remove it. The echo area displays a
7833message saying that the buffer is read-only. Also, the terminal may
7834beep or blink at you.
7835
7836@node zap-to-char body, search-forward, zap-to-char interactive, zap-to-char
7837@comment node-name, next, previous, up
7838@subsection The Body of @code{zap-to-char}
7839
7840The body of the @code{zap-to-char} function contains the code that
7841kills (that is, removes) the text in the region from the current
7842position of the cursor up to and including the specified character.
7843
7844The first part of the code looks like this:
7845
7846@smallexample
7847(if (char-table-p translation-table-for-input)
7848 (setq char (or (aref translation-table-for-input char) char)))
7849(kill-region (point) (progn
7850 (search-forward (char-to-string char) nil nil arg)
7851 (point)))
7852@end smallexample
7853
7854@noindent
7855@code{char-table-p} is an hitherto unseen function. It determines
7856whether its argument is a character table. When it is, it sets the
7857character passed to @code{zap-to-char} to one of them, if that
7858character exists, or to the character itself. (This becomes important
7859for certain characters in non-European languages. The @code{aref}
7860function extracts an element from an array. It is an array-specific
7861function that is not described in this document. @xref{Arrays, ,
7862Arrays, elisp, The GNU Emacs Lisp Reference Manual}.)
7863
7864@noindent
7865@code{(point)} is the current position of the cursor.
7866
7867The next part of the code is an expression using @code{progn}. The body
7868of the @code{progn} consists of calls to @code{search-forward} and
7869@code{point}.
7870
7871It is easier to understand how @code{progn} works after learning about
7872@code{search-forward}, so we will look at @code{search-forward} and
7873then at @code{progn}.
7874
7875@node search-forward, progn, zap-to-char body, zap-to-char
7876@comment node-name, next, previous, up
7877@subsection The @code{search-forward} Function
7878@findex search-forward
7879
7880The @code{search-forward} function is used to locate the
7881zapped-for-character in @code{zap-to-char}. If the search is
7882successful, @code{search-forward} leaves point immediately after the
7883last character in the target string. (In @code{zap-to-char}, the
7884target string is just one character long. @code{zap-to-char} uses the
7885function @code{char-to-string} to ensure that the computer treats that
7886character as a string.) If the search is backwards,
7887@code{search-forward} leaves point just before the first character in
7888the target. Also, @code{search-forward} returns @code{t} for true.
7889(Moving point is therefore a `side effect'.)
7890
7891@need 1250
7892In @code{zap-to-char}, the @code{search-forward} function looks like this:
7893
7894@smallexample
7895(search-forward (char-to-string char) nil nil arg)
7896@end smallexample
7897
7898The @code{search-forward} function takes four arguments:
7899
7900@enumerate
7901@item
7902The first argument is the target, what is searched for. This must be a
7903string, such as @samp{"z"}.
7904
7905As it happens, the argument passed to @code{zap-to-char} is a single
7906character. Because of the way computers are built, the Lisp
7907interpreter may treat a single character as being different from a
7908string of characters. Inside the computer, a single character has a
7909different electronic format than a string of one character. (A single
7910character can often be recorded in the computer using exactly one
7911byte; but a string may be longer, and the computer needs to be ready
7912for this.) Since the @code{search-forward} function searches for a
7913string, the character that the @code{zap-to-char} function receives as
7914its argument must be converted inside the computer from one format to
7915the other; otherwise the @code{search-forward} function will fail.
7916The @code{char-to-string} function is used to make this conversion.
7917
7918@item
7919The second argument bounds the search; it is specified as a position in
7920the buffer. In this case, the search can go to the end of the buffer,
7921so no bound is set and the second argument is @code{nil}.
7922
7923@item
7924The third argument tells the function what it should do if the search
7925fails---it can signal an error (and print a message) or it can return
7926@code{nil}. A @code{nil} as the third argument causes the function to
7927signal an error when the search fails.
7928
7929@item
7930The fourth argument to @code{search-forward} is the repeat count---how
7931many occurrences of the string to look for. This argument is optional
7932and if the function is called without a repeat count, this argument is
7933passed the value 1. If this argument is negative, the search goes
7934backwards.
7935@end enumerate
7936
7937@need 800
7938In template form, a @code{search-forward} expression looks like this:
7939
7940@smallexample
7941@group
7942(search-forward "@var{target-string}"
7943 @var{limit-of-search}
7944 @var{what-to-do-if-search-fails}
7945 @var{repeat-count})
7946@end group
7947@end smallexample
7948
7949We will look at @code{progn} next.
7950
7951@node progn, Summing up zap-to-char, search-forward, zap-to-char
7952@comment node-name, next, previous, up
7953@subsection The @code{progn} Special Form
7954@findex progn
7955
7956@code{progn} is a special form that causes each of its arguments to be
7957evaluated in sequence and then returns the value of the last one. The
7958preceding expressions are evaluated only for the side effects they
7959perform. The values produced by them are discarded.
7960
7961@need 800
7962The template for a @code{progn} expression is very simple:
7963
7964@smallexample
7965@group
7966(progn
7967 @var{body}@dots{})
7968@end group
7969@end smallexample
7970
7971In @code{zap-to-char}, the @code{progn} expression has to do two things:
7972put point in exactly the right position; and return the location of
7973point so that @code{kill-region} will know how far to kill to.
7974
7975The first argument to the @code{progn} is @code{search-forward}. When
7976@code{search-forward} finds the string, the function leaves point
7977immediately after the last character in the target string. (In this
7978case the target string is just one character long.) If the search is
7979backwards, @code{search-forward} leaves point just before the first
7980character in the target. The movement of point is a side effect.
7981
7982The second and last argument to @code{progn} is the expression
7983@code{(point)}. This expression returns the value of point, which in
7984this case will be the location to which it has been moved by
7985@code{search-forward}. (In the source, a line that tells the function
7986to go to the previous character, if it is going forward, was commented
7987out in 1999; I don't remember whether that feature or mis-feature was
7988ever a part of the distributed source.) The value of @code{point} is
7989returned by the @code{progn} expression and is passed to
7990@code{kill-region} as @code{kill-region}'s second argument.
7991
7992@node Summing up zap-to-char, , progn, zap-to-char
7993@comment node-name, next, previous, up
7994@subsection Summing up @code{zap-to-char}
7995
7996Now that we have seen how @code{search-forward} and @code{progn} work,
7997we can see how the @code{zap-to-char} function works as a whole.
7998
7999The first argument to @code{kill-region} is the position of the cursor
8000when the @code{zap-to-char} command is given---the value of point at
8001that time. Within the @code{progn}, the search function then moves
8002point to just after the zapped-to-character and @code{point} returns the
8003value of this location. The @code{kill-region} function puts together
8004these two values of point, the first one as the beginning of the region
8005and the second one as the end of the region, and removes the region.
8006
8007The @code{progn} special form is necessary because the
8008@code{kill-region} command takes two arguments; and it would fail if
8009@code{search-forward} and @code{point} expressions were written in
8010sequence as two additional arguments. The @code{progn} expression is
8011a single argument to @code{kill-region} and returns the one value that
8012@code{kill-region} needs for its second argument.
8013
8014@node kill-region, copy-region-as-kill, zap-to-char, Cutting & Storing Text
8015@comment node-name, next, previous, up
8016@section @code{kill-region}
8017@findex kill-region
8018
8019The @code{zap-to-char} function uses the @code{kill-region} function.
8020This function clips text from a region and copies that text to
8021the kill ring, from which it may be retrieved.
8022
8023@ignore
8024GNU Emacs 22:
8025
8026(defun kill-region (beg end &optional yank-handler)
8027 "Kill (\"cut\") text between point and mark.
8028This deletes the text from the buffer and saves it in the kill ring.
8029The command \\[yank] can retrieve it from there.
8030\(If you want to kill and then yank immediately, use \\[kill-ring-save].)
8031
8032If you want to append the killed region to the last killed text,
8033use \\[append-next-kill] before \\[kill-region].
8034
8035If the buffer is read-only, Emacs will beep and refrain from deleting
8036the text, but put the text in the kill ring anyway. This means that
8037you can use the killing commands to copy text from a read-only buffer.
8038
8039This is the primitive for programs to kill text (as opposed to deleting it).
8040Supply two arguments, character positions indicating the stretch of text
8041 to be killed.
8042Any command that calls this function is a \"kill command\".
8043If the previous command was also a kill command,
8044the text killed this time appends to the text killed last time
8045to make one entry in the kill ring.
8046
8047In Lisp code, optional third arg YANK-HANDLER, if non-nil,
8048specifies the yank-handler text property to be set on the killed
8049text. See `insert-for-yank'."
8050 ;; Pass point first, then mark, because the order matters
8051 ;; when calling kill-append.
8052 (interactive (list (point) (mark)))
8053 (unless (and beg end)
8054 (error "The mark is not set now, so there is no region"))
8055 (condition-case nil
8056 (let ((string (filter-buffer-substring beg end t)))
8057 (when string ;STRING is nil if BEG = END
8058 ;; Add that string to the kill ring, one way or another.
8059 (if (eq last-command 'kill-region)
8060 (kill-append string (< end beg) yank-handler)
8061 (kill-new string nil yank-handler)))
8062 (when (or string (eq last-command 'kill-region))
8063 (setq this-command 'kill-region))
8064 nil)
8065 ((buffer-read-only text-read-only)
8066 ;; The code above failed because the buffer, or some of the characters
8067 ;; in the region, are read-only.
8068 ;; We should beep, in case the user just isn't aware of this.
8069 ;; However, there's no harm in putting
8070 ;; the region's text in the kill ring, anyway.
8071 (copy-region-as-kill beg end)
8072 ;; Set this-command now, so it will be set even if we get an error.
8073 (setq this-command 'kill-region)
8074 ;; This should barf, if appropriate, and give us the correct error.
8075 (if kill-read-only-ok
8076 (progn (message "Read only text copied to kill ring") nil)
8077 ;; Signal an error if the buffer is read-only.
8078 (barf-if-buffer-read-only)
8079 ;; If the buffer isn't read-only, the text is.
8080 (signal 'text-read-only (list (current-buffer)))))))
8081@end ignore
8082
8083The Emacs 22 version of that function uses @code{condition-case} and
8084@code{copy-region-as-kill}, both of which we will explain.
8085@code{condition-case} is an important special form.
8086
8087In essence, the @code{kill-region} function calls
8088@code{condition-case}, which takes three arguments. In this function,
8089the first argument does nothing. The second argument contains the
8090code that does the work when all goes well. The third argument
8091contains the code that is called in the event of an error.
8092
8093@menu
8094* Complete kill-region:: The function definition.
8095* condition-case:: Dealing with a problem.
8096* Lisp macro::
8097@end menu
8098
8099@node Complete kill-region, condition-case, kill-region, kill-region
8100@ifnottex
8101@unnumberedsubsec The Complete @code{kill-region} Definition
8102@end ifnottex
8103
8104@need 1200
8105We will go through the @code{condition-case} code in a moment. First,
8106let us look at the definition of @code{kill-region}, with comments
8107added:
8108
8109@c GNU Emacs 22:
8110@smallexample
8111@group
8112(defun kill-region (beg end)
8113 "Kill (\"cut\") text between point and mark.
8114This deletes the text from the buffer and saves it in the kill ring.
8115The command \\[yank] can retrieve it from there. @dots{} "
8116@end group
8117
8118@group
8119 ;; @bullet{} Since order matters, pass point first.
8120 (interactive (list (point) (mark)))
8121 ;; @bullet{} And tell us if we cannot cut the text.
8122 ;; `unless' is an `if' without a then-part.
8123 (unless (and beg end)
8124 (error "The mark is not set now, so there is no region"))
8125@end group
8126
8127@group
8128 ;; @bullet{} `condition-case' takes three arguments.
8129 ;; If the first argument is nil, as it is here,
8130 ;; information about the error signal is not
8131 ;; stored for use by another function.
8132 (condition-case nil
8133@end group
8134
8135@group
8136 ;; @bullet{} The second argument to `condition-case' tells the
8137 ;; Lisp interpreter what to do when all goes well.
8138@end group
8139
8140@group
8141 ;; It starts with a `let' function that extracts the string
8142 ;; and tests whether it exists. If so (that is what the
8143 ;; `when' checks), it calls an `if' function that determines
8144 ;; whether the previous command was another call to
8145 ;; `kill-region'; if it was, then the new text is appended to
8146 ;; the previous text; if not, then a different function,
8147 ;; `kill-new', is called.
8148@end group
8149
8150@group
8151 ;; The `kill-append' function concatenates the new string and
8152 ;; the old. The `kill-new' function inserts text into a new
8153 ;; item in the kill ring.
8154@end group
8155
8156@group
8157 ;; `when' is an `if' without an else-part. The second `when'
8158 ;; again checks whether the current string exists; in
8159 ;; addition, it checks whether the previous command was
8160 ;; another call to `kill-region'. If one or the other
8161 ;; condition is true, then it sets the current command to
8162 ;; be `kill-region'.
8163@end group
8164@group
8165 (let ((string (filter-buffer-substring beg end t)))
8166 (when string ;STRING is nil if BEG = END
8167 ;; Add that string to the kill ring, one way or another.
8168 (if (eq last-command 'kill-region)
8169@end group
8170@group
8171 ;; @minus{} `yank-handler' is an optional argument to
8172 ;; `kill-region' that tells the `kill-append' and
8173 ;; `kill-new' functions how deal with properties
8174 ;; added to the text, such as `bold' or `italics'.
8175 (kill-append string (< end beg) yank-handler)
8176 (kill-new string nil yank-handler)))
8177 (when (or string (eq last-command 'kill-region))
8178 (setq this-command 'kill-region))
8179 nil)
8180@end group
8181
8182@group
8183 ;; @bullet{} The third argument to `condition-case' tells the interpreter
8184 ;; what to do with an error.
8185@end group
8186@group
8187 ;; The third argument has a conditions part and a body part.
8188 ;; If the conditions are met (in this case,
8189 ;; if text or buffer are read-only)
8190 ;; then the body is executed.
8191@end group
8192@group
8193 ;; The first part of the third argument is the following:
8194 ((buffer-read-only text-read-only) ;; the if-part
8195 ;; @dots{} the then-part
8196 (copy-region-as-kill beg end)
8197@end group
8198@group
8199 ;; Next, also as part of the then-part, set this-command, so
8200 ;; it will be set in an error
8201 (setq this-command 'kill-region)
8202 ;; Finally, in the then-part, send a message if you may copy
8350f087 8203 ;; the text to the kill ring without signaling an error, but
8cda6f8f
GM
8204 ;; don't if you may not.
8205@end group
8206@group
8207 (if kill-read-only-ok
8208 (progn (message "Read only text copied to kill ring") nil)
8209 (barf-if-buffer-read-only)
8210 ;; If the buffer isn't read-only, the text is.
8211 (signal 'text-read-only (list (current-buffer)))))
8212@end group
8213@end smallexample
8214
8215@ignore
8216@c v 21
8217@smallexample
8218@group
8219(defun kill-region (beg end)
8220 "Kill between point and mark.
8221The text is deleted but saved in the kill ring."
8222 (interactive "r")
8223@end group
8224
8225@group
8226 ;; 1. `condition-case' takes three arguments.
8227 ;; If the first argument is nil, as it is here,
8228 ;; information about the error signal is not
8229 ;; stored for use by another function.
8230 (condition-case nil
8231@end group
8232
8233@group
8234 ;; 2. The second argument to `condition-case'
8235 ;; tells the Lisp interpreter what to do when all goes well.
8236@end group
8237
8238@group
8239 ;; The `delete-and-extract-region' function usually does the
8240 ;; work. If the beginning and ending of the region are both
8241 ;; the same, then the variable `string' will be empty, or nil
8242 (let ((string (delete-and-extract-region beg end)))
8243@end group
8244
8245@group
8246 ;; `when' is an `if' clause that cannot take an `else-part'.
8247 ;; Emacs normally sets the value of `last-command' to the
8248 ;; previous command.
8249@end group
8250@group
8251 ;; `kill-append' concatenates the new string and the old.
8252 ;; `kill-new' inserts text into a new item in the kill ring.
8253 (when string
8254 (if (eq last-command 'kill-region)
8255 ;; if true, prepend string
8256 (kill-append string (< end beg))
8257 (kill-new string)))
8258 (setq this-command 'kill-region))
8259@end group
8260
8261@group
8262 ;; 3. The third argument to `condition-case' tells the interpreter
8263 ;; what to do with an error.
8264@end group
8265@group
8266 ;; The third argument has a conditions part and a body part.
8267 ;; If the conditions are met (in this case,
8268 ;; if text or buffer are read-only)
8269 ;; then the body is executed.
8270@end group
8271@group
8272 ((buffer-read-only text-read-only) ;; this is the if-part
8273 ;; then...
8274 (copy-region-as-kill beg end)
8275@end group
8276@group
8277 (if kill-read-only-ok ;; usually this variable is nil
8278 (message "Read only text copied to kill ring")
8279 ;; or else, signal an error if the buffer is read-only;
8280 (barf-if-buffer-read-only)
8281 ;; and, in any case, signal that the text is read-only.
8282 (signal 'text-read-only (list (current-buffer)))))))
8283@end group
8284@end smallexample
8285@end ignore
8286
8287@node condition-case, Lisp macro, Complete kill-region, kill-region
8288@comment node-name, next, previous, up
8289@subsection @code{condition-case}
8290@findex condition-case
8291
8292As we have seen earlier (@pxref{Making Errors, , Generate an Error
8293Message}), when the Emacs Lisp interpreter has trouble evaluating an
8294expression, it provides you with help; in the jargon, this is called
8295``signaling an error''. Usually, the computer stops the program and
8296shows you a message.
8297
8298However, some programs undertake complicated actions. They should not
8299simply stop on an error. In the @code{kill-region} function, the most
8300likely error is that you will try to kill text that is read-only and
8301cannot be removed. So the @code{kill-region} function contains code
8302to handle this circumstance. This code, which makes up the body of
8303the @code{kill-region} function, is inside of a @code{condition-case}
8304special form.
8305
8306@need 800
8307The template for @code{condition-case} looks like this:
8308
8309@smallexample
8310@group
8311(condition-case
8312 @var{var}
8313 @var{bodyform}
8314 @var{error-handler}@dots{})
8315@end group
8316@end smallexample
8317
8318The second argument, @var{bodyform}, is straightforward. The
8319@code{condition-case} special form causes the Lisp interpreter to
8320evaluate the code in @var{bodyform}. If no error occurs, the special
8321form returns the code's value and produces the side-effects, if any.
8322
8323In short, the @var{bodyform} part of a @code{condition-case}
8324expression determines what should happen when everything works
8325correctly.
8326
8327However, if an error occurs, among its other actions, the function
8328generating the error signal will define one or more error condition
8329names.
8330
8331An error handler is the third argument to @code{condition case}.
8332An error handler has two parts, a @var{condition-name} and a
8333@var{body}. If the @var{condition-name} part of an error handler
8334matches a condition name generated by an error, then the @var{body}
8335part of the error handler is run.
8336
8337As you will expect, the @var{condition-name} part of an error handler
8338may be either a single condition name or a list of condition names.
8339
8340Also, a complete @code{condition-case} expression may contain more
8341than one error handler. When an error occurs, the first applicable
8342handler is run.
8343
8344Lastly, the first argument to the @code{condition-case} expression,
8345the @var{var} argument, is sometimes bound to a variable that
8346contains information about the error. However, if that argument is
8347nil, as is the case in @code{kill-region}, that information is
8348discarded.
8349
8350@need 1200
8351In brief, in the @code{kill-region} function, the code
8352@code{condition-case} works like this:
8353
8354@smallexample
8355@group
8356@var{If no errors}, @var{run only this code}
8357 @var{but}, @var{if errors}, @var{run this other code}.
8358@end group
8359@end smallexample
8360
8361@ignore
83622006 Oct 24
8363In Emacs 22,
8364copy-region-as-kill is short, 12 lines, and uses
8365filter-buffer-substring, which is longer, 39 lines
8366and has delete-and-extract-region in it.
8367delete-and-extract-region is written in C.
8368
8369see Initializing a Variable with @code{defvar}
8370this is line 8054
8371Initializing a Variable with @code{defvar} includes line 8350
8372@end ignore
8373
8374@node Lisp macro, , condition-case, kill-region
8375@comment node-name, next, previous, up
8376@subsection Lisp macro
8377@cindex Macro, lisp
8378@cindex Lisp macro
8379
8380The part of the @code{condition-case} expression that is evaluated in
8381the expectation that all goes well has a @code{when}. The code uses
8382@code{when} to determine whether the @code{string} variable points to
8383text that exists.
8384
8385A @code{when} expression is simply a programmers' convenience. It is
8386an @code{if} without the possibility of an else clause. In your mind,
8387you can replace @code{when} with @code{if} and understand what goes
8388on. That is what the Lisp interpreter does.
8389
8390Technically speaking, @code{when} is a Lisp macro. A Lisp @dfn{macro}
8391enables you to define new control constructs and other language
8392features. It tells the interpreter how to compute another Lisp
8393expression which will in turn compute the value. In this case, the
8394`other expression' is an @code{if} expression.
8395
8396The @code{kill-region} function definition also has an @code{unless}
8397macro; it is the converse of @code{when}. The @code{unless} macro is
8398an @code{if} without a then clause
8399
8400For more about Lisp macros, see @ref{Macros, , Macros, elisp, The GNU
8401Emacs Lisp Reference Manual}. The C programming language also
8402provides macros. These are different, but also useful.
8403
8404@ignore
8405We will briefly look at C macros in
8406@ref{Digression into C}.
8407@end ignore
8408
8409@need 1200
8410Regarding the @code{when} macro, in the @code{condition-case}
8411expression, when the string has content, then another conditional
8412expression is executed. This is an @code{if} with both a then-part
8413and an else-part.
8414
8415@smallexample
8416@group
8417(if (eq last-command 'kill-region)
8418 (kill-append string (< end beg) yank-handler)
8419 (kill-new string nil yank-handler))
8420@end group
8421@end smallexample
8422
8423The then-part is evaluated if the previous command was another call to
8424@code{kill-region}; if not, the else-part is evaluated.
8425
8426@code{yank-handler} is an optional argument to @code{kill-region} that
8427tells the @code{kill-append} and @code{kill-new} functions how deal
8428with properties added to the text, such as `bold' or `italics'.
8429
8430@code{last-command} is a variable that comes with Emacs that we have
8431not seen before. Normally, whenever a function is executed, Emacs
8432sets the value of @code{last-command} to the previous command.
8433
8434@need 1200
8435In this segment of the definition, the @code{if} expression checks
8436whether the previous command was @code{kill-region}. If it was,
8437
8438@smallexample
8439(kill-append string (< end beg) yank-handler)
8440@end smallexample
8441
8442@noindent
8443concatenates a copy of the newly clipped text to the just previously
8444clipped text in the kill ring.
8445
8446@node copy-region-as-kill, Digression into C, kill-region, Cutting & Storing Text
8447@comment node-name, next, previous, up
8448@section @code{copy-region-as-kill}
8449@findex copy-region-as-kill
8450@findex nthcdr
8451
8452The @code{copy-region-as-kill} function copies a region of text from a
8453buffer and (via either @code{kill-append} or @code{kill-new}) saves it
8454in the @code{kill-ring}.
8455
8456If you call @code{copy-region-as-kill} immediately after a
8457@code{kill-region} command, Emacs appends the newly copied text to the
8458previously copied text. This means that if you yank back the text, you
8459get it all, from both this and the previous operation. On the other
8460hand, if some other command precedes the @code{copy-region-as-kill},
8461the function copies the text into a separate entry in the kill ring.
8462
8463@menu
8464* Complete copy-region-as-kill:: The complete function definition.
8465* copy-region-as-kill body:: The body of @code{copy-region-as-kill}.
8466@end menu
8467
8468@node Complete copy-region-as-kill, copy-region-as-kill body, copy-region-as-kill, copy-region-as-kill
8469@ifnottex
8470@unnumberedsubsec The complete @code{copy-region-as-kill} function definition
8471@end ifnottex
8472
8473@need 1200
8474Here is the complete text of the version 22 @code{copy-region-as-kill}
8475function:
8476
8477@smallexample
8478@group
8479(defun copy-region-as-kill (beg end)
8480 "Save the region as if killed, but don't kill it.
8481In Transient Mark mode, deactivate the mark.
8482If `interprogram-cut-function' is non-nil, also save the text for a window
8483system cut and paste."
8484 (interactive "r")
8485@end group
8486@group
8487 (if (eq last-command 'kill-region)
8488 (kill-append (filter-buffer-substring beg end) (< end beg))
8489 (kill-new (filter-buffer-substring beg end)))
8490@end group
8491@group
8492 (if transient-mark-mode
8493 (setq deactivate-mark t))
8494 nil)
8495@end group
8496@end smallexample
8497
8498@need 800
8499As usual, this function can be divided into its component parts:
8500
8501@smallexample
8502@group
8503(defun copy-region-as-kill (@var{argument-list})
8504 "@var{documentation}@dots{}"
8505 (interactive "r")
8506 @var{body}@dots{})
8507@end group
8508@end smallexample
8509
8510The arguments are @code{beg} and @code{end} and the function is
8511interactive with @code{"r"}, so the two arguments must refer to the
8512beginning and end of the region. If you have been reading though this
8513document from the beginning, understanding these parts of a function is
8514almost becoming routine.
8515
8516The documentation is somewhat confusing unless you remember that the
8517word `kill' has a meaning different from usual. The `Transient Mark'
8518and @code{interprogram-cut-function} comments explain certain
8519side-effects.
8520
8521After you once set a mark, a buffer always contains a region. If you
8522wish, you can use Transient Mark mode to highlight the region
8523temporarily. (No one wants to highlight the region all the time, so
8524Transient Mark mode highlights it only at appropriate times. Many
8525people turn off Transient Mark mode, so the region is never
8526highlighted.)
8527
8528Also, a windowing system allows you to copy, cut, and paste among
8529different programs. In the X windowing system, for example, the
8530@code{interprogram-cut-function} function is @code{x-select-text},
8531which works with the windowing system's equivalent of the Emacs kill
8532ring.
8533
8534The body of the @code{copy-region-as-kill} function starts with an
8535@code{if} clause. What this clause does is distinguish between two
8536different situations: whether or not this command is executed
8537immediately after a previous @code{kill-region} command. In the first
8538case, the new region is appended to the previously copied text.
8539Otherwise, it is inserted into the beginning of the kill ring as a
8540separate piece of text from the previous piece.
8541
8542The last two lines of the function prevent the region from lighting up
8543if Transient Mark mode is turned on.
8544
8545The body of @code{copy-region-as-kill} merits discussion in detail.
8546
8547@node copy-region-as-kill body, , Complete copy-region-as-kill, copy-region-as-kill
8548@comment node-name, next, previous, up
8549@subsection The Body of @code{copy-region-as-kill}
8550
8551The @code{copy-region-as-kill} function works in much the same way as
8552the @code{kill-region} function. Both are written so that two or more
8553kills in a row combine their text into a single entry. If you yank
8554back the text from the kill ring, you get it all in one piece.
8555Moreover, kills that kill forward from the current position of the
8556cursor are added to the end of the previously copied text and commands
8557that copy text backwards add it to the beginning of the previously
8558copied text. This way, the words in the text stay in the proper
8559order.
8560
8561Like @code{kill-region}, the @code{copy-region-as-kill} function makes
8562use of the @code{last-command} variable that keeps track of the
8563previous Emacs command.
8564
8565@menu
8566* last-command & this-command::
8567* kill-append function::
8568* kill-new function::
8569@end menu
8570
8571@node last-command & this-command, kill-append function, copy-region-as-kill body, copy-region-as-kill body
8572@ifnottex
8573@unnumberedsubsubsec @code{last-command} and @code{this-command}
8574@end ifnottex
8575
8576Normally, whenever a function is executed, Emacs sets the value of
8577@code{this-command} to the function being executed (which in this case
8578would be @code{copy-region-as-kill}). At the same time, Emacs sets
8579the value of @code{last-command} to the previous value of
8580@code{this-command}.
8581
8582In the first part of the body of the @code{copy-region-as-kill}
8583function, an @code{if} expression determines whether the value of
8584@code{last-command} is @code{kill-region}. If so, the then-part of
8585the @code{if} expression is evaluated; it uses the @code{kill-append}
8586function to concatenate the text copied at this call to the function
8587with the text already in the first element (the @sc{car}) of the kill
8588ring. On the other hand, if the value of @code{last-command} is not
8589@code{kill-region}, then the @code{copy-region-as-kill} function
8590attaches a new element to the kill ring using the @code{kill-new}
8591function.
8592
8593@need 1250
8594The @code{if} expression reads as follows; it uses @code{eq}:
8595
8596@smallexample
8597@group
8598 (if (eq last-command 'kill-region)
8599 ;; @r{then-part}
8600 (kill-append (filter-buffer-substring beg end) (< end beg))
8601 ;; @r{else-part}
8602 (kill-new (filter-buffer-substring beg end)))
8603@end group
8604@end smallexample
8605
8606@findex filter-buffer-substring
8607(The @code{filter-buffer-substring} function returns a filtered
8608substring of the buffer, if any. Optionally---the arguments are not
8609here, so neither is done---the function may delete the initial text or
8610return the text without its properties; this function is a replacement
8611for the older @code{buffer-substring} function, which came before text
8612properties were implemented.)
8613
8614@findex eq @r{(example of use)}
8615@noindent
8616The @code{eq} function tests whether its first argument is the same Lisp
8617object as its second argument. The @code{eq} function is similar to the
8618@code{equal} function in that it is used to test for equality, but
8619differs in that it determines whether two representations are actually
8620the same object inside the computer, but with different names.
8621@code{equal} determines whether the structure and contents of two
8622expressions are the same.
8623
8624If the previous command was @code{kill-region}, then the Emacs Lisp
8625interpreter calls the @code{kill-append} function
8626
8627@node kill-append function, kill-new function, last-command & this-command, copy-region-as-kill body
8628@unnumberedsubsubsec The @code{kill-append} function
8629@findex kill-append
8630
8631@need 800
8632The @code{kill-append} function looks like this:
8633
8634@c in GNU Emacs 22
8635@smallexample
8636@group
8637(defun kill-append (string before-p &optional yank-handler)
8638 "Append STRING to the end of the latest kill in the kill ring.
8639If BEFORE-P is non-nil, prepend STRING to the kill.
8640@dots{} "
8641 (let* ((cur (car kill-ring)))
8642 (kill-new (if before-p (concat string cur) (concat cur string))
8643 (or (= (length cur) 0)
8644 (equal yank-handler
8645 (get-text-property 0 'yank-handler cur)))
8646 yank-handler)))
8647@end group
8648@end smallexample
8649
8650@ignore
8651was:
8652(defun kill-append (string before-p)
8653 "Append STRING to the end of the latest kill in the kill ring.
8654If BEFORE-P is non-nil, prepend STRING to the kill.
8655If `interprogram-cut-function' is set, pass the resulting kill to
8656it."
8657 (kill-new (if before-p
8658 (concat string (car kill-ring))
8659 (concat (car kill-ring) string))
8660 t))
8661@end ignore
8662
8663@noindent
8664The @code{kill-append} function is fairly straightforward. It uses
8665the @code{kill-new} function, which we will discuss in more detail in
8666a moment.
8667
8668(Also, the function provides an optional argument called
8669@code{yank-handler}; when invoked, this argument tells the function
8670how to deal with properties added to the text, such as `bold' or
8671`italics'.)
8672
8673@c !!! bug in GNU Emacs 22 version of kill-append ?
8674It has a @code{let*} function to set the value of the first element of
8675the kill ring to @code{cur}. (I do not know why the function does not
8676use @code{let} instead; only one value is set in the expression.
8677Perhaps this is a bug that produces no problems?)
8678
8679Consider the conditional that is one of the two arguments to
8680@code{kill-new}. It uses @code{concat} to concatenate the new text to
8681the @sc{car} of the kill ring. Whether it prepends or appends the
8682text depends on the results of an @code{if} expression:
8683
8684@smallexample
8685@group
8686(if before-p ; @r{if-part}
8687 (concat string cur) ; @r{then-part}
8688 (concat cur string)) ; @r{else-part}
8689@end group
8690@end smallexample
8691
8692@noindent
8693If the region being killed is before the region that was killed in the
8694last command, then it should be prepended before the material that was
8695saved in the previous kill; and conversely, if the killed text follows
8696what was just killed, it should be appended after the previous text.
8697The @code{if} expression depends on the predicate @code{before-p} to
8698decide whether the newly saved text should be put before or after the
8699previously saved text.
8700
8701The symbol @code{before-p} is the name of one of the arguments to
8702@code{kill-append}. When the @code{kill-append} function is
8703evaluated, it is bound to the value returned by evaluating the actual
8704argument. In this case, this is the expression @code{(< end beg)}.
8705This expression does not directly determine whether the killed text in
8706this command is located before or after the kill text of the last
8707command; what it does is determine whether the value of the variable
8708@code{end} is less than the value of the variable @code{beg}. If it
8709is, it means that the user is most likely heading towards the
8710beginning of the buffer. Also, the result of evaluating the predicate
8711expression, @code{(< end beg)}, will be true and the text will be
8712prepended before the previous text. On the other hand, if the value of
8713the variable @code{end} is greater than the value of the variable
8714@code{beg}, the text will be appended after the previous text.
8715
8716@need 800
8717When the newly saved text will be prepended, then the string with the new
8718text will be concatenated before the old text:
8719
8720@smallexample
8721(concat string cur)
8722@end smallexample
8723
8724@need 1200
8725@noindent
8726But if the text will be appended, it will be concatenated
8727after the old text:
8728
8729@smallexample
8730(concat cur string))
8731@end smallexample
8732
8733To understand how this works, we first need to review the
8734@code{concat} function. The @code{concat} function links together or
8735unites two strings of text. The result is a string. For example:
8736
8737@smallexample
8738@group
8739(concat "abc" "def")
8740 @result{} "abcdef"
8741@end group
8742
8743@group
8744(concat "new "
8745 (car '("first element" "second element")))
8746 @result{} "new first element"
8747
8748(concat (car
8749 '("first element" "second element")) " modified")
8750 @result{} "first element modified"
8751@end group
8752@end smallexample
8753
8754We can now make sense of @code{kill-append}: it modifies the contents
8755of the kill ring. The kill ring is a list, each element of which is
8756saved text. The @code{kill-append} function uses the @code{kill-new}
8757function which in turn uses the @code{setcar} function.
8758
8759@node kill-new function, , kill-append function, copy-region-as-kill body
8760@unnumberedsubsubsec The @code{kill-new} function
8761@findex kill-new
8762
8763@c in GNU Emacs 22, additional documentation to kill-new:
8764@ignore
8765Optional third arguments YANK-HANDLER controls how the STRING is later
8766inserted into a buffer; see `insert-for-yank' for details.
8767When a yank handler is specified, STRING must be non-empty (the yank
8768handler, if non-nil, is stored as a `yank-handler' text property on STRING).
8769
8770When the yank handler has a non-nil PARAM element, the original STRING
8771argument is not used by `insert-for-yank'. However, since Lisp code
8772may access and use elements from the kill ring directly, the STRING
8773argument should still be a \"useful\" string for such uses."
8774@end ignore
8775@need 1200
8776The @code{kill-new} function looks like this:
8777
8778@smallexample
8779@group
8780(defun kill-new (string &optional replace yank-handler)
8781 "Make STRING the latest kill in the kill ring.
8782Set `kill-ring-yank-pointer' to point to it.
8783
8784If `interprogram-cut-function' is non-nil, apply it to STRING.
8785Optional second argument REPLACE non-nil means that STRING will replace
8786the front of the kill ring, rather than being added to the list.
8787@dots{}"
8788@end group
8789@group
8790 (if (> (length string) 0)
8791 (if yank-handler
8792 (put-text-property 0 (length string)
8793 'yank-handler yank-handler string))
8794 (if yank-handler
8795 (signal 'args-out-of-range
8796 (list string "yank-handler specified for empty string"))))
8797@end group
8798@group
8799 (if (fboundp 'menu-bar-update-yank-menu)
8800 (menu-bar-update-yank-menu string (and replace (car kill-ring))))
8801@end group
8802@group
8803 (if (and replace kill-ring)
8804 (setcar kill-ring string)
8805 (push string kill-ring)
8806 (if (> (length kill-ring) kill-ring-max)
8807 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
8808@end group
8809@group
8810 (setq kill-ring-yank-pointer kill-ring)
8811 (if interprogram-cut-function
8812 (funcall interprogram-cut-function string (not replace))))
8813@end group
8814@end smallexample
8815@ignore
8816was:
8817(defun kill-new (string &optional replace)
8818 "Make STRING the latest kill in the kill ring.
8819Set the kill-ring-yank pointer to point to it.
8820If `interprogram-cut-function' is non-nil, apply it to STRING.
8821Optional second argument REPLACE non-nil means that STRING will replace
8822the front of the kill ring, rather than being added to the list."
8823 (and (fboundp 'menu-bar-update-yank-menu)
8824 (menu-bar-update-yank-menu string (and replace (car kill-ring))))
8825 (if (and replace kill-ring)
8826 (setcar kill-ring string)
8827 (setq kill-ring (cons string kill-ring))
8828 (if (> (length kill-ring) kill-ring-max)
8829 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
8830 (setq kill-ring-yank-pointer kill-ring)
8831 (if interprogram-cut-function
8832 (funcall interprogram-cut-function string (not replace))))
8833@end ignore
8834
8835(Notice that the function is not interactive.)
8836
8837As usual, we can look at this function in parts.
8838
8839The function definition has an optional @code{yank-handler} argument,
8840which when invoked tells the function how to deal with properties
8841added to the text, such as `bold' or `italics'. We will skip that.
8842
8843@need 1200
8844The first line of the documentation makes sense:
8845
8846@smallexample
8847Make STRING the latest kill in the kill ring.
8848@end smallexample
8849
8850@noindent
8851Let's skip over the rest of the documentation for the moment.
8852
8853@noindent
8854Also, let's skip over the initial @code{if} expression and those lines
8855of code involving @code{menu-bar-update-yank-menu}. We will explain
8856them below.
8857
8858@need 1200
8859The critical lines are these:
8860
8861@smallexample
8862@group
8863 (if (and replace kill-ring)
8864 ;; @r{then}
8865 (setcar kill-ring string)
8866@end group
8867@group
8868 ;; @r{else}
8869 (push string kill-ring)
8870@end group
8871@group
8872 (setq kill-ring (cons string kill-ring))
8873 (if (> (length kill-ring) kill-ring-max)
8874 ;; @r{avoid overly long kill ring}
8875 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
8876@end group
8877@group
8878 (setq kill-ring-yank-pointer kill-ring)
8879 (if interprogram-cut-function
8880 (funcall interprogram-cut-function string (not replace))))
8881@end group
8882@end smallexample
8883
8884The conditional test is @w{@code{(and replace kill-ring)}}.
8885This will be true when two conditions are met: the kill ring has
8886something in it, and the @code{replace} variable is true.
8887
8888@need 1250
8889When the @code{kill-append} function sets @code{replace} to be true
8890and when the kill ring has at least one item in it, the @code{setcar}
8891expression is executed:
8892
8893@smallexample
8894(setcar kill-ring string)
8895@end smallexample
8896
8897The @code{setcar} function actually changes the first element of the
8898@code{kill-ring} list to the value of @code{string}. It replaces the
8899first element.
8900
8901@need 1250
8902On the other hand, if the kill ring is empty, or replace is false, the
8903else-part of the condition is executed:
8904
8905@smallexample
8906(push string kill-ring)
8907@end smallexample
8908
8909@noindent
8910@need 1250
8911@code{push} puts its first argument onto the second. It is similar to
8912the older
8913
8914@smallexample
8915(setq kill-ring (cons string kill-ring))
8916@end smallexample
8917
8918@noindent
8919@need 1250
8920or the newer
8921
8922@smallexample
8923(add-to-list kill-ring string)
8924@end smallexample
8925
8926@noindent
8927When it is false, the expression first constructs a new version of the
8928kill ring by prepending @code{string} to the existing kill ring as a
8929new element (that is what the @code{push} does). Then it executes a
8930second @code{if} clause. This second @code{if} clause keeps the kill
8931ring from growing too long.
8932
8933Let's look at these two expressions in order.
8934
8935The @code{push} line of the else-part sets the new value of the kill
8936ring to what results from adding the string being killed to the old
8937kill ring.
8938
8939We can see how this works with an example.
8940
8941@need 800
8942First,
8943
8944@smallexample
8945(setq example-list '("here is a clause" "another clause"))
8946@end smallexample
8947
8948@need 1200
8949@noindent
8950After evaluating this expression with @kbd{C-x C-e}, you can evaluate
8951@code{example-list} and see what it returns:
8952
8953@smallexample
8954@group
8955example-list
8956 @result{} ("here is a clause" "another clause")
8957@end group
8958@end smallexample
8959
8960@need 1200
8961@noindent
8962Now, we can add a new element on to this list by evaluating the
8963following expression:
8964@findex push, @r{example}
8965
8966@smallexample
8967(push "a third clause" example-list)
8968@end smallexample
8969
8970@need 800
8971@noindent
8972When we evaluate @code{example-list}, we find its value is:
8973
8974@smallexample
8975@group
8976example-list
8977 @result{} ("a third clause" "here is a clause" "another clause")
8978@end group
8979@end smallexample
8980
8981@noindent
8982Thus, the third clause is added to the list by @code{push}.
8983
8984@need 1200
8985Now for the second part of the @code{if} clause. This expression
8986keeps the kill ring from growing too long. It looks like this:
8987
8988@smallexample
8989@group
8990(if (> (length kill-ring) kill-ring-max)
8991 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
8992@end group
8993@end smallexample
8994
8995The code checks whether the length of the kill ring is greater than
8996the maximum permitted length. This is the value of
8997@code{kill-ring-max} (which is 60, by default). If the length of the
8998kill ring is too long, then this code sets the last element of the
8999kill ring to @code{nil}. It does this by using two functions,
9000@code{nthcdr} and @code{setcdr}.
9001
9002We looked at @code{setcdr} earlier (@pxref{setcdr, , @code{setcdr}}).
9003It sets the @sc{cdr} of a list, just as @code{setcar} sets the
9004@sc{car} of a list. In this case, however, @code{setcdr} will not be
9005setting the @sc{cdr} of the whole kill ring; the @code{nthcdr}
9006function is used to cause it to set the @sc{cdr} of the next to last
9007element of the kill ring---this means that since the @sc{cdr} of the
9008next to last element is the last element of the kill ring, it will set
9009the last element of the kill ring.
9010
9011@findex nthcdr, @r{example}
9012The @code{nthcdr} function works by repeatedly taking the @sc{cdr} of a
9013list---it takes the @sc{cdr} of the @sc{cdr} of the @sc{cdr}
9014@dots{} It does this @var{N} times and returns the results.
9015(@xref{nthcdr, , @code{nthcdr}}.)
9016
9017@findex setcdr, @r{example}
9018Thus, if we had a four element list that was supposed to be three
9019elements long, we could set the @sc{cdr} of the next to last element
9020to @code{nil}, and thereby shorten the list. (If you set the last
9021element to some other value than @code{nil}, which you could do, then
9022you would not have shortened the list. @xref{setcdr, ,
9023@code{setcdr}}.)
9024
9025You can see shortening by evaluating the following three expressions
9026in turn. First set the value of @code{trees} to @code{(maple oak pine
9027birch)}, then set the @sc{cdr} of its second @sc{cdr} to @code{nil}
9028and then find the value of @code{trees}:
9029
9030@smallexample
9031@group
9032(setq trees '(maple oak pine birch))
9033 @result{} (maple oak pine birch)
9034@end group
9035
9036@group
9037(setcdr (nthcdr 2 trees) nil)
9038 @result{} nil
9039
9040trees
9041 @result{} (maple oak pine)
9042@end group
9043@end smallexample
9044
9045@noindent
9046(The value returned by the @code{setcdr} expression is @code{nil} since
9047that is what the @sc{cdr} is set to.)
9048
9049To repeat, in @code{kill-new}, the @code{nthcdr} function takes the
9050@sc{cdr} a number of times that is one less than the maximum permitted
9051size of the kill ring and @code{setcdr} sets the @sc{cdr} of that
9052element (which will be the rest of the elements in the kill ring) to
9053@code{nil}. This prevents the kill ring from growing too long.
9054
9055@need 800
9056The next to last expression in the @code{kill-new} function is
9057
9058@smallexample
9059(setq kill-ring-yank-pointer kill-ring)
9060@end smallexample
9061
9062The @code{kill-ring-yank-pointer} is a global variable that is set to be
9063the @code{kill-ring}.
9064
9065Even though the @code{kill-ring-yank-pointer} is called a
9066@samp{pointer}, it is a variable just like the kill ring. However, the
9067name has been chosen to help humans understand how the variable is used.
9068
9069@need 1200
9070Now, to return to an early expression in the body of the function:
9071
9072@smallexample
9073@group
9074 (if (fboundp 'menu-bar-update-yank-menu)
9075 (menu-bar-update-yank-menu string (and replace (car kill-ring))))
9076@end group
9077@end smallexample
9078
9079@noindent
9080It starts with an @code{if} expression
9081
9082In this case, the expression tests first to see whether
9083@code{menu-bar-update-yank-menu} exists as a function, and if so,
9084calls it. The @code{fboundp} function returns true if the symbol it
9085is testing has a function definition that `is not void'. If the
9086symbol's function definition were void, we would receive an error
9087message, as we did when we created errors intentionally (@pxref{Making
9088Errors, , Generate an Error Message}).
9089
9090@noindent
9091The then-part contains an expression whose first element is the
9092function @code{and}.
9093
9094@findex and
9095The @code{and} special form evaluates each of its arguments until one
9096of the arguments returns a value of @code{nil}, in which case the
9097@code{and} expression returns @code{nil}; however, if none of the
9098arguments returns a value of @code{nil}, the value resulting from
9099evaluating the last argument is returned. (Since such a value is not
9100@code{nil}, it is considered true in Emacs Lisp.) In other words, an
9101@code{and} expression returns a true value only if all its arguments
9102are true. (@xref{Second Buffer Related Review}.)
9103
9104The expression determines whether the second argument to
9105@code{menu-bar-update-yank-menu} is true or not.
9106@ignore
9107 ;; If we're supposed to be extending an existing string, and that
9108 ;; string really is at the front of the menu, then update it in place.
9109@end ignore
9110
9111@code{menu-bar-update-yank-menu} is one of the functions that make it
9112possible to use the `Select and Paste' menu in the Edit item of a menu
9113bar; using a mouse, you can look at the various pieces of text you
9114have saved and select one piece to paste.
9115
9116The last expression in the @code{kill-new} function adds the newly
9117copied string to whatever facility exists for copying and pasting
9118among different programs running in a windowing system. In the X
9119Windowing system, for example, the @code{x-select-text} function takes
9120the string and stores it in memory operated by X. You can paste the
9121string in another program, such as an Xterm.
9122
9123@need 1200
9124The expression looks like this:
9125
9126@smallexample
9127@group
9128 (if interprogram-cut-function
9129 (funcall interprogram-cut-function string (not replace))))
9130@end group
9131@end smallexample
9132
9133If an @code{interprogram-cut-function} exists, then Emacs executes
9134@code{funcall}, which in turn calls its first argument as a function
9135and passes the remaining arguments to it. (Incidentally, as far as I
9136can see, this @code{if} expression could be replaced by an @code{and}
9137expression similar to the one in the first part of the function.)
9138
9139We are not going to discuss windowing systems and other programs
9140further, but merely note that this is a mechanism that enables GNU
9141Emacs to work easily and well with other programs.
9142
9143This code for placing text in the kill ring, either concatenated with
9144an existing element or as a new element, leads us to the code for
9145bringing back text that has been cut out of the buffer---the yank
9146commands. However, before discussing the yank commands, it is better
9147to learn how lists are implemented in a computer. This will make
9148clear such mysteries as the use of the term `pointer'. But before
9149that, we will digress into C.
9150
9151@ignore
9152@c is this true in Emacs 22? Does not seems to be
9153
9154 (If the @w{@code{(< end beg))}}
9155expression is true, @code{kill-append} prepends the string to the just
9156previously clipped text. For a detailed discussion, see
9157@ref{kill-append function, , The @code{kill-append} function}.)
9158
9159If you then yank back the text, i.e., `paste' it, you get both
9160pieces of text at once. That way, if you delete two words in a row,
9161and then yank them back, you get both words, in their proper order,
9162with one yank. (The @w{@code{(< end beg))}} expression makes sure the
9163order is correct.)
9164
9165On the other hand, if the previous command is not @code{kill-region},
9166then the @code{kill-new} function is called, which adds the text to
9167the kill ring as the latest item, and sets the
9168@code{kill-ring-yank-pointer} variable to point to it.
9169@end ignore
9170@ignore
9171
9172@c Evidently, changed for Emacs 22. The zap-to-char command does not
9173@c use the delete-and-extract-region function
9174
91752006 Oct 26, the Digression into C is now OK but should come after
9176copy-region-as-kill and filter-buffer-substring
9177
91782006 Oct 24
9179In Emacs 22,
9180copy-region-as-kill is short, 12 lines, and uses
9181filter-buffer-substring, which is longer, 39 lines
9182and has delete-and-extract-region in it.
9183delete-and-extract-region is written in C.
9184
9185see Initializing a Variable with @code{defvar}
9186@end ignore
9187
9188@node Digression into C, defvar, copy-region-as-kill, Cutting & Storing Text
9189@comment node-name, next, previous, up
9190@section Digression into C
9191@findex delete-and-extract-region
9192@cindex C, a digression into
9193@cindex Digression into C
9194
9195The @code{copy-region-as-kill} function (@pxref{copy-region-as-kill, ,
9196@code{copy-region-as-kill}}) uses the @code{filter-buffer-substring}
9197function, which in turn uses the @code{delete-and-extract-region}
9198function. It removes the contents of a region and you cannot get them
9199back.
9200
9201Unlike the other code discussed here, the
9202@code{delete-and-extract-region} function is not written in Emacs
9203Lisp; it is written in C and is one of the primitives of the GNU Emacs
9204system. Since it is very simple, I will digress briefly from Lisp and
9205describe it here.
9206
9207@c GNU Emacs 22 in /usr/local/src/emacs/src/editfns.c
9208@c the DEFUN for buffer-substring-no-properties
9209
9210@need 1500
9211Like many of the other Emacs primitives,
9212@code{delete-and-extract-region} is written as an instance of a C
9213macro, a macro being a template for code. The complete macro looks
9214like this:
9215
9216@smallexample
9217@group
9218DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
9219 Sbuffer_substring_no_properties, 2, 2, 0,
9220 doc: /* Return the characters of part of the buffer,
9221without the text properties.
9222The two arguments START and END are character positions;
9223they can be in either order. */)
9224 (start, end)
9225 Lisp_Object start, end;
9226@{
9227 register int b, e;
9228
9229 validate_region (&start, &end);
9230 b = XINT (start);
9231 e = XINT (end);
9232
9233 return make_buffer_string (b, e, 0);
9234@}
9235@end group
9236@end smallexample
9237
9238Without going into the details of the macro writing process, let me
9239point out that this macro starts with the word @code{DEFUN}. The word
9240@code{DEFUN} was chosen since the code serves the same purpose as
9241@code{defun} does in Lisp. (The @code{DEFUN} C macro is defined in
9242@file{emacs/src/lisp.h}.)
9243
9244The word @code{DEFUN} is followed by seven parts inside of
9245parentheses:
9246
9247@itemize @bullet
9248@item
9249The first part is the name given to the function in Lisp,
9250@code{delete-and-extract-region}.
9251
9252@item
9253The second part is the name of the function in C,
9254@code{Fdelete_and_extract_region}. By convention, it starts with
9255@samp{F}. Since C does not use hyphens in names, underscores are used
9256instead.
9257
9258@item
9259The third part is the name for the C constant structure that records
9260information on this function for internal use. It is the name of the
9261function in C but begins with an @samp{S} instead of an @samp{F}.
9262
9263@item
9264The fourth and fifth parts specify the minimum and maximum number of
9265arguments the function can have. This function demands exactly 2
9266arguments.
9267
9268@item
9269The sixth part is nearly like the argument that follows the
9270@code{interactive} declaration in a function written in Lisp: a letter
9271followed, perhaps, by a prompt. The only difference from the Lisp is
9272when the macro is called with no arguments. Then you write a @code{0}
9273(which is a `null string'), as in this macro.
9274
9275If you were to specify arguments, you would place them between
9276quotation marks. The C macro for @code{goto-char} includes
9277@code{"NGoto char: "} in this position to indicate that the function
9278expects a raw prefix, in this case, a numerical location in a buffer,
9279and provides a prompt.
9280
9281@item
9282The seventh part is a documentation string, just like the one for a
9283function written in Emacs Lisp, except that every newline must be
9284written explicitly as @samp{\n} followed by a backslash and carriage
9285return.
9286
9287@need 1000
9288Thus, the first two lines of documentation for @code{goto-char} are
9289written like this:
9290
9291@smallexample
9292@group
9293 "Set point to POSITION, a number or marker.\n\
9294Beginning of buffer is position (point-min), end is (point-max)."
9295@end group
9296@end smallexample
9297@end itemize
9298
9299@need 1200
9300In a C macro, the formal parameters come next, with a statement of
9301what kind of object they are, followed by what might be called the `body'
9302of the macro. For @code{delete-and-extract-region} the `body'
9303consists of the following four lines:
9304
9305@smallexample
9306@group
9307validate_region (&start, &end);
9308if (XINT (start) == XINT (end))
9309 return build_string ("");
9310return del_range_1 (XINT (start), XINT (end), 1, 1);
9311@end group
9312@end smallexample
9313
9314The @code{validate_region} function checks whether the values
9315passed as the beginning and end of the region are the proper type and
9316are within range. If the beginning and end positions are the same,
9317then return and empty string.
9318
9319The @code{del_range_1} function actually deletes the text. It is a
9320complex function we will not look into. It updates the buffer and
9321does other things. However, it is worth looking at the two arguments
9322passed to @code{del_range}. These are @w{@code{XINT (start)}} and
9323@w{@code{XINT (end)}}.
9324
9325As far as the C language is concerned, @code{start} and @code{end} are
9326two integers that mark the beginning and end of the region to be
9327deleted@footnote{More precisely, and requiring more expert knowledge
9328to understand, the two integers are of type `Lisp_Object', which can
9329also be a C union instead of an integer type.}.
9330
9331In early versions of Emacs, these two numbers were thirty-two bits
9332long, but the code is slowly being generalized to handle other
9333lengths. Three of the available bits are used to specify the type of
9334information; the remaining bits are used as `content'.
9335
9336@samp{XINT} is a C macro that extracts the relevant number from the
9337longer collection of bits; the three other bits are discarded.
9338
9339@need 800
9340The command in @code{delete-and-extract-region} looks like this:
9341
9342@smallexample
9343del_range_1 (XINT (start), XINT (end), 1, 1);
9344@end smallexample
9345
9346@noindent
9347It deletes the region between the beginning position, @code{start},
9348and the ending position, @code{end}.
9349
9350From the point of view of the person writing Lisp, Emacs is all very
9351simple; but hidden underneath is a great deal of complexity to make it
9352all work.
9353
9354@node defvar, cons & search-fwd Review, Digression into C, Cutting & Storing Text
9355@comment node-name, next, previous, up
9356@section Initializing a Variable with @code{defvar}
9357@findex defvar
9358@cindex Initializing a variable
9359@cindex Variable initialization
9360
9361@ignore
93622006 Oct 24
9363In Emacs 22,
9364copy-region-as-kill is short, 12 lines, and uses
9365filter-buffer-substring, which is longer, 39 lines
9366and has delete-and-extract-region in it.
9367delete-and-extract-region is written in C.
9368
9369see Initializing a Variable with @code{defvar}
9370
9371@end ignore
9372
9373The @code{copy-region-as-kill} function is written in Emacs Lisp. Two
9374functions within it, @code{kill-append} and @code{kill-new}, copy a
9375region in a buffer and save it in a variable called the
9376@code{kill-ring}. This section describes how the @code{kill-ring}
9377variable is created and initialized using the @code{defvar} special
9378form.
9379
9380(Again we note that the term @code{kill-ring} is a misnomer. The text
9381that is clipped out of the buffer can be brought back; it is not a ring
9382of corpses, but a ring of resurrectable text.)
9383
9384In Emacs Lisp, a variable such as the @code{kill-ring} is created and
9385given an initial value by using the @code{defvar} special form. The
9386name comes from ``define variable''.
9387
9388The @code{defvar} special form is similar to @code{setq} in that it sets
9389the value of a variable. It is unlike @code{setq} in two ways: first,
9390it only sets the value of the variable if the variable does not already
9391have a value. If the variable already has a value, @code{defvar} does
9392not override the existing value. Second, @code{defvar} has a
9393documentation string.
9394
9395(Another special form, @code{defcustom}, is designed for variables
9396that people customize. It has more features than @code{defvar}.
9397(@xref{defcustom, , Setting Variables with @code{defcustom}}.)
9398
9399@menu
9400* See variable current value::
9401* defvar and asterisk::
9402@end menu
9403
9404@node See variable current value, defvar and asterisk, defvar, defvar
9405@ifnottex
9406@unnumberedsubsec Seeing the Current Value of a Variable
9407@end ifnottex
9408
9409You can see the current value of a variable, any variable, by using
9410the @code{describe-variable} function, which is usually invoked by
9411typing @kbd{C-h v}. If you type @kbd{C-h v} and then @code{kill-ring}
9412(followed by @key{RET}) when prompted, you will see what is in your
9413current kill ring---this may be quite a lot! Conversely, if you have
9414been doing nothing this Emacs session except read this document, you
9415may have nothing in it. Also, you will see the documentation for
9416@code{kill-ring}:
9417
9418@smallexample
9419@group
9420Documentation:
9421List of killed text sequences.
9422Since the kill ring is supposed to interact nicely with cut-and-paste
9423facilities offered by window systems, use of this variable should
9424@end group
9425@group
9426interact nicely with `interprogram-cut-function' and
9427`interprogram-paste-function'. The functions `kill-new',
9428`kill-append', and `current-kill' are supposed to implement this
9429interaction; you may want to use them instead of manipulating the kill
9430ring directly.
9431@end group
9432@end smallexample
9433
9434@need 800
9435The kill ring is defined by a @code{defvar} in the following way:
9436
9437@smallexample
9438@group
9439(defvar kill-ring nil
9440 "List of killed text sequences.
9441@dots{}")
9442@end group
9443@end smallexample
9444
9445@noindent
9446In this variable definition, the variable is given an initial value of
9447@code{nil}, which makes sense, since if you have saved nothing, you want
9448nothing back if you give a @code{yank} command. The documentation
9449string is written just like the documentation string of a @code{defun}.
9450As with the documentation string of the @code{defun}, the first line of
9451the documentation should be a complete sentence, since some commands,
9452like @code{apropos}, print only the first line of documentation.
9453Succeeding lines should not be indented; otherwise they look odd when
9454you use @kbd{C-h v} (@code{describe-variable}).
9455
9456@node defvar and asterisk, , See variable current value, defvar
9457@subsection @code{defvar} and an asterisk
9458@findex defvar @r{for a user customizable variable}
9459@findex defvar @r{with an asterisk}
9460
9461In the past, Emacs used the @code{defvar} special form both for
9462internal variables that you would not expect a user to change and for
9463variables that you do expect a user to change. Although you can still
9464use @code{defvar} for user customizable variables, please use
9465@code{defcustom} instead, since that special form provides a path into
9466the Customization commands. (@xref{defcustom, , Specifying Variables
9467using @code{defcustom}}.)
9468
9469When you specified a variable using the @code{defvar} special form,
943157cf
GM
9470you could distinguish a variable that a user might want to change from
9471others by typing an asterisk, @samp{*}, in the first column of its
9472documentation string. For example:
8cda6f8f
GM
9473
9474@smallexample
9475@group
9476(defvar shell-command-default-error-buffer nil
9477 "*Buffer name for `shell-command' @dots{} error output.
9478@dots{} ")
9479@end group
9480@end smallexample
9481
9482@findex set-variable
9483@noindent
9484You could (and still can) use the @code{set-variable} command to
9485change the value of @code{shell-command-default-error-buffer}
9486temporarily. However, options set using @code{set-variable} are set
9487only for the duration of your editing session. The new values are not
9488saved between sessions. Each time Emacs starts, it reads the original
9489value, unless you change the value within your @file{.emacs} file,
9490either by setting it manually or by using @code{customize}.
9491@xref{Emacs Initialization, , Your @file{.emacs} File}.
9492
9493For me, the major use of the @code{set-variable} command is to suggest
9494variables that I might want to set in my @file{.emacs} file. There
9495are now more than 700 such variables --- far too many to remember
9496readily. Fortunately, you can press @key{TAB} after calling the
9497@code{M-x set-variable} command to see the list of variables.
9498(@xref{Examining, , Examining and Setting Variables, emacs,
9499The GNU Emacs Manual}.)
9500
9501@need 1250
9502@node cons & search-fwd Review, search Exercises, defvar, Cutting & Storing Text
9503@comment node-name, next, previous, up
9504@section Review
9505
9506Here is a brief summary of some recently introduced functions.
9507
9508@table @code
9509@item car
9510@itemx cdr
9511@code{car} returns the first element of a list; @code{cdr} returns the
9512second and subsequent elements of a list.
9513
9514@need 1250
9515For example:
9516
9517@smallexample
9518@group
9519(car '(1 2 3 4 5 6 7))
9520 @result{} 1
9521(cdr '(1 2 3 4 5 6 7))
9522 @result{} (2 3 4 5 6 7)
9523@end group
9524@end smallexample
9525
9526@item cons
9527@code{cons} constructs a list by prepending its first argument to its
9528second argument.
9529
9530@need 1250
9531For example:
9532
9533@smallexample
9534@group
9535(cons 1 '(2 3 4))
9536 @result{} (1 2 3 4)
9537@end group
9538@end smallexample
9539
9540@item funcall
9541@code{funcall} evaluates its first argument as a function. It passes
9542its remaining arguments to its first argument.
9543
9544@item nthcdr
9545Return the result of taking @sc{cdr} `n' times on a list.
9546@iftex
9547The
9548@tex
9549$n^{th}$
9550@end tex
9551@code{cdr}.
9552@end iftex
9553The `rest of the rest', as it were.
9554
9555@need 1250
9556For example:
9557
9558@smallexample
9559@group
9560(nthcdr 3 '(1 2 3 4 5 6 7))
9561 @result{} (4 5 6 7)
9562@end group
9563@end smallexample
9564
9565@item setcar
9566@itemx setcdr
9567@code{setcar} changes the first element of a list; @code{setcdr}
9568changes the second and subsequent elements of a list.
9569
9570@need 1250
9571For example:
9572
9573@smallexample
9574@group
9575(setq triple '(1 2 3))
9576
9577(setcar triple '37)
9578
9579triple
9580 @result{} (37 2 3)
9581
9582(setcdr triple '("foo" "bar"))
9583
9584triple
9585 @result{} (37 "foo" "bar")
9586@end group
9587@end smallexample
9588
9589@item progn
9590Evaluate each argument in sequence and then return the value of the
9591last.
9592
9593@need 1250
9594For example:
9595
9596@smallexample
9597@group
9598(progn 1 2 3 4)
9599 @result{} 4
9600@end group
9601@end smallexample
9602
9603@item save-restriction
9604Record whatever narrowing is in effect in the current buffer, if any,
9605and restore that narrowing after evaluating the arguments.
9606
9607@item search-forward
9608Search for a string, and if the string is found, move point. With a
9609regular expression, use the similar @code{re-search-forward}.
9610(@xref{Regexp Search, , Regular Expression Searches}, for an
9611explanation of regular expression patterns and searches.)
9612
9613@need 1250
9614@noindent
9615@code{search-forward} and @code{re-search-forward} take four
9616arguments:
9617
9618@enumerate
9619@item
9620The string or regular expression to search for.
9621
9622@item
9623Optionally, the limit of the search.
9624
9625@item
9626Optionally, what to do if the search fails, return @code{nil} or an
9627error message.
9628
9629@item
9630Optionally, how many times to repeat the search; if negative, the
9631search goes backwards.
9632@end enumerate
9633
9634@item kill-region
9635@itemx delete-and-extract-region
9636@itemx copy-region-as-kill
9637
9638@code{kill-region} cuts the text between point and mark from the
9639buffer and stores that text in the kill ring, so you can get it back
9640by yanking.
9641
9642@code{copy-region-as-kill} copies the text between point and mark into
9643the kill ring, from which you can get it by yanking. The function
9644does not cut or remove the text from the buffer.
9645@end table
9646
9647@code{delete-and-extract-region} removes the text between point and
9648mark from the buffer and throws it away. You cannot get it back.
9649(This is not an interactive command.)
9650
9651@need 1500
9652@node search Exercises, , cons & search-fwd Review, Cutting & Storing Text
9653@section Searching Exercises
9654
9655@itemize @bullet
9656@item
9657Write an interactive function that searches for a string. If the
9658search finds the string, leave point after it and display a message
9659that says ``Found!''. (Do not use @code{search-forward} for the name
9660of this function; if you do, you will overwrite the existing version of
9661@code{search-forward} that comes with Emacs. Use a name such as
9662@code{test-search} instead.)
9663
9664@item
9665Write a function that prints the third element of the kill ring in the
9666echo area, if any; if the kill ring does not contain a third element,
9667print an appropriate message.
9668@end itemize
9669
9670@node List Implementation, Yanking, Cutting & Storing Text, Top
9671@comment node-name, next, previous, up
9672@chapter How Lists are Implemented
9673@cindex Lists in a computer
9674
9675In Lisp, atoms are recorded in a straightforward fashion; if the
9676implementation is not straightforward in practice, it is, nonetheless,
9677straightforward in theory. The atom @samp{rose}, for example, is
9678recorded as the four contiguous letters @samp{r}, @samp{o}, @samp{s},
9679@samp{e}. A list, on the other hand, is kept differently. The mechanism
9680is equally simple, but it takes a moment to get used to the idea. A
9681list is kept using a series of pairs of pointers. In the series, the
9682first pointer in each pair points to an atom or to another list, and the
9683second pointer in each pair points to the next pair, or to the symbol
9684@code{nil}, which marks the end of the list.
9685
9686A pointer itself is quite simply the electronic address of what is
9687pointed to. Hence, a list is kept as a series of electronic addresses.
9688
9689@menu
9690* Lists diagrammed::
9691* Symbols as Chest:: Exploring a powerful metaphor.
9692* List Exercise::
9693@end menu
9694
9695@node Lists diagrammed, Symbols as Chest, List Implementation, List Implementation
9696@ifnottex
9697@unnumberedsec Lists diagrammed
9698@end ifnottex
9699
9700For example, the list @code{(rose violet buttercup)} has three elements,
9701@samp{rose}, @samp{violet}, and @samp{buttercup}. In the computer, the
9702electronic address of @samp{rose} is recorded in a segment of computer
9703memory along with the address that gives the electronic address of where
9704the atom @samp{violet} is located; and that address (the one that tells
9705where @samp{violet} is located) is kept along with an address that tells
9706where the address for the atom @samp{buttercup} is located.
9707
9708@need 1200
9709This sounds more complicated than it is and is easier seen in a diagram:
9710
9711@c clear print-postscript-figures
9712@c !!! cons-cell-diagram #1
9713@ifnottex
9714@smallexample
9715@group
9716 ___ ___ ___ ___ ___ ___
9717 |___|___|--> |___|___|--> |___|___|--> nil
9718 | | |
9719 | | |
9720 --> rose --> violet --> buttercup
9721@end group
9722@end smallexample
9723@end ifnottex
9724@ifset print-postscript-figures
9725@sp 1
9726@tex
9727@center @image{cons-1}
9728%%%% old method of including an image
9729% \input /usr/local/lib/tex/inputs/psfig.tex
9730% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-1.eps}}
9731% \catcode`\@=0 %
9732@end tex
9733@sp 1
9734@end ifset
9735@ifclear print-postscript-figures
9736@iftex
9737@smallexample
9738@group
9739 ___ ___ ___ ___ ___ ___
9740 |___|___|--> |___|___|--> |___|___|--> nil
9741 | | |
9742 | | |
9743 --> rose --> violet --> buttercup
9744@end group
9745@end smallexample
9746@end iftex
9747@end ifclear
9748
9749@noindent
9750In the diagram, each box represents a word of computer memory that
9751holds a Lisp object, usually in the form of a memory address. The boxes,
9752i.e.@: the addresses, are in pairs. Each arrow points to what the address
9753is the address of, either an atom or another pair of addresses. The
9754first box is the electronic address of @samp{rose} and the arrow points
9755to @samp{rose}; the second box is the address of the next pair of boxes,
9756the first part of which is the address of @samp{violet} and the second
9757part of which is the address of the next pair. The very last box
9758points to the symbol @code{nil}, which marks the end of the list.
9759
9760@need 1200
9761When a variable is set to a list with a function such as @code{setq},
9762it stores the address of the first box in the variable. Thus,
9763evaluation of the expression
9764
9765@smallexample
9766(setq bouquet '(rose violet buttercup))
9767@end smallexample
9768
9769@need 1250
9770@noindent
9771creates a situation like this:
9772
9773@c cons-cell-diagram #2
9774@ifnottex
9775@smallexample
9776@group
9777bouquet
9778 |
9779 | ___ ___ ___ ___ ___ ___
9780 --> |___|___|--> |___|___|--> |___|___|--> nil
9781 | | |
9782 | | |
9783 --> rose --> violet --> buttercup
9784@end group
9785@end smallexample
9786@end ifnottex
9787@ifset print-postscript-figures
9788@sp 1
9789@tex
9790@center @image{cons-2}
9791%%%% old method of including an image
9792% \input /usr/local/lib/tex/inputs/psfig.tex
9793% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-2.eps}}
9794% \catcode`\@=0 %
9795@end tex
9796@sp 1
9797@end ifset
9798@ifclear print-postscript-figures
9799@iftex
9800@smallexample
9801@group
9802bouquet
9803 |
9804 | ___ ___ ___ ___ ___ ___
9805 --> |___|___|--> |___|___|--> |___|___|--> nil
9806 | | |
9807 | | |
9808 --> rose --> violet --> buttercup
9809@end group
9810@end smallexample
9811@end iftex
9812@end ifclear
9813
9814@noindent
9815In this example, the symbol @code{bouquet} holds the address of the first
9816pair of boxes.
9817
9818@need 1200
9819This same list can be illustrated in a different sort of box notation
9820like this:
9821
9822@c cons-cell-diagram #2a
9823@ifnottex
9824@smallexample
9825@group
9826bouquet
9827 |
9828 | -------------- --------------- ----------------
9829 | | car | cdr | | car | cdr | | car | cdr |
9830 -->| rose | o------->| violet | o------->| butter- | nil |
9831 | | | | | | | cup | |
9832 -------------- --------------- ----------------
9833@end group
9834@end smallexample
9835@end ifnottex
9836@ifset print-postscript-figures
9837@sp 1
9838@tex
9839@center @image{cons-2a}
9840%%%% old method of including an image
9841% \input /usr/local/lib/tex/inputs/psfig.tex
9842% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-2a.eps}}
9843% \catcode`\@=0 %
9844@end tex
9845@sp 1
9846@end ifset
9847@ifclear print-postscript-figures
9848@iftex
9849@smallexample
9850@group
9851bouquet
9852 |
9853 | -------------- --------------- ----------------
9854 | | car | cdr | | car | cdr | | car | cdr |
9855 -->| rose | o------->| violet | o------->| butter- | nil |
9856 | | | | | | | cup | |
9857 -------------- --------------- ----------------
9858@end group
9859@end smallexample
9860@end iftex
9861@end ifclear
9862
9863(Symbols consist of more than pairs of addresses, but the structure of
9864a symbol is made up of addresses. Indeed, the symbol @code{bouquet}
9865consists of a group of address-boxes, one of which is the address of
9866the printed word @samp{bouquet}, a second of which is the address of a
9867function definition attached to the symbol, if any, a third of which
9868is the address of the first pair of address-boxes for the list
9869@code{(rose violet buttercup)}, and so on. Here we are showing that
9870the symbol's third address-box points to the first pair of
9871address-boxes for the list.)
9872
9873If a symbol is set to the @sc{cdr} of a list, the list itself is not
9874changed; the symbol simply has an address further down the list. (In
9875the jargon, @sc{car} and @sc{cdr} are `non-destructive'.) Thus,
9876evaluation of the following expression
9877
9878@smallexample
9879(setq flowers (cdr bouquet))
9880@end smallexample
9881
9882@need 800
9883@noindent
9884produces this:
9885
9886@c cons-cell-diagram #3
9887@ifnottex
9888@sp 1
9889@smallexample
9890@group
9891bouquet flowers
9892 | |
9893 | ___ ___ | ___ ___ ___ ___
9894 --> | | | --> | | | | | |
9895 |___|___|----> |___|___|--> |___|___|--> nil
9896 | | |
9897 | | |
9898 --> rose --> violet --> buttercup
9899@end group
9900@end smallexample
9901@sp 1
9902@end ifnottex
9903@ifset print-postscript-figures
9904@sp 1
9905@tex
9906@center @image{cons-3}
9907%%%% old method of including an image
9908% \input /usr/local/lib/tex/inputs/psfig.tex
9909% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-3.eps}}
9910% \catcode`\@=0 %
9911@end tex
9912@sp 1
9913@end ifset
9914@ifclear print-postscript-figures
9915@iftex
9916@sp 1
9917@smallexample
9918@group
9919bouquet flowers
9920 | |
9921 | ___ ___ | ___ ___ ___ ___
9922 --> | | | --> | | | | | |
9923 |___|___|----> |___|___|--> |___|___|--> nil
9924 | | |
9925 | | |
9926 --> rose --> violet --> buttercup
9927@end group
9928@end smallexample
9929@sp 1
9930@end iftex
9931@end ifclear
9932
9933@noindent
9934The value of @code{flowers} is @code{(violet buttercup)}, which is
9935to say, the symbol @code{flowers} holds the address of the pair of
9936address-boxes, the first of which holds the address of @code{violet},
9937and the second of which holds the address of @code{buttercup}.
9938
9939A pair of address-boxes is called a @dfn{cons cell} or @dfn{dotted
9940pair}. @xref{Cons Cell Type, , Cons Cell and List Types, elisp, The GNU Emacs Lisp
9941Reference Manual}, and @ref{Dotted Pair Notation, , Dotted Pair
9942Notation, elisp, The GNU Emacs Lisp Reference Manual}, for more
9943information about cons cells and dotted pairs.
9944
9945@need 1200
9946The function @code{cons} adds a new pair of addresses to the front of
9947a series of addresses like that shown above. For example, evaluating
9948the expression
9949
9950@smallexample
9951(setq bouquet (cons 'lily bouquet))
9952@end smallexample
9953
9954@need 1500
9955@noindent
9956produces:
9957
9958@c cons-cell-diagram #4
9959@ifnottex
9960@sp 1
9961@smallexample
9962@group
9963bouquet flowers
9964 | |
9965 | ___ ___ ___ ___ | ___ ___ ___ ___
9966 --> | | | | | | --> | | | | | |
9967 |___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
9968 | | | |
9969 | | | |
9970 --> lily --> rose --> violet --> buttercup
9971@end group
9972@end smallexample
9973@sp 1
9974@end ifnottex
9975@ifset print-postscript-figures
9976@sp 1
9977@tex
9978@center @image{cons-4}
9979%%%% old method of including an image
9980% \input /usr/local/lib/tex/inputs/psfig.tex
9981% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-4.eps}}
9982% \catcode`\@=0 %
9983@end tex
9984@sp 1
9985@end ifset
9986@ifclear print-postscript-figures
9987@iftex
9988@sp 1
9989@smallexample
9990@group
9991bouquet flowers
9992 | |
9993 | ___ ___ ___ ___ | ___ ___ ___ ___
9994 --> | | | | | | --> | | | | | |
9995 |___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
9996 | | | |
9997 | | | |
9998 --> lily --> rose --> violet --> buttercup
9999@end group
10000@end smallexample
10001@sp 1
10002@end iftex
10003@end ifclear
10004
10005@need 1200
10006@noindent
10007However, this does not change the value of the symbol
10008@code{flowers}, as you can see by evaluating the following,
10009
10010@smallexample
10011(eq (cdr (cdr bouquet)) flowers)
10012@end smallexample
10013
10014@noindent
10015which returns @code{t} for true.
10016
10017Until it is reset, @code{flowers} still has the value
10018@code{(violet buttercup)}; that is, it has the address of the cons
10019cell whose first address is of @code{violet}. Also, this does not
10020alter any of the pre-existing cons cells; they are all still there.
10021
10022Thus, in Lisp, to get the @sc{cdr} of a list, you just get the address
10023of the next cons cell in the series; to get the @sc{car} of a list,
10024you get the address of the first element of the list; to @code{cons} a
10025new element on a list, you add a new cons cell to the front of the list.
10026That is all there is to it! The underlying structure of Lisp is
10027brilliantly simple!
10028
10029And what does the last address in a series of cons cells refer to? It
10030is the address of the empty list, of @code{nil}.
10031
10032In summary, when a Lisp variable is set to a value, it is provided with
10033the address of the list to which the variable refers.
10034
10035@node Symbols as Chest, List Exercise, Lists diagrammed, List Implementation
10036@section Symbols as a Chest of Drawers
10037@cindex Symbols as a Chest of Drawers
10038@cindex Chest of Drawers, metaphor for a symbol
10039@cindex Drawers, Chest of, metaphor for a symbol
10040
10041In an earlier section, I suggested that you might imagine a symbol as
10042being a chest of drawers. The function definition is put in one
10043drawer, the value in another, and so on. What is put in the drawer
10044holding the value can be changed without affecting the contents of the
10045drawer holding the function definition, and vice-verse.
10046
10047Actually, what is put in each drawer is the address of the value or
10048function definition. It is as if you found an old chest in the attic,
10049and in one of its drawers you found a map giving you directions to
10050where the buried treasure lies.
10051
10052(In addition to its name, symbol definition, and variable value, a
10053symbol has a `drawer' for a @dfn{property list} which can be used to
10054record other information. Property lists are not discussed here; see
10055@ref{Property Lists, , Property Lists, elisp, The GNU Emacs Lisp
10056Reference Manual}.)
10057
10058@need 1500
10059Here is a fanciful representation:
10060
10061@c chest-of-drawers diagram
10062@ifnottex
10063@sp 1
10064@smallexample
10065@group
10066 Chest of Drawers Contents of Drawers
10067
10068 __ o0O0o __
10069 / \
10070 ---------------------
10071 | directions to | [map to]
10072 | symbol name | bouquet
10073 | |
10074 +---------------------+
10075 | directions to |
10076 | symbol definition | [none]
10077 | |
10078 +---------------------+
10079 | directions to | [map to]
10080 | variable value | (rose violet buttercup)
10081 | |
10082 +---------------------+
10083 | directions to |
10084 | property list | [not described here]
10085 | |
10086 +---------------------+
10087 |/ \|
10088@end group
10089@end smallexample
10090@sp 1
10091@end ifnottex
10092@ifset print-postscript-figures
10093@sp 1
10094@tex
10095@center @image{drawers}
10096%%%% old method of including an image
10097% \input /usr/local/lib/tex/inputs/psfig.tex
10098% \centerline{\psfig{figure=/usr/local/lib/emacs/man/drawers.eps}}
10099% \catcode`\@=0 %
10100@end tex
10101@sp 1
10102@end ifset
10103@ifclear print-postscript-figures
10104@iftex
10105@sp 1
10106@smallexample
10107@group
10108 Chest of Drawers Contents of Drawers
10109
10110 __ o0O0o __
10111 / \
10112 ---------------------
10113 | directions to | [map to]
10114 | symbol name | bouquet
10115 | |
10116 +---------------------+
10117 | directions to |
10118 | symbol definition | [none]
10119 | |
10120 +---------------------+
10121 | directions to | [map to]
10122 | variable value | (rose violet buttercup)
10123 | |
10124 +---------------------+
10125 | directions to |
10126 | property list | [not described here]
10127 | |
10128 +---------------------+
10129 |/ \|
10130@end group
10131@end smallexample
10132@sp 1
10133@end iftex
10134@end ifclear
10135
10136@node List Exercise, , Symbols as Chest, List Implementation
10137@section Exercise
10138
10139Set @code{flowers} to @code{violet} and @code{buttercup}. Cons two
10140more flowers on to this list and set this new list to
10141@code{more-flowers}. Set the @sc{car} of @code{flowers} to a fish.
10142What does the @code{more-flowers} list now contain?
10143
10144@node Yanking, Loops & Recursion, List Implementation, Top
10145@comment node-name, next, previous, up
10146@chapter Yanking Text Back
10147@findex yank
10148@cindex Text retrieval
10149@cindex Retrieving text
10150@cindex Pasting text
10151
10152Whenever you cut text out of a buffer with a `kill' command in GNU Emacs,
10153you can bring it back with a `yank' command. The text that is cut out of
10154the buffer is put in the kill ring and the yank commands insert the
10155appropriate contents of the kill ring back into a buffer (not necessarily
10156the original buffer).
10157
10158A simple @kbd{C-y} (@code{yank}) command inserts the first item from
10159the kill ring into the current buffer. If the @kbd{C-y} command is
10160followed immediately by @kbd{M-y}, the first element is replaced by
10161the second element. Successive @kbd{M-y} commands replace the second
10162element with the third, fourth, or fifth element, and so on. When the
10163last element in the kill ring is reached, it is replaced by the first
10164element and the cycle is repeated. (Thus the kill ring is called a
10165`ring' rather than just a `list'. However, the actual data structure
10166that holds the text is a list.
10167@xref{Kill Ring, , Handling the Kill Ring}, for the details of how the
10168list is handled as a ring.)
10169
10170@menu
10171* Kill Ring Overview::
10172* kill-ring-yank-pointer:: The kill ring is a list.
10173* yank nthcdr Exercises:: The @code{kill-ring-yank-pointer} variable.
10174@end menu
10175
10176@node Kill Ring Overview, kill-ring-yank-pointer, Yanking, Yanking
10177@comment node-name, next, previous, up
10178@section Kill Ring Overview
10179@cindex Kill ring overview
10180
10181The kill ring is a list of textual strings. This is what it looks like:
10182
10183@smallexample
10184("some text" "a different piece of text" "yet more text")
10185@end smallexample
10186
10187If this were the contents of my kill ring and I pressed @kbd{C-y}, the
10188string of characters saying @samp{some text} would be inserted in this
10189buffer where my cursor is located.
10190
10191The @code{yank} command is also used for duplicating text by copying it.
10192The copied text is not cut from the buffer, but a copy of it is put on the
10193kill ring and is inserted by yanking it back.
10194
10195Three functions are used for bringing text back from the kill ring:
10196@code{yank}, which is usually bound to @kbd{C-y}; @code{yank-pop},
10197which is usually bound to @kbd{M-y}; and @code{rotate-yank-pointer},
10198which is used by the two other functions.
10199
10200These functions refer to the kill ring through a variable called the
10201@code{kill-ring-yank-pointer}. Indeed, the insertion code for both the
10202@code{yank} and @code{yank-pop} functions is:
10203
10204@smallexample
10205(insert (car kill-ring-yank-pointer))
10206@end smallexample
10207
10208@noindent
10209(Well, no more. In GNU Emacs 22, the function has been replaced by
10210@code{insert-for-yank} which calls @code{insert-for-yank-1}
10211repetitively for each @code{yank-handler} segment. In turn,
10212@code{insert-for-yank-1} strips text properties from the inserted text
10213according to @code{yank-excluded-properties}. Otherwise, it is just
10214like @code{insert}. We will stick with plain @code{insert} since it
10215is easier to understand.)
10216
10217To begin to understand how @code{yank} and @code{yank-pop} work, it is
10218first necessary to look at the @code{kill-ring-yank-pointer} variable.
10219
10220@node kill-ring-yank-pointer, yank nthcdr Exercises, Kill Ring Overview, Yanking
10221@comment node-name, next, previous, up
10222@section The @code{kill-ring-yank-pointer} Variable
10223
10224@code{kill-ring-yank-pointer} is a variable, just as @code{kill-ring} is
10225a variable. It points to something by being bound to the value of what
10226it points to, like any other Lisp variable.
10227
10228@need 1000
10229Thus, if the value of the kill ring is:
10230
10231@smallexample
10232("some text" "a different piece of text" "yet more text")
10233@end smallexample
10234
10235@need 1250
10236@noindent
10237and the @code{kill-ring-yank-pointer} points to the second clause, the
10238value of @code{kill-ring-yank-pointer} is:
10239
10240@smallexample
10241("a different piece of text" "yet more text")
10242@end smallexample
10243
10244As explained in the previous chapter (@pxref{List Implementation}), the
10245computer does not keep two different copies of the text being pointed to
10246by both the @code{kill-ring} and the @code{kill-ring-yank-pointer}. The
10247words ``a different piece of text'' and ``yet more text'' are not
10248duplicated. Instead, the two Lisp variables point to the same pieces of
10249text. Here is a diagram:
10250
10251@c cons-cell-diagram #5
10252@ifnottex
10253@smallexample
10254@group
10255kill-ring kill-ring-yank-pointer
10256 | |
10257 | ___ ___ | ___ ___ ___ ___
10258 ---> | | | --> | | | | | |
10259 |___|___|----> |___|___|--> |___|___|--> nil
10260 | | |
10261 | | |
10262 | | --> "yet more text"
10263 | |
10264 | --> "a different piece of text"
10265 |
10266 --> "some text"
10267@end group
10268@end smallexample
10269@sp 1
10270@end ifnottex
10271@ifset print-postscript-figures
10272@sp 1
10273@tex
10274@center @image{cons-5}
10275%%%% old method of including an image
10276% \input /usr/local/lib/tex/inputs/psfig.tex
10277% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-5.eps}}
10278% \catcode`\@=0 %
10279@end tex
10280@sp 1
10281@end ifset
10282@ifclear print-postscript-figures
10283@iftex
10284@smallexample
10285@group
10286kill-ring kill-ring-yank-pointer
10287 | |
10288 | ___ ___ | ___ ___ ___ ___
10289 ---> | | | --> | | | | | |
10290 |___|___|----> |___|___|--> |___|___|--> nil
10291 | | |
10292 | | |
10293 | | --> "yet more text"
10294 | |
10295 | --> "a different piece of text
10296 |
10297 --> "some text"
10298@end group
10299@end smallexample
10300@sp 1
10301@end iftex
10302@end ifclear
10303
10304Both the variable @code{kill-ring} and the variable
10305@code{kill-ring-yank-pointer} are pointers. But the kill ring itself is
10306usually described as if it were actually what it is composed of. The
10307@code{kill-ring} is spoken of as if it were the list rather than that it
10308points to the list. Conversely, the @code{kill-ring-yank-pointer} is
10309spoken of as pointing to a list.
10310
10311These two ways of talking about the same thing sound confusing at first but
10312make sense on reflection. The kill ring is generally thought of as the
10313complete structure of data that holds the information of what has recently
10314been cut out of the Emacs buffers. The @code{kill-ring-yank-pointer}
10315on the other hand, serves to indicate---that is, to `point to'---that part
10316of the kill ring of which the first element (the @sc{car}) will be
10317inserted.
10318
10319@ignore
10320In GNU Emacs 22, the @code{kill-new} function calls
10321
10322@code{(setq kill-ring-yank-pointer kill-ring)}
10323
10324(defun rotate-yank-pointer (arg)
10325 "Rotate the yanking point in the kill ring.
10326With argument, rotate that many kills forward (or backward, if negative)."
10327 (interactive "p")
10328 (current-kill arg))
10329
10330(defun current-kill (n &optional do-not-move)
10331 "Rotate the yanking point by N places, and then return that kill.
10332If N is zero, `interprogram-paste-function' is set, and calling it
10333returns a string, then that string is added to the front of the
10334kill ring and returned as the latest kill.
10335If optional arg DO-NOT-MOVE is non-nil, then don't actually move the
10336yanking point; just return the Nth kill forward."
10337 (let ((interprogram-paste (and (= n 0)
10338 interprogram-paste-function
10339 (funcall interprogram-paste-function))))
10340 (if interprogram-paste
10341 (progn
10342 ;; Disable the interprogram cut function when we add the new
10343 ;; text to the kill ring, so Emacs doesn't try to own the
10344 ;; selection, with identical text.
10345 (let ((interprogram-cut-function nil))
10346 (kill-new interprogram-paste))
10347 interprogram-paste)
10348 (or kill-ring (error "Kill ring is empty"))
10349 (let ((ARGth-kill-element
10350 (nthcdr (mod (- n (length kill-ring-yank-pointer))
10351 (length kill-ring))
10352 kill-ring)))
10353 (or do-not-move
10354 (setq kill-ring-yank-pointer ARGth-kill-element))
10355 (car ARGth-kill-element)))))
10356
10357@end ignore
10358
10359@need 1500
10360@node yank nthcdr Exercises, , kill-ring-yank-pointer, Yanking
10361@section Exercises with @code{yank} and @code{nthcdr}
10362
10363@itemize @bullet
10364@item
10365Using @kbd{C-h v} (@code{describe-variable}), look at the value of
10366your kill ring. Add several items to your kill ring; look at its
10367value again. Using @kbd{M-y} (@code{yank-pop)}, move all the way
10368around the kill ring. How many items were in your kill ring? Find
10369the value of @code{kill-ring-max}. Was your kill ring full, or could
10370you have kept more blocks of text within it?
10371
10372@item
10373Using @code{nthcdr} and @code{car}, construct a series of expressions
10374to return the first, second, third, and fourth elements of a list.
10375@end itemize
10376
10377@node Loops & Recursion, Regexp Search, Yanking, Top
10378@comment node-name, next, previous, up
10379@chapter Loops and Recursion
10380@cindex Loops and recursion
10381@cindex Recursion and loops
10382@cindex Repetition (loops)
10383
10384Emacs Lisp has two primary ways to cause an expression, or a series of
10385expressions, to be evaluated repeatedly: one uses a @code{while}
10386loop, and the other uses @dfn{recursion}.
10387
10388Repetition can be very valuable. For example, to move forward four
10389sentences, you need only write a program that will move forward one
10390sentence and then repeat the process four times. Since a computer does
10391not get bored or tired, such repetitive action does not have the
10392deleterious effects that excessive or the wrong kinds of repetition can
10393have on humans.
10394
10395People mostly write Emacs Lisp functions using @code{while} loops and
10396their kin; but you can use recursion, which provides a very powerful
10397way to think about and then to solve problems@footnote{You can write
10398recursive functions to be frugal or wasteful of mental or computer
10399resources; as it happens, methods that people find easy---that are
10400frugal of `mental resources'---sometimes use considerable computer
10401resources. Emacs was designed to run on machines that we now consider
10402limited and its default settings are conservative. You may want to
10403increase the values of @code{max-specpdl-size} and
10404@code{max-lisp-eval-depth}. In my @file{.emacs} file, I set them to
1040515 and 30 times their default value.}.
10406
10407@menu
10408* while:: Causing a stretch of code to repeat.
10409* dolist dotimes::
10410* Recursion:: Causing a function to call itself.
10411* Looping exercise::
10412@end menu
10413
10414@node while, dolist dotimes, Loops & Recursion, Loops & Recursion
10415@comment node-name, next, previous, up
10416@section @code{while}
10417@cindex Loops
10418@findex while
10419
10420The @code{while} special form tests whether the value returned by
10421evaluating its first argument is true or false. This is similar to what
10422the Lisp interpreter does with an @code{if}; what the interpreter does
10423next, however, is different.
10424
10425In a @code{while} expression, if the value returned by evaluating the
10426first argument is false, the Lisp interpreter skips the rest of the
10427expression (the @dfn{body} of the expression) and does not evaluate it.
10428However, if the value is true, the Lisp interpreter evaluates the body
10429of the expression and then again tests whether the first argument to
10430@code{while} is true or false. If the value returned by evaluating the
10431first argument is again true, the Lisp interpreter again evaluates the
10432body of the expression.
10433
10434@need 1200
10435The template for a @code{while} expression looks like this:
10436
10437@smallexample
10438@group
10439(while @var{true-or-false-test}
10440 @var{body}@dots{})
10441@end group
10442@end smallexample
10443
10444@menu
10445* Looping with while:: Repeat so long as test returns true.
10446* Loop Example:: A @code{while} loop that uses a list.
10447* print-elements-of-list:: Uses @code{while}, @code{car}, @code{cdr}.
10448* Incrementing Loop:: A loop with an incrementing counter.
10449* Incrementing Loop Details::
10450* Decrementing Loop:: A loop with a decrementing counter.
10451@end menu
10452
10453@node Looping with while, Loop Example, while, while
10454@ifnottex
10455@unnumberedsubsec Looping with @code{while}
10456@end ifnottex
10457
10458So long as the true-or-false-test of the @code{while} expression
10459returns a true value when it is evaluated, the body is repeatedly
10460evaluated. This process is called a loop since the Lisp interpreter
10461repeats the same thing again and again, like an airplane doing a loop.
10462When the result of evaluating the true-or-false-test is false, the
10463Lisp interpreter does not evaluate the rest of the @code{while}
10464expression and `exits the loop'.
10465
10466Clearly, if the value returned by evaluating the first argument to
10467@code{while} is always true, the body following will be evaluated
10468again and again @dots{} and again @dots{} forever. Conversely, if the
10469value returned is never true, the expressions in the body will never
10470be evaluated. The craft of writing a @code{while} loop consists of
10471choosing a mechanism such that the true-or-false-test returns true
10472just the number of times that you want the subsequent expressions to
10473be evaluated, and then have the test return false.
10474
10475The value returned by evaluating a @code{while} is the value of the
10476true-or-false-test. An interesting consequence of this is that a
10477@code{while} loop that evaluates without error will return @code{nil}
10478or false regardless of whether it has looped 1 or 100 times or none at
10479all. A @code{while} expression that evaluates successfully never
10480returns a true value! What this means is that @code{while} is always
10481evaluated for its side effects, which is to say, the consequences of
10482evaluating the expressions within the body of the @code{while} loop.
10483This makes sense. It is not the mere act of looping that is desired,
10484but the consequences of what happens when the expressions in the loop
10485are repeatedly evaluated.
10486
10487@node Loop Example, print-elements-of-list, Looping with while, while
10488@comment node-name, next, previous, up
10489@subsection A @code{while} Loop and a List
10490
10491A common way to control a @code{while} loop is to test whether a list
10492has any elements. If it does, the loop is repeated; but if it does not,
10493the repetition is ended. Since this is an important technique, we will
10494create a short example to illustrate it.
10495
10496A simple way to test whether a list has elements is to evaluate the
10497list: if it has no elements, it is an empty list and will return the
10498empty list, @code{()}, which is a synonym for @code{nil} or false. On
10499the other hand, a list with elements will return those elements when it
10500is evaluated. Since Emacs Lisp considers as true any value that is not
10501@code{nil}, a list that returns elements will test true in a
10502@code{while} loop.
10503
10504@need 1200
10505For example, you can set the variable @code{empty-list} to @code{nil} by
10506evaluating the following @code{setq} expression:
10507
10508@smallexample
10509(setq empty-list ())
10510@end smallexample
10511
10512@noindent
10513After evaluating the @code{setq} expression, you can evaluate the
10514variable @code{empty-list} in the usual way, by placing the cursor after
10515the symbol and typing @kbd{C-x C-e}; @code{nil} will appear in your
10516echo area:
10517
10518@smallexample
10519empty-list
10520@end smallexample
10521
10522On the other hand, if you set a variable to be a list with elements, the
10523list will appear when you evaluate the variable, as you can see by
10524evaluating the following two expressions:
10525
10526@smallexample
10527@group
10528(setq animals '(gazelle giraffe lion tiger))
10529
10530animals
10531@end group
10532@end smallexample
10533
10534Thus, to create a @code{while} loop that tests whether there are any
10535items in the list @code{animals}, the first part of the loop will be
10536written like this:
10537
10538@smallexample
10539@group
10540(while animals
10541 @dots{}
10542@end group
10543@end smallexample
10544
10545@noindent
10546When the @code{while} tests its first argument, the variable
10547@code{animals} is evaluated. It returns a list. So long as the list
10548has elements, the @code{while} considers the results of the test to be
10549true; but when the list is empty, it considers the results of the test
10550to be false.
10551
10552To prevent the @code{while} loop from running forever, some mechanism
10553needs to be provided to empty the list eventually. An oft-used
10554technique is to have one of the subsequent forms in the @code{while}
10555expression set the value of the list to be the @sc{cdr} of the list.
10556Each time the @code{cdr} function is evaluated, the list will be made
10557shorter, until eventually only the empty list will be left. At this
10558point, the test of the @code{while} loop will return false, and the
10559arguments to the @code{while} will no longer be evaluated.
10560
10561For example, the list of animals bound to the variable @code{animals}
10562can be set to be the @sc{cdr} of the original list with the
10563following expression:
10564
10565@smallexample
10566(setq animals (cdr animals))
10567@end smallexample
10568
10569@noindent
10570If you have evaluated the previous expressions and then evaluate this
10571expression, you will see @code{(giraffe lion tiger)} appear in the echo
10572area. If you evaluate the expression again, @code{(lion tiger)} will
10573appear in the echo area. If you evaluate it again and yet again,
10574@code{(tiger)} appears and then the empty list, shown by @code{nil}.
10575
10576A template for a @code{while} loop that uses the @code{cdr} function
10577repeatedly to cause the true-or-false-test eventually to test false
10578looks like this:
10579
10580@smallexample
10581@group
10582(while @var{test-whether-list-is-empty}
10583 @var{body}@dots{}
10584 @var{set-list-to-cdr-of-list})
10585@end group
10586@end smallexample
10587
10588This test and use of @code{cdr} can be put together in a function that
10589goes through a list and prints each element of the list on a line of its
10590own.
10591
10592@node print-elements-of-list, Incrementing Loop, Loop Example, while
10593@subsection An Example: @code{print-elements-of-list}
10594@findex print-elements-of-list
10595
10596The @code{print-elements-of-list} function illustrates a @code{while}
10597loop with a list.
10598
10599@cindex @file{*scratch*} buffer
10600The function requires several lines for its output. If you are
10601reading this in a recent instance of GNU Emacs,
10602@c GNU Emacs 21, GNU Emacs 22, or a later version,
10603you can evaluate the following expression inside of Info, as usual.
10604
10605If you are using an earlier version of Emacs, you need to copy the
10606necessary expressions to your @file{*scratch*} buffer and evaluate
10607them there. This is because the echo area had only one line in the
10608earlier versions.
10609
10610You can copy the expressions by marking the beginning of the region
10611with @kbd{C-@key{SPC}} (@code{set-mark-command}), moving the cursor to
10612the end of the region and then copying the region using @kbd{M-w}
10613(@code{kill-ring-save}, which calls @code{copy-region-as-kill} and
10614then provides visual feedback). In the @file{*scratch*}
10615buffer, you can yank the expressions back by typing @kbd{C-y}
10616(@code{yank}).
10617
10618After you have copied the expressions to the @file{*scratch*} buffer,
10619evaluate each expression in turn. Be sure to evaluate the last
10620expression, @code{(print-elements-of-list animals)}, by typing
10621@kbd{C-u C-x C-e}, that is, by giving an argument to
10622@code{eval-last-sexp}. This will cause the result of the evaluation
10623to be printed in the @file{*scratch*} buffer instead of being printed
10624in the echo area. (Otherwise you will see something like this in your
10625echo area: @code{^Jgazelle^J^Jgiraffe^J^Jlion^J^Jtiger^Jnil}, in which
10626each @samp{^J} stands for a `newline'.)
10627
10628@need 1500
10629In a recent instance of GNU Emacs, you can evaluate these expressions
10630directly in the Info buffer, and the echo area will grow to show the
10631results.
10632
10633@smallexample
10634@group
10635(setq animals '(gazelle giraffe lion tiger))
10636
10637(defun print-elements-of-list (list)
10638 "Print each element of LIST on a line of its own."
10639 (while list
10640 (print (car list))
10641 (setq list (cdr list))))
10642
10643(print-elements-of-list animals)
10644@end group
10645@end smallexample
10646
10647@need 1200
10648@noindent
10649When you evaluate the three expressions in sequence, you will see
10650this:
10651
10652@smallexample
10653@group
10654gazelle
10655
10656giraffe
10657
10658lion
10659
10660tiger
10661nil
10662@end group
10663@end smallexample
10664
10665Each element of the list is printed on a line of its own (that is what
10666the function @code{print} does) and then the value returned by the
10667function is printed. Since the last expression in the function is the
10668@code{while} loop, and since @code{while} loops always return
10669@code{nil}, a @code{nil} is printed after the last element of the list.
10670
10671@node Incrementing Loop, Incrementing Loop Details, print-elements-of-list, while
10672@comment node-name, next, previous, up
10673@subsection A Loop with an Incrementing Counter
10674
10675A loop is not useful unless it stops when it ought. Besides
10676controlling a loop with a list, a common way of stopping a loop is to
10677write the first argument as a test that returns false when the correct
10678number of repetitions are complete. This means that the loop must
10679have a counter---an expression that counts how many times the loop
10680repeats itself.
10681
10682@node Incrementing Loop Details, Decrementing Loop, Incrementing Loop, while
10683@ifnottex
10684@unnumberedsubsec Details of an Incrementing Loop
10685@end ifnottex
10686
10687The test for a loop with an incrementing counter can be an expression
10688such as @code{(< count desired-number)} which returns @code{t} for
10689true if the value of @code{count} is less than the
10690@code{desired-number} of repetitions and @code{nil} for false if the
10691value of @code{count} is equal to or is greater than the
10692@code{desired-number}. The expression that increments the count can
10693be a simple @code{setq} such as @code{(setq count (1+ count))}, where
10694@code{1+} is a built-in function in Emacs Lisp that adds 1 to its
10695argument. (The expression @w{@code{(1+ count)}} has the same result
10696as @w{@code{(+ count 1)}}, but is easier for a human to read.)
10697
10698@need 1250
10699The template for a @code{while} loop controlled by an incrementing
10700counter looks like this:
10701
10702@smallexample
10703@group
10704@var{set-count-to-initial-value}
10705(while (< count desired-number) ; @r{true-or-false-test}
10706 @var{body}@dots{}
10707 (setq count (1+ count))) ; @r{incrementer}
10708@end group
10709@end smallexample
10710
10711@noindent
10712Note that you need to set the initial value of @code{count}; usually it
10713is set to 1.
10714
10715@menu
10716* Incrementing Example:: Counting pebbles in a triangle.
10717* Inc Example parts:: The parts of the function definition.
10718* Inc Example altogether:: Putting the function definition together.
10719@end menu
10720
10721@node Incrementing Example, Inc Example parts, Incrementing Loop Details, Incrementing Loop Details
10722@unnumberedsubsubsec Example with incrementing counter
10723
10724Suppose you are playing on the beach and decide to make a triangle of
10725pebbles, putting one pebble in the first row, two in the second row,
10726three in the third row and so on, like this:
10727
10728@sp 1
10729@c pebble diagram
10730@ifnottex
10731@smallexample
10732@group
10733 *
10734 * *
10735 * * *
10736 * * * *
10737@end group
10738@end smallexample
10739@end ifnottex
10740@iftex
10741@smallexample
10742@group
10743 @bullet{}
10744 @bullet{} @bullet{}
10745 @bullet{} @bullet{} @bullet{}
10746 @bullet{} @bullet{} @bullet{} @bullet{}
10747@end group
10748@end smallexample
10749@end iftex
10750@sp 1
10751
10752@noindent
10753(About 2500 years ago, Pythagoras and others developed the beginnings of
10754number theory by considering questions such as this.)
10755
10756Suppose you want to know how many pebbles you will need to make a
10757triangle with 7 rows?
10758
10759Clearly, what you need to do is add up the numbers from 1 to 7. There
10760are two ways to do this; start with the smallest number, one, and add up
10761the list in sequence, 1, 2, 3, 4 and so on; or start with the largest
10762number and add the list going down: 7, 6, 5, 4 and so on. Because both
10763mechanisms illustrate common ways of writing @code{while} loops, we will
10764create two examples, one counting up and the other counting down. In
10765this first example, we will start with 1 and add 2, 3, 4 and so on.
10766
10767If you are just adding up a short list of numbers, the easiest way to do
10768it is to add up all the numbers at once. However, if you do not know
10769ahead of time how many numbers your list will have, or if you want to be
10770prepared for a very long list, then you need to design your addition so
10771that what you do is repeat a simple process many times instead of doing
10772a more complex process once.
10773
10774For example, instead of adding up all the pebbles all at once, what you
10775can do is add the number of pebbles in the first row, 1, to the number
10776in the second row, 2, and then add the total of those two rows to the
10777third row, 3. Then you can add the number in the fourth row, 4, to the
10778total of the first three rows; and so on.
10779
10780The critical characteristic of the process is that each repetitive
10781action is simple. In this case, at each step we add only two numbers,
10782the number of pebbles in the row and the total already found. This
10783process of adding two numbers is repeated again and again until the last
10784row has been added to the total of all the preceding rows. In a more
10785complex loop the repetitive action might not be so simple, but it will
10786be simpler than doing everything all at once.
10787
10788@node Inc Example parts, Inc Example altogether, Incrementing Example, Incrementing Loop Details
10789@unnumberedsubsubsec The parts of the function definition
10790
10791The preceding analysis gives us the bones of our function definition:
10792first, we will need a variable that we can call @code{total} that will
10793be the total number of pebbles. This will be the value returned by
10794the function.
10795
10796Second, we know that the function will require an argument: this
10797argument will be the total number of rows in the triangle. It can be
10798called @code{number-of-rows}.
10799
10800Finally, we need a variable to use as a counter. We could call this
10801variable @code{counter}, but a better name is @code{row-number}. That
10802is because what the counter does in this function is count rows, and a
10803program should be written to be as understandable as possible.
10804
10805When the Lisp interpreter first starts evaluating the expressions in the
10806function, the value of @code{total} should be set to zero, since we have
10807not added anything to it. Then the function should add the number of
10808pebbles in the first row to the total, and then add the number of
10809pebbles in the second to the total, and then add the number of
10810pebbles in the third row to the total, and so on, until there are no
10811more rows left to add.
10812
10813Both @code{total} and @code{row-number} are used only inside the
10814function, so they can be declared as local variables with @code{let}
10815and given initial values. Clearly, the initial value for @code{total}
10816should be 0. The initial value of @code{row-number} should be 1,
10817since we start with the first row. This means that the @code{let}
10818statement will look like this:
10819
10820@smallexample
10821@group
10822 (let ((total 0)
10823 (row-number 1))
10824 @var{body}@dots{})
10825@end group
10826@end smallexample
10827
10828After the internal variables are declared and bound to their initial
10829values, we can begin the @code{while} loop. The expression that serves
10830as the test should return a value of @code{t} for true so long as the
10831@code{row-number} is less than or equal to the @code{number-of-rows}.
10832(If the expression tests true only so long as the row number is less
10833than the number of rows in the triangle, the last row will never be
10834added to the total; hence the row number has to be either less than or
10835equal to the number of rows.)
10836
10837@need 1500
10838@findex <= @r{(less than or equal)}
10839Lisp provides the @code{<=} function that returns true if the value of
10840its first argument is less than or equal to the value of its second
10841argument and false otherwise. So the expression that the @code{while}
10842will evaluate as its test should look like this:
10843
10844@smallexample
10845(<= row-number number-of-rows)
10846@end smallexample
10847
10848The total number of pebbles can be found by repeatedly adding the number
10849of pebbles in a row to the total already found. Since the number of
10850pebbles in the row is equal to the row number, the total can be found by
10851adding the row number to the total. (Clearly, in a more complex
10852situation, the number of pebbles in the row might be related to the row
10853number in a more complicated way; if this were the case, the row number
10854would be replaced by the appropriate expression.)
10855
10856@smallexample
10857(setq total (+ total row-number))
10858@end smallexample
10859
10860@noindent
10861What this does is set the new value of @code{total} to be equal to the
10862sum of adding the number of pebbles in the row to the previous total.
10863
10864After setting the value of @code{total}, the conditions need to be
10865established for the next repetition of the loop, if there is one. This
10866is done by incrementing the value of the @code{row-number} variable,
10867which serves as a counter. After the @code{row-number} variable has
10868been incremented, the true-or-false-test at the beginning of the
10869@code{while} loop tests whether its value is still less than or equal to
10870the value of the @code{number-of-rows} and if it is, adds the new value
10871of the @code{row-number} variable to the @code{total} of the previous
10872repetition of the loop.
10873
10874@need 1200
10875The built-in Emacs Lisp function @code{1+} adds 1 to a number, so the
10876@code{row-number} variable can be incremented with this expression:
10877
10878@smallexample
10879(setq row-number (1+ row-number))
10880@end smallexample
10881
10882@node Inc Example altogether, , Inc Example parts, Incrementing Loop Details
10883@unnumberedsubsubsec Putting the function definition together
10884
10885We have created the parts for the function definition; now we need to
10886put them together.
10887
10888@need 800
10889First, the contents of the @code{while} expression:
10890
10891@smallexample
10892@group
10893(while (<= row-number number-of-rows) ; @r{true-or-false-test}
10894 (setq total (+ total row-number))
10895 (setq row-number (1+ row-number))) ; @r{incrementer}
10896@end group
10897@end smallexample
10898
10899Along with the @code{let} expression varlist, this very nearly
10900completes the body of the function definition. However, it requires
10901one final element, the need for which is somewhat subtle.
10902
10903The final touch is to place the variable @code{total} on a line by
10904itself after the @code{while} expression. Otherwise, the value returned
10905by the whole function is the value of the last expression that is
10906evaluated in the body of the @code{let}, and this is the value
10907returned by the @code{while}, which is always @code{nil}.
10908
10909This may not be evident at first sight. It almost looks as if the
10910incrementing expression is the last expression of the whole function.
10911But that expression is part of the body of the @code{while}; it is the
10912last element of the list that starts with the symbol @code{while}.
10913Moreover, the whole of the @code{while} loop is a list within the body
10914of the @code{let}.
10915
10916@need 1250
10917In outline, the function will look like this:
10918
10919@smallexample
10920@group
10921(defun @var{name-of-function} (@var{argument-list})
10922 "@var{documentation}@dots{}"
10923 (let (@var{varlist})
10924 (while (@var{true-or-false-test})
10925 @var{body-of-while}@dots{} )
10926 @dots{} )) ; @r{Need final expression here.}
10927@end group
10928@end smallexample
10929
10930The result of evaluating the @code{let} is what is going to be returned
10931by the @code{defun} since the @code{let} is not embedded within any
10932containing list, except for the @code{defun} as a whole. However, if
10933the @code{while} is the last element of the @code{let} expression, the
10934function will always return @code{nil}. This is not what we want!
10935Instead, what we want is the value of the variable @code{total}. This
10936is returned by simply placing the symbol as the last element of the list
10937starting with @code{let}. It gets evaluated after the preceding
10938elements of the list are evaluated, which means it gets evaluated after
10939it has been assigned the correct value for the total.
10940
10941It may be easier to see this by printing the list starting with
10942@code{let} all on one line. This format makes it evident that the
10943@var{varlist} and @code{while} expressions are the second and third
10944elements of the list starting with @code{let}, and the @code{total} is
10945the last element:
10946
10947@smallexample
10948@group
10949(let (@var{varlist}) (while (@var{true-or-false-test}) @var{body-of-while}@dots{} ) total)
10950@end group
10951@end smallexample
10952
10953@need 1200
10954Putting everything together, the @code{triangle} function definition
10955looks like this:
10956
10957@smallexample
10958@group
10959(defun triangle (number-of-rows) ; @r{Version with}
10960 ; @r{ incrementing counter.}
10961 "Add up the number of pebbles in a triangle.
10962The first row has one pebble, the second row two pebbles,
10963the third row three pebbles, and so on.
10964The argument is NUMBER-OF-ROWS."
10965@end group
10966@group
10967 (let ((total 0)
10968 (row-number 1))
10969 (while (<= row-number number-of-rows)
10970 (setq total (+ total row-number))
10971 (setq row-number (1+ row-number)))
10972 total))
10973@end group
10974@end smallexample
10975
10976@need 1200
10977After you have installed @code{triangle} by evaluating the function, you
10978can try it out. Here are two examples:
10979
10980@smallexample
10981@group
10982(triangle 4)
10983
10984(triangle 7)
10985@end group
10986@end smallexample
10987
10988@noindent
10989The sum of the first four numbers is 10 and the sum of the first seven
10990numbers is 28.
10991
10992@node Decrementing Loop, , Incrementing Loop Details, while
10993@comment node-name, next, previous, up
10994@subsection Loop with a Decrementing Counter
10995
10996Another common way to write a @code{while} loop is to write the test
10997so that it determines whether a counter is greater than zero. So long
10998as the counter is greater than zero, the loop is repeated. But when
10999the counter is equal to or less than zero, the loop is stopped. For
11000this to work, the counter has to start out greater than zero and then
11001be made smaller and smaller by a form that is evaluated
11002repeatedly.
11003
11004The test will be an expression such as @code{(> counter 0)} which
11005returns @code{t} for true if the value of @code{counter} is greater
11006than zero, and @code{nil} for false if the value of @code{counter} is
11007equal to or less than zero. The expression that makes the number
11008smaller and smaller can be a simple @code{setq} such as @code{(setq
11009counter (1- counter))}, where @code{1-} is a built-in function in
11010Emacs Lisp that subtracts 1 from its argument.
11011
11012@need 1250
11013The template for a decrementing @code{while} loop looks like this:
11014
11015@smallexample
11016@group
11017(while (> counter 0) ; @r{true-or-false-test}
11018 @var{body}@dots{}
11019 (setq counter (1- counter))) ; @r{decrementer}
11020@end group
11021@end smallexample
11022
11023@menu
11024* Decrementing Example:: More pebbles on the beach.
11025* Dec Example parts:: The parts of the function definition.
11026* Dec Example altogether:: Putting the function definition together.
11027@end menu
11028
11029@node Decrementing Example, Dec Example parts, Decrementing Loop, Decrementing Loop
11030@unnumberedsubsubsec Example with decrementing counter
11031
11032To illustrate a loop with a decrementing counter, we will rewrite the
11033@code{triangle} function so the counter decreases to zero.
11034
11035This is the reverse of the earlier version of the function. In this
11036case, to find out how many pebbles are needed to make a triangle with
110373 rows, add the number of pebbles in the third row, 3, to the number
11038in the preceding row, 2, and then add the total of those two rows to
11039the row that precedes them, which is 1.
11040
11041Likewise, to find the number of pebbles in a triangle with 7 rows, add
11042the number of pebbles in the seventh row, 7, to the number in the
11043preceding row, which is 6, and then add the total of those two rows to
11044the row that precedes them, which is 5, and so on. As in the previous
11045example, each addition only involves adding two numbers, the total of
11046the rows already added up and the number of pebbles in the row that is
11047being added to the total. This process of adding two numbers is
11048repeated again and again until there are no more pebbles to add.
11049
11050We know how many pebbles to start with: the number of pebbles in the
11051last row is equal to the number of rows. If the triangle has seven
11052rows, the number of pebbles in the last row is 7. Likewise, we know how
11053many pebbles are in the preceding row: it is one less than the number in
11054the row.
11055
11056@node Dec Example parts, Dec Example altogether, Decrementing Example, Decrementing Loop
11057@unnumberedsubsubsec The parts of the function definition
11058
11059We start with three variables: the total number of rows in the
11060triangle; the number of pebbles in a row; and the total number of
11061pebbles, which is what we want to calculate. These variables can be
11062named @code{number-of-rows}, @code{number-of-pebbles-in-row}, and
11063@code{total}, respectively.
11064
11065Both @code{total} and @code{number-of-pebbles-in-row} are used only
11066inside the function and are declared with @code{let}. The initial
11067value of @code{total} should, of course, be zero. However, the
11068initial value of @code{number-of-pebbles-in-row} should be equal to
11069the number of rows in the triangle, since the addition will start with
11070the longest row.
11071
11072@need 1250
11073This means that the beginning of the @code{let} expression will look
11074like this:
11075
11076@smallexample
11077@group
11078(let ((total 0)
11079 (number-of-pebbles-in-row number-of-rows))
11080 @var{body}@dots{})
11081@end group
11082@end smallexample
11083
11084The total number of pebbles can be found by repeatedly adding the number
11085of pebbles in a row to the total already found, that is, by repeatedly
11086evaluating the following expression:
11087
11088@smallexample
11089(setq total (+ total number-of-pebbles-in-row))
11090@end smallexample
11091
11092@noindent
11093After the @code{number-of-pebbles-in-row} is added to the @code{total},
11094the @code{number-of-pebbles-in-row} should be decremented by one, since
11095the next time the loop repeats, the preceding row will be
11096added to the total.
11097
11098The number of pebbles in a preceding row is one less than the number of
11099pebbles in a row, so the built-in Emacs Lisp function @code{1-} can be
11100used to compute the number of pebbles in the preceding row. This can be
11101done with the following expression:
11102
11103@smallexample
11104@group
11105(setq number-of-pebbles-in-row
11106 (1- number-of-pebbles-in-row))
11107@end group
11108@end smallexample
11109
11110Finally, we know that the @code{while} loop should stop making repeated
11111additions when there are no pebbles in a row. So the test for
11112the @code{while} loop is simply:
11113
11114@smallexample
11115(while (> number-of-pebbles-in-row 0)
11116@end smallexample
11117
11118@node Dec Example altogether, , Dec Example parts, Decrementing Loop
11119@unnumberedsubsubsec Putting the function definition together
11120
11121We can put these expressions together to create a function definition
11122that works. However, on examination, we find that one of the local
11123variables is unneeded!
11124
11125@need 1250
11126The function definition looks like this:
11127
11128@smallexample
11129@group
11130;;; @r{First subtractive version.}
11131(defun triangle (number-of-rows)
11132 "Add up the number of pebbles in a triangle."
11133 (let ((total 0)
11134 (number-of-pebbles-in-row number-of-rows))
11135 (while (> number-of-pebbles-in-row 0)
11136 (setq total (+ total number-of-pebbles-in-row))
11137 (setq number-of-pebbles-in-row
11138 (1- number-of-pebbles-in-row)))
11139 total))
11140@end group
11141@end smallexample
11142
11143As written, this function works.
11144
11145However, we do not need @code{number-of-pebbles-in-row}.
11146
11147@cindex Argument as local variable
11148When the @code{triangle} function is evaluated, the symbol
11149@code{number-of-rows} will be bound to a number, giving it an initial
11150value. That number can be changed in the body of the function as if
11151it were a local variable, without any fear that such a change will
11152effect the value of the variable outside of the function. This is a
11153very useful characteristic of Lisp; it means that the variable
11154@code{number-of-rows} can be used anywhere in the function where
11155@code{number-of-pebbles-in-row} is used.
11156
11157@need 800
11158Here is a second version of the function written a bit more cleanly:
11159
11160@smallexample
11161@group
11162(defun triangle (number) ; @r{Second version.}
11163 "Return sum of numbers 1 through NUMBER inclusive."
11164 (let ((total 0))
11165 (while (> number 0)
11166 (setq total (+ total number))
11167 (setq number (1- number)))
11168 total))
11169@end group
11170@end smallexample
11171
11172In brief, a properly written @code{while} loop will consist of three parts:
11173
11174@enumerate
11175@item
11176A test that will return false after the loop has repeated itself the
11177correct number of times.
11178
11179@item
11180An expression the evaluation of which will return the value desired
11181after being repeatedly evaluated.
11182
11183@item
11184An expression to change the value passed to the true-or-false-test so
11185that the test returns false after the loop has repeated itself the right
11186number of times.
11187@end enumerate
11188
11189@node dolist dotimes, Recursion, while, Loops & Recursion
11190@comment node-name, next, previous, up
11191@section Save your time: @code{dolist} and @code{dotimes}
11192
11193In addition to @code{while}, both @code{dolist} and @code{dotimes}
11194provide for looping. Sometimes these are quicker to write than the
11195equivalent @code{while} loop. Both are Lisp macros. (@xref{Macros, ,
11196Macros, elisp, The GNU Emacs Lisp Reference Manual}. )
11197
11198@code{dolist} works like a @code{while} loop that `@sc{cdr}s down a
11199list': @code{dolist} automatically shortens the list each time it
11200loops---takes the @sc{cdr} of the list---and binds the @sc{car} of
11201each shorter version of the list to the first of its arguments.
11202
11203@code{dotimes} loops a specific number of times: you specify the number.
11204
11205@menu
11206* dolist::
11207* dotimes::
11208@end menu
11209
11210@node dolist, dotimes, dolist dotimes, dolist dotimes
11211@unnumberedsubsubsec The @code{dolist} Macro
11212@findex dolist
11213
11214Suppose, for example, you want to reverse a list, so that
11215``first'' ``second'' ``third'' becomes ``third'' ``second'' ``first''.
11216
11217@need 1250
11218In practice, you would use the @code{reverse} function, like this:
11219
11220@smallexample
11221@group
11222(setq animals '(gazelle giraffe lion tiger))
11223
11224(reverse animals)
11225@end group
11226@end smallexample
11227
11228@need 800
11229@noindent
11230Here is how you could reverse the list using a @code{while} loop:
11231
11232@smallexample
11233@group
11234(setq animals '(gazelle giraffe lion tiger))
11235
11236(defun reverse-list-with-while (list)
11237 "Using while, reverse the order of LIST."
11238 (let (value) ; make sure list starts empty
11239 (while list
11240 (setq value (cons (car list) value))
11241 (setq list (cdr list)))
11242 value))
11243
11244(reverse-list-with-while animals)
11245@end group
11246@end smallexample
11247
11248@need 800
11249@noindent
11250And here is how you could use the @code{dolist} macro:
11251
11252@smallexample
11253@group
11254(setq animals '(gazelle giraffe lion tiger))
11255
11256(defun reverse-list-with-dolist (list)
11257 "Using dolist, reverse the order of LIST."
11258 (let (value) ; make sure list starts empty
11259 (dolist (element list value)
11260 (setq value (cons element value)))))
11261
11262(reverse-list-with-dolist animals)
11263@end group
11264@end smallexample
11265
11266@need 1250
11267@noindent
11268In Info, you can place your cursor after the closing parenthesis of
11269each expression and type @kbd{C-x C-e}; in each case, you should see
11270
11271@smallexample
11272(tiger lion giraffe gazelle)
11273@end smallexample
11274
11275@noindent
11276in the echo area.
11277
11278For this example, the existing @code{reverse} function is obviously best.
11279The @code{while} loop is just like our first example (@pxref{Loop
11280Example, , A @code{while} Loop and a List}). The @code{while} first
11281checks whether the list has elements; if so, it constructs a new list
11282by adding the first element of the list to the existing list (which in
11283the first iteration of the loop is @code{nil}). Since the second
11284element is prepended in front of the first element, and the third
11285element is prepended in front of the second element, the list is reversed.
11286
11287In the expression using a @code{while} loop,
11288the @w{@code{(setq list (cdr list))}}
11289expression shortens the list, so the @code{while} loop eventually
11290stops. In addition, it provides the @code{cons} expression with a new
11291first element by creating a new and shorter list at each repetition of
11292the loop.
11293
11294The @code{dolist} expression does very much the same as the
11295@code{while} expression, except that the @code{dolist} macro does some
11296of the work you have to do when writing a @code{while} expression.
11297
11298Like a @code{while} loop, a @code{dolist} loops. What is different is
11299that it automatically shortens the list each time it loops --- it
11300`@sc{cdr}s down the list' on its own --- and it automatically binds
11301the @sc{car} of each shorter version of the list to the first of its
11302arguments.
11303
11304In the example, the @sc{car} of each shorter version of the list is
11305referred to using the symbol @samp{element}, the list itself is called
11306@samp{list}, and the value returned is called @samp{value}. The
11307remainder of the @code{dolist} expression is the body.
11308
11309The @code{dolist} expression binds the @sc{car} of each shorter
11310version of the list to @code{element} and then evaluates the body of
11311the expression; and repeats the loop. The result is returned in
11312@code{value}.
11313
11314@node dotimes, , dolist, dolist dotimes
11315@unnumberedsubsubsec The @code{dotimes} Macro
11316@findex dotimes
11317
11318The @code{dotimes} macro is similar to @code{dolist}, except that it
11319loops a specific number of times.
11320
11321The first argument to @code{dotimes} is assigned the numbers 0, 1, 2
11322and so forth each time around the loop, and the value of the third
11323argument is returned. You need to provide the value of the second
11324argument, which is how many times the macro loops.
11325
11326@need 1250
11327For example, the following binds the numbers from 0 up to, but not
11328including, the number 3 to the first argument, @var{number}, and then
11329constructs a list of the three numbers. (The first number is 0, the
11330second number is 1, and the third number is 2; this makes a total of
11331three numbers in all, starting with zero as the first number.)
11332
11333@smallexample
11334@group
11335(let (value) ; otherwise a value is a void variable
11336 (dotimes (number 3 value)
11337 (setq value (cons number value))))
11338
11339@result{} (2 1 0)
11340@end group
11341@end smallexample
11342
11343@noindent
11344@code{dotimes} returns @code{value}, so the way to use
11345@code{dotimes} is to operate on some expression @var{number} number of
11346times and then return the result, either as a list or an atom.
11347
11348@need 1250
11349Here is an example of a @code{defun} that uses @code{dotimes} to add
11350up the number of pebbles in a triangle.
11351
11352@smallexample
11353@group
11354(defun triangle-using-dotimes (number-of-rows)
11355 "Using dotimes, add up the number of pebbles in a triangle."
11356(let ((total 0)) ; otherwise a total is a void variable
11357 (dotimes (number number-of-rows total)
11358 (setq total (+ total (1+ number))))))
11359
11360(triangle-using-dotimes 4)
11361@end group
11362@end smallexample
11363
11364@node Recursion, Looping exercise, dolist dotimes, Loops & Recursion
11365@comment node-name, next, previous, up
11366@section Recursion
11367@cindex Recursion
11368
11369A recursive function contains code that tells the Lisp interpreter to
11370call a program that runs exactly like itself, but with slightly
11371different arguments. The code runs exactly the same because it has
11372the same name. However, even though the program has the same name, it
11373is not the same entity. It is different. In the jargon, it is a
11374different `instance'.
11375
11376Eventually, if the program is written correctly, the `slightly
11377different arguments' will become sufficiently different from the first
11378arguments that the final instance will stop.
11379
11380@menu
11381* Building Robots:: Same model, different serial number ...
11382* Recursive Definition Parts:: Walk until you stop ...
11383* Recursion with list:: Using a list as the test whether to recurse.
11384* Recursive triangle function::
11385* Recursion with cond::
11386* Recursive Patterns:: Often used templates.
11387* No Deferment:: Don't store up work ...
11388* No deferment solution::
11389@end menu
11390
11391@node Building Robots, Recursive Definition Parts, Recursion, Recursion
11392@comment node-name, next, previous, up
11393@subsection Building Robots: Extending the Metaphor
11394@cindex Building robots
11395@cindex Robots, building
11396
11397It is sometimes helpful to think of a running program as a robot that
11398does a job. In doing its job, a recursive function calls on a second
11399robot to help it. The second robot is identical to the first in every
11400way, except that the second robot helps the first and has been
11401passed different arguments than the first.
11402
11403In a recursive function, the second robot may call a third; and the
11404third may call a fourth, and so on. Each of these is a different
11405entity; but all are clones.
11406
11407Since each robot has slightly different instructions---the arguments
11408will differ from one robot to the next---the last robot should know
11409when to stop.
11410
11411Let's expand on the metaphor in which a computer program is a robot.
11412
11413A function definition provides the blueprints for a robot. When you
11414install a function definition, that is, when you evaluate a
11415@code{defun} special form, you install the necessary equipment to
11416build robots. It is as if you were in a factory, setting up an
11417assembly line. Robots with the same name are built according to the
11418same blueprints. So they have, as it were, the same `model number',
11419but a different `serial number'.
11420
11421We often say that a recursive function `calls itself'. What we mean
11422is that the instructions in a recursive function cause the Lisp
11423interpreter to run a different function that has the same name and
11424does the same job as the first, but with different arguments.
11425
11426It is important that the arguments differ from one instance to the
11427next; otherwise, the process will never stop.
11428
11429@node Recursive Definition Parts, Recursion with list, Building Robots, Recursion
11430@comment node-name, next, previous, up
11431@subsection The Parts of a Recursive Definition
11432@cindex Parts of a Recursive Definition
11433@cindex Recursive Definition Parts
11434
11435A recursive function typically contains a conditional expression which
11436has three parts:
11437
11438@enumerate
11439@item
11440A true-or-false-test that determines whether the function is called
11441again, here called the @dfn{do-again-test}.
11442
11443@item
11444The name of the function. When this name is called, a new instance of
11445the function---a new robot, as it were---is created and told what to do.
11446
11447@item
11448An expression that returns a different value each time the function is
11449called, here called the @dfn{next-step-expression}. Consequently, the
11450argument (or arguments) passed to the new instance of the function
11451will be different from that passed to the previous instance. This
11452causes the conditional expression, the @dfn{do-again-test}, to test
11453false after the correct number of repetitions.
11454@end enumerate
11455
11456Recursive functions can be much simpler than any other kind of
11457function. Indeed, when people first start to use them, they often look
11458so mysteriously simple as to be incomprehensible. Like riding a
11459bicycle, reading a recursive function definition takes a certain knack
11460which is hard at first but then seems simple.
11461
11462@need 1200
11463There are several different common recursive patterns. A very simple
11464pattern looks like this:
11465
11466@smallexample
11467@group
11468(defun @var{name-of-recursive-function} (@var{argument-list})
11469 "@var{documentation}@dots{}"
11470 (if @var{do-again-test}
11471 @var{body}@dots{}
11472 (@var{name-of-recursive-function}
11473 @var{next-step-expression})))
11474@end group
11475@end smallexample
11476
11477Each time a recursive function is evaluated, a new instance of it is
11478created and told what to do. The arguments tell the instance what to do.
11479
11480An argument is bound to the value of the next-step-expression. Each
11481instance runs with a different value of the next-step-expression.
11482
11483The value in the next-step-expression is used in the do-again-test.
11484
11485The value returned by the next-step-expression is passed to the new
11486instance of the function, which evaluates it (or some
11487transmogrification of it) to determine whether to continue or stop.
11488The next-step-expression is designed so that the do-again-test returns
11489false when the function should no longer be repeated.
11490
11491The do-again-test is sometimes called the @dfn{stop condition},
11492since it stops the repetitions when it tests false.
11493
11494@node Recursion with list, Recursive triangle function, Recursive Definition Parts, Recursion
11495@comment node-name, next, previous, up
11496@subsection Recursion with a List
11497
11498The example of a @code{while} loop that printed the elements of a list
11499of numbers can be written recursively. Here is the code, including
11500an expression to set the value of the variable @code{animals} to a list.
11501
11502If you are using GNU Emacs 20 or before, this example must be copied
11503to the @file{*scratch*} buffer and each expression must be evaluated
11504there. Use @kbd{C-u C-x C-e} to evaluate the
11505@code{(print-elements-recursively animals)} expression so that the
11506results are printed in the buffer; otherwise the Lisp interpreter will
11507try to squeeze the results into the one line of the echo area.
11508
11509Also, place your cursor immediately after the last closing parenthesis
11510of the @code{print-elements-recursively} function, before the comment.
11511Otherwise, the Lisp interpreter will try to evaluate the comment.
11512
11513If you are using a more recent version of Emacs, you can evaluate this
11514expression directly in Info.
11515
11516@findex print-elements-recursively
11517@smallexample
11518@group
11519(setq animals '(gazelle giraffe lion tiger))
11520
11521(defun print-elements-recursively (list)
11522 "Print each element of LIST on a line of its own.
11523Uses recursion."
11524 (when list ; @r{do-again-test}
11525 (print (car list)) ; @r{body}
11526 (print-elements-recursively ; @r{recursive call}
11527 (cdr list)))) ; @r{next-step-expression}
11528
11529(print-elements-recursively animals)
11530@end group
11531@end smallexample
11532
11533The @code{print-elements-recursively} function first tests whether
11534there is any content in the list; if there is, the function prints the
11535first element of the list, the @sc{car} of the list. Then the
11536function `invokes itself', but gives itself as its argument, not the
11537whole list, but the second and subsequent elements of the list, the
11538@sc{cdr} of the list.
11539
11540Put another way, if the list is not empty, the function invokes
11541another instance of code that is similar to the initial code, but is a
11542different thread of execution, with different arguments than the first
11543instance.
11544
11545Put in yet another way, if the list is not empty, the first robot
2d7752a0 11546assembles a second robot and tells it what to do; the second robot is
8cda6f8f
GM
11547a different individual from the first, but is the same model.
11548
11549When the second evaluation occurs, the @code{when} expression is
11550evaluated and if true, prints the first element of the list it
11551receives as its argument (which is the second element of the original
11552list). Then the function `calls itself' with the @sc{cdr} of the list
11553it is invoked with, which (the second time around) is the @sc{cdr} of
11554the @sc{cdr} of the original list.
11555
11556Note that although we say that the function `calls itself', what we
11557mean is that the Lisp interpreter assembles and instructs a new
11558instance of the program. The new instance is a clone of the first,
11559but is a separate individual.
11560
11561Each time the function `invokes itself', it invokes itself on a
11562shorter version of the original list. It creates a new instance that
11563works on a shorter list.
11564
11565Eventually, the function invokes itself on an empty list. It creates
11566a new instance whose argument is @code{nil}. The conditional expression
11567tests the value of @code{list}. Since the value of @code{list} is
11568@code{nil}, the @code{when} expression tests false so the then-part is
11569not evaluated. The function as a whole then returns @code{nil}.
11570
11571@need 1200
a9097c6d
KB
11572When you evaluate the expression @code{(print-elements-recursively
11573animals)} in the @file{*scratch*} buffer, you see this result:
8cda6f8f
GM
11574
11575@smallexample
11576@group
11577gazelle
11578
11579giraffe
11580
11581lion
11582
11583tiger
11584nil
11585@end group
11586@end smallexample
11587
11588@need 2000
11589@node Recursive triangle function, Recursion with cond, Recursion with list, Recursion
11590@comment node-name, next, previous, up
11591@subsection Recursion in Place of a Counter
11592@findex triangle-recursively
11593
11594@need 1200
11595The @code{triangle} function described in a previous section can also
11596be written recursively. It looks like this:
11597
11598@smallexample
11599@group
11600(defun triangle-recursively (number)
11601 "Return the sum of the numbers 1 through NUMBER inclusive.
11602Uses recursion."
11603 (if (= number 1) ; @r{do-again-test}
11604 1 ; @r{then-part}
11605 (+ number ; @r{else-part}
11606 (triangle-recursively ; @r{recursive call}
11607 (1- number))))) ; @r{next-step-expression}
11608
11609(triangle-recursively 7)
11610@end group
11611@end smallexample
11612
11613@noindent
11614You can install this function by evaluating it and then try it by
11615evaluating @code{(triangle-recursively 7)}. (Remember to put your
11616cursor immediately after the last parenthesis of the function
11617definition, before the comment.) The function evaluates to 28.
11618
11619To understand how this function works, let's consider what happens in the
11620various cases when the function is passed 1, 2, 3, or 4 as the value of
11621its argument.
11622
11623@menu
11624* Recursive Example arg of 1 or 2::
11625* Recursive Example arg of 3 or 4::
11626@end menu
11627
11628@node Recursive Example arg of 1 or 2, Recursive Example arg of 3 or 4, Recursive triangle function, Recursive triangle function
11629@ifnottex
11630@unnumberedsubsubsec An argument of 1 or 2
11631@end ifnottex
11632
11633First, what happens if the value of the argument is 1?
11634
11635The function has an @code{if} expression after the documentation
11636string. It tests whether the value of @code{number} is equal to 1; if
11637so, Emacs evaluates the then-part of the @code{if} expression, which
11638returns the number 1 as the value of the function. (A triangle with
11639one row has one pebble in it.)
11640
11641Suppose, however, that the value of the argument is 2. In this case,
11642Emacs evaluates the else-part of the @code{if} expression.
11643
11644@need 1200
11645The else-part consists of an addition, the recursive call to
11646@code{triangle-recursively} and a decrementing action; and it looks like
11647this:
11648
11649@smallexample
11650(+ number (triangle-recursively (1- number)))
11651@end smallexample
11652
11653When Emacs evaluates this expression, the innermost expression is
11654evaluated first; then the other parts in sequence. Here are the steps
11655in detail:
11656
11657@table @i
11658@item Step 1 @w{ } Evaluate the innermost expression.
11659
11660The innermost expression is @code{(1- number)} so Emacs decrements the
11661value of @code{number} from 2 to 1.
11662
11663@item Step 2 @w{ } Evaluate the @code{triangle-recursively} function.
11664
11665The Lisp interpreter creates an individual instance of
11666@code{triangle-recursively}. It does not matter that this function is
11667contained within itself. Emacs passes the result Step 1 as the
11668argument used by this instance of the @code{triangle-recursively}
11669function
11670
11671In this case, Emacs evaluates @code{triangle-recursively} with an
11672argument of 1. This means that this evaluation of
11673@code{triangle-recursively} returns 1.
11674
11675@item Step 3 @w{ } Evaluate the value of @code{number}.
11676
11677The variable @code{number} is the second element of the list that
11678starts with @code{+}; its value is 2.
11679
11680@item Step 4 @w{ } Evaluate the @code{+} expression.
11681
11682The @code{+} expression receives two arguments, the first
11683from the evaluation of @code{number} (Step 3) and the second from the
11684evaluation of @code{triangle-recursively} (Step 2).
11685
11686The result of the addition is the sum of 2 plus 1, and the number 3 is
11687returned, which is correct. A triangle with two rows has three
11688pebbles in it.
11689@end table
11690
11691@node Recursive Example arg of 3 or 4, , Recursive Example arg of 1 or 2, Recursive triangle function
11692@unnumberedsubsubsec An argument of 3 or 4
11693
11694Suppose that @code{triangle-recursively} is called with an argument of
116953.
11696
11697@table @i
11698@item Step 1 @w{ } Evaluate the do-again-test.
11699
11700The @code{if} expression is evaluated first. This is the do-again
11701test and returns false, so the else-part of the @code{if} expression
11702is evaluated. (Note that in this example, the do-again-test causes
11703the function to call itself when it tests false, not when it tests
11704true.)
11705
11706@item Step 2 @w{ } Evaluate the innermost expression of the else-part.
11707
11708The innermost expression of the else-part is evaluated, which decrements
117093 to 2. This is the next-step-expression.
11710
11711@item Step 3 @w{ } Evaluate the @code{triangle-recursively} function.
11712
11713The number 2 is passed to the @code{triangle-recursively} function.
11714
a9097c6d 11715We already know what happens when Emacs evaluates @code{triangle-recursively} with
8cda6f8f
GM
11716an argument of 2. After going through the sequence of actions described
11717earlier, it returns a value of 3. So that is what will happen here.
11718
11719@item Step 4 @w{ } Evaluate the addition.
11720
117213 will be passed as an argument to the addition and will be added to the
11722number with which the function was called, which is 3.
11723@end table
11724
11725@noindent
11726The value returned by the function as a whole will be 6.
11727
11728Now that we know what will happen when @code{triangle-recursively} is
11729called with an argument of 3, it is evident what will happen if it is
11730called with an argument of 4:
11731
11732@quotation
11733@need 800
11734In the recursive call, the evaluation of
11735
11736@smallexample
11737(triangle-recursively (1- 4))
11738@end smallexample
11739
11740@need 800
11741@noindent
11742will return the value of evaluating
11743
11744@smallexample
11745(triangle-recursively 3)
11746@end smallexample
11747
11748@noindent
11749which is 6 and this value will be added to 4 by the addition in the
11750third line.
11751@end quotation
11752
11753@noindent
11754The value returned by the function as a whole will be 10.
11755
11756Each time @code{triangle-recursively} is evaluated, it evaluates a
11757version of itself---a different instance of itself---with a smaller
11758argument, until the argument is small enough so that it does not
11759evaluate itself.
11760
11761Note that this particular design for a recursive function
11762requires that operations be deferred.
11763
11764Before @code{(triangle-recursively 7)} can calculate its answer, it
11765must call @code{(triangle-recursively 6)}; and before
11766@code{(triangle-recursively 6)} can calculate its answer, it must call
11767@code{(triangle-recursively 5)}; and so on. That is to say, the
11768calculation that @code{(triangle-recursively 7)} makes must be
11769deferred until @code{(triangle-recursively 6)} makes its calculation;
11770and @code{(triangle-recursively 6)} must defer until
11771@code{(triangle-recursively 5)} completes; and so on.
11772
11773If each of these instances of @code{triangle-recursively} are thought
11774of as different robots, the first robot must wait for the second to
11775complete its job, which must wait until the third completes, and so
11776on.
11777
11778There is a way around this kind of waiting, which we will discuss in
11779@ref{No Deferment, , Recursion without Deferments}.
11780
11781@node Recursion with cond, Recursive Patterns, Recursive triangle function, Recursion
11782@comment node-name, next, previous, up
11783@subsection Recursion Example Using @code{cond}
11784@findex cond
11785
11786The version of @code{triangle-recursively} described earlier is written
11787with the @code{if} special form. It can also be written using another
11788special form called @code{cond}. The name of the special form
11789@code{cond} is an abbreviation of the word @samp{conditional}.
11790
11791Although the @code{cond} special form is not used as often in the
11792Emacs Lisp sources as @code{if}, it is used often enough to justify
11793explaining it.
11794
11795@need 800
11796The template for a @code{cond} expression looks like this:
11797
11798@smallexample
11799@group
11800(cond
11801 @var{body}@dots{})
11802@end group
11803@end smallexample
11804
11805@noindent
11806where the @var{body} is a series of lists.
11807
11808@need 800
11809Written out more fully, the template looks like this:
11810
11811@smallexample
11812@group
11813(cond
11814 (@var{first-true-or-false-test} @var{first-consequent})
11815 (@var{second-true-or-false-test} @var{second-consequent})
11816 (@var{third-true-or-false-test} @var{third-consequent})
11817 @dots{})
11818@end group
11819@end smallexample
11820
11821When the Lisp interpreter evaluates the @code{cond} expression, it
11822evaluates the first element (the @sc{car} or true-or-false-test) of
11823the first expression in a series of expressions within the body of the
11824@code{cond}.
11825
11826If the true-or-false-test returns @code{nil} the rest of that
11827expression, the consequent, is skipped and the true-or-false-test of the
11828next expression is evaluated. When an expression is found whose
11829true-or-false-test returns a value that is not @code{nil}, the
11830consequent of that expression is evaluated. The consequent can be one
11831or more expressions. If the consequent consists of more than one
11832expression, the expressions are evaluated in sequence and the value of
11833the last one is returned. If the expression does not have a consequent,
11834the value of the true-or-false-test is returned.
11835
11836If none of the true-or-false-tests test true, the @code{cond} expression
11837returns @code{nil}.
11838
11839@need 1250
11840Written using @code{cond}, the @code{triangle} function looks like this:
11841
11842@smallexample
11843@group
11844(defun triangle-using-cond (number)
11845 (cond ((<= number 0) 0)
11846 ((= number 1) 1)
11847 ((> number 1)
11848 (+ number (triangle-using-cond (1- number))))))
11849@end group
11850@end smallexample
11851
11852@noindent
11853In this example, the @code{cond} returns 0 if the number is less than or
11854equal to 0, it returns 1 if the number is 1 and it evaluates @code{(+
11855number (triangle-using-cond (1- number)))} if the number is greater than
118561.
11857
11858@node Recursive Patterns, No Deferment, Recursion with cond, Recursion
11859@comment node-name, next, previous, up
11860@subsection Recursive Patterns
11861@cindex Recursive Patterns
11862
11863Here are three common recursive patterns. Each involves a list.
11864Recursion does not need to involve lists, but Lisp is designed for lists
11865and this provides a sense of its primal capabilities.
11866
11867@menu
11868* Every::
11869* Accumulate::
11870* Keep::
11871@end menu
11872
11873@node Every, Accumulate, Recursive Patterns, Recursive Patterns
11874@comment node-name, next, previous, up
11875@unnumberedsubsubsec Recursive Pattern: @emph{every}
11876@cindex Every, type of recursive pattern
11877@cindex Recursive pattern: every
11878
11879In the @code{every} recursive pattern, an action is performed on every
11880element of a list.
11881
11882@need 1500
11883The basic pattern is:
11884
11885@itemize @bullet
11886@item
11887If a list be empty, return @code{nil}.
11888@item
11889Else, act on the beginning of the list (the @sc{car} of the list)
11890 @itemize @minus
11891 @item
11892 through a recursive call by the function on the rest (the
11893 @sc{cdr}) of the list,
11894 @item
11895 and, optionally, combine the acted-on element, using @code{cons},
11896 with the results of acting on the rest.
11897 @end itemize
11898@end itemize
11899
11900@need 1500
11901Here is example:
11902
11903@smallexample
11904@group
11905(defun square-each (numbers-list)
11906 "Square each of a NUMBERS LIST, recursively."
11907 (if (not numbers-list) ; do-again-test
11908 nil
11909 (cons
11910 (* (car numbers-list) (car numbers-list))
11911 (square-each (cdr numbers-list))))) ; next-step-expression
11912@end group
11913
11914@group
11915(square-each '(1 2 3))
11916 @result{} (1 4 9)
11917@end group
11918@end smallexample
11919
11920@need 1200
11921@noindent
11922If @code{numbers-list} is empty, do nothing. But if it has content,
11923construct a list combining the square of the first number in the list
11924with the result of the recursive call.
11925
11926(The example follows the pattern exactly: @code{nil} is returned if
11927the numbers' list is empty. In practice, you would write the
11928conditional so it carries out the action when the numbers' list is not
11929empty.)
11930
11931The @code{print-elements-recursively} function (@pxref{Recursion with
11932list, , Recursion with a List}) is another example of an @code{every}
11933pattern, except in this case, rather than bring the results together
11934using @code{cons}, we print each element of output.
11935
11936@need 1250
11937The @code{print-elements-recursively} function looks like this:
11938
11939@smallexample
11940@group
11941(setq animals '(gazelle giraffe lion tiger))
11942@end group
11943
11944@group
11945(defun print-elements-recursively (list)
11946 "Print each element of LIST on a line of its own.
11947Uses recursion."
11948 (when list ; @r{do-again-test}
11949 (print (car list)) ; @r{body}
11950 (print-elements-recursively ; @r{recursive call}
11951 (cdr list)))) ; @r{next-step-expression}
11952
11953(print-elements-recursively animals)
11954@end group
11955@end smallexample
11956
11957@need 1500
11958The pattern for @code{print-elements-recursively} is:
11959
11960@itemize @bullet
11961@item
11962When the list is empty, do nothing.
11963@item
11964But when the list has at least one element,
11965 @itemize @minus
11966 @item
11967 act on the beginning of the list (the @sc{car} of the list),
11968 @item
11969 and make a recursive call on the rest (the @sc{cdr}) of the list.
11970 @end itemize
11971@end itemize
11972
11973@node Accumulate, Keep, Every, Recursive Patterns
11974@comment node-name, next, previous, up
11975@unnumberedsubsubsec Recursive Pattern: @emph{accumulate}
11976@cindex Accumulate, type of recursive pattern
11977@cindex Recursive pattern: accumulate
11978
11979Another recursive pattern is called the @code{accumulate} pattern. In
11980the @code{accumulate} recursive pattern, an action is performed on
11981every element of a list and the result of that action is accumulated
11982with the results of performing the action on the other elements.
11983
11984This is very like the `every' pattern using @code{cons}, except that
11985@code{cons} is not used, but some other combiner.
11986
11987@need 1500
11988The pattern is:
11989
11990@itemize @bullet
11991@item
11992If a list be empty, return zero or some other constant.
11993@item
11994Else, act on the beginning of the list (the @sc{car} of the list),
11995 @itemize @minus
11996 @item
11997 and combine that acted-on element, using @code{+} or
11998 some other combining function, with
11999 @item
12000 a recursive call by the function on the rest (the @sc{cdr}) of the list.
12001 @end itemize
12002@end itemize
12003
12004@need 1500
12005Here is an example:
12006
12007@smallexample
12008@group
12009(defun add-elements (numbers-list)
12010 "Add the elements of NUMBERS-LIST together."
12011 (if (not numbers-list)
12012 0
12013 (+ (car numbers-list) (add-elements (cdr numbers-list)))))
12014@end group
12015
12016@group
12017(add-elements '(1 2 3 4))
12018 @result{} 10
12019@end group
12020@end smallexample
12021
12022@xref{Files List, , Making a List of Files}, for an example of the
12023accumulate pattern.
12024
12025@node Keep, , Accumulate, Recursive Patterns
12026@comment node-name, next, previous, up
12027@unnumberedsubsubsec Recursive Pattern: @emph{keep}
12028@cindex Keep, type of recursive pattern
12029@cindex Recursive pattern: keep
12030
12031A third recursive pattern is called the @code{keep} pattern.
12032In the @code{keep} recursive pattern, each element of a list is tested;
12033the element is acted on and the results are kept only if the element
12034meets a criterion.
12035
12036Again, this is very like the `every' pattern, except the element is
12037skipped unless it meets a criterion.
12038
12039@need 1500
12040The pattern has three parts:
12041
12042@itemize @bullet
12043@item
12044If a list be empty, return @code{nil}.
12045@item
12046Else, if the beginning of the list (the @sc{car} of the list) passes
12047 a test
12048 @itemize @minus
12049 @item
12050 act on that element and combine it, using @code{cons} with
12051 @item
12052 a recursive call by the function on the rest (the @sc{cdr}) of the list.
12053 @end itemize
12054@item
12055Otherwise, if the beginning of the list (the @sc{car} of the list) fails
12056the test
12057 @itemize @minus
12058 @item
12059 skip on that element,
12060 @item
12061 and, recursively call the function on the rest (the @sc{cdr}) of the list.
12062 @end itemize
12063@end itemize
12064
12065@need 1500
12066Here is an example that uses @code{cond}:
12067
12068@smallexample
12069@group
12070(defun keep-three-letter-words (word-list)
12071 "Keep three letter words in WORD-LIST."
12072 (cond
12073 ;; First do-again-test: stop-condition
12074 ((not word-list) nil)
12075
12076 ;; Second do-again-test: when to act
12077 ((eq 3 (length (symbol-name (car word-list))))
12078 ;; combine acted-on element with recursive call on shorter list
12079 (cons (car word-list) (keep-three-letter-words (cdr word-list))))
12080
12081 ;; Third do-again-test: when to skip element;
12082 ;; recursively call shorter list with next-step expression
12083 (t (keep-three-letter-words (cdr word-list)))))
12084@end group
12085
12086@group
12087(keep-three-letter-words '(one two three four five six))
12088 @result{} (one two six)
12089@end group
12090@end smallexample
12091
12092It goes without saying that you need not use @code{nil} as the test for
12093when to stop; and you can, of course, combine these patterns.
12094
12095@node No Deferment, No deferment solution, Recursive Patterns, Recursion
12096@subsection Recursion without Deferments
12097@cindex Deferment in recursion
12098@cindex Recursion without Deferments
12099
12100Let's consider again what happens with the @code{triangle-recursively}
12101function. We will find that the intermediate calculations are
12102deferred until all can be done.
12103
12104@need 800
12105Here is the function definition:
12106
12107@smallexample
12108@group
12109(defun triangle-recursively (number)
12110 "Return the sum of the numbers 1 through NUMBER inclusive.
12111Uses recursion."
12112 (if (= number 1) ; @r{do-again-test}
12113 1 ; @r{then-part}
12114 (+ number ; @r{else-part}
12115 (triangle-recursively ; @r{recursive call}
12116 (1- number))))) ; @r{next-step-expression}
12117@end group
12118@end smallexample
12119
12120What happens when we call this function with a argument of 7?
12121
12122The first instance of the @code{triangle-recursively} function adds
12123the number 7 to the value returned by a second instance of
12124@code{triangle-recursively}, an instance that has been passed an
12125argument of 6. That is to say, the first calculation is:
12126
12127@smallexample
12128(+ 7 (triangle-recursively 6))
12129@end smallexample
12130
12131@noindent
12132The first instance of @code{triangle-recursively}---you may want to
12133think of it as a little robot---cannot complete its job. It must hand
12134off the calculation for @code{(triangle-recursively 6)} to a second
12135instance of the program, to a second robot. This second individual is
12136completely different from the first one; it is, in the jargon, a
12137`different instantiation'. Or, put another way, it is a different
12138robot. It is the same model as the first; it calculates triangle
12139numbers recursively; but it has a different serial number.
12140
12141And what does @code{(triangle-recursively 6)} return? It returns the
12142number 6 added to the value returned by evaluating
12143@code{triangle-recursively} with an argument of 5. Using the robot
12144metaphor, it asks yet another robot to help it.
12145
12146@need 800
12147Now the total is:
12148
12149@smallexample
12150(+ 7 6 (triangle-recursively 5))
12151@end smallexample
12152
12153@need 800
12154And what happens next?
12155
12156@smallexample
12157(+ 7 6 5 (triangle-recursively 4))
12158@end smallexample
12159
12160Each time @code{triangle-recursively} is called, except for the last
12161time, it creates another instance of the program---another robot---and
12162asks it to make a calculation.
12163
12164@need 800
12165Eventually, the full addition is set up and performed:
12166
12167@smallexample
12168(+ 7 6 5 4 3 2 1)
12169@end smallexample
12170
12171This design for the function defers the calculation of the first step
12172until the second can be done, and defers that until the third can be
12173done, and so on. Each deferment means the computer must remember what
12174is being waited on. This is not a problem when there are only a few
12175steps, as in this example. But it can be a problem when there are
12176more steps.
12177
12178@node No deferment solution, , No Deferment, Recursion
12179@subsection No Deferment Solution
12180@cindex No deferment solution
12181@cindex Defermentless solution
12182@cindex Solution without deferment
12183
12184The solution to the problem of deferred operations is to write in a
12185manner that does not defer operations@footnote{The phrase @dfn{tail
12186recursive} is used to describe such a process, one that uses
12187`constant space'.}. This requires
12188writing to a different pattern, often one that involves writing two
12189function definitions, an `initialization' function and a `helper'
12190function.
12191
12192The `initialization' function sets up the job; the `helper' function
12193does the work.
12194
12195@need 1200
12196Here are the two function definitions for adding up numbers. They are
12197so simple, I find them hard to understand.
12198
12199@smallexample
12200@group
12201(defun triangle-initialization (number)
12202 "Return the sum of the numbers 1 through NUMBER inclusive.
12203This is the `initialization' component of a two function
12204duo that uses recursion."
12205 (triangle-recursive-helper 0 0 number))
12206@end group
12207@end smallexample
12208
12209@smallexample
12210@group
12211(defun triangle-recursive-helper (sum counter number)
12212 "Return SUM, using COUNTER, through NUMBER inclusive.
12213This is the `helper' component of a two function duo
12214that uses recursion."
12215 (if (> counter number)
12216 sum
12217 (triangle-recursive-helper (+ sum counter) ; @r{sum}
12218 (1+ counter) ; @r{counter}
12219 number))) ; @r{number}
12220@end group
12221@end smallexample
12222
12223@need 1250
12224Install both function definitions by evaluating them, then call
12225@code{triangle-initialization} with 2 rows:
12226
12227@smallexample
12228@group
12229(triangle-initialization 2)
12230 @result{} 3
12231@end group
12232@end smallexample
12233
12234The `initialization' function calls the first instance of the `helper'
12235function with three arguments: zero, zero, and a number which is the
12236number of rows in the triangle.
12237
12238The first two arguments passed to the `helper' function are
12239initialization values. These values are changed when
12240@code{triangle-recursive-helper} invokes new instances.@footnote{The
12241jargon is mildly confusing: @code{triangle-recursive-helper} uses a
12242process that is iterative in a procedure that is recursive. The
12243process is called iterative because the computer need only record the
12244three values, @code{sum}, @code{counter}, and @code{number}; the
12245procedure is recursive because the function `calls itself'. On the
12246other hand, both the process and the procedure used by
12247@code{triangle-recursively} are called recursive. The word
12248`recursive' has different meanings in the two contexts.}
12249
12250Let's see what happens when we have a triangle that has one row. (This
12251triangle will have one pebble in it!)
12252
12253@need 1200
12254@code{triangle-initialization} will call its helper with
12255the arguments @w{@code{0 0 1}}. That function will run the conditional
12256test whether @code{(> counter number)}:
12257
12258@smallexample
12259(> 0 1)
12260@end smallexample
12261
12262@need 1200
12263@noindent
12264and find that the result is false, so it will invoke
12265the else-part of the @code{if} clause:
12266
12267@smallexample
12268@group
12269 (triangle-recursive-helper
12270 (+ sum counter) ; @r{sum plus counter} @result{} @r{sum}
12271 (1+ counter) ; @r{increment counter} @result{} @r{counter}
12272 number) ; @r{number stays the same}
12273@end group
12274@end smallexample
12275
12276@need 800
12277@noindent
12278which will first compute:
12279
12280@smallexample
12281@group
12282(triangle-recursive-helper (+ 0 0) ; @r{sum}
12283 (1+ 0) ; @r{counter}
12284 1) ; @r{number}
12285@exdent which is:
12286
12287(triangle-recursive-helper 0 1 1)
12288@end group
12289@end smallexample
12290
12291Again, @code{(> counter number)} will be false, so again, the Lisp
12292interpreter will evaluate @code{triangle-recursive-helper}, creating a
12293new instance with new arguments.
12294
12295@need 800
12296This new instance will be;
12297
12298@smallexample
12299@group
12300 (triangle-recursive-helper
12301 (+ sum counter) ; @r{sum plus counter} @result{} @r{sum}
12302 (1+ counter) ; @r{increment counter} @result{} @r{counter}
12303 number) ; @r{number stays the same}
12304
12305@exdent which is:
12306
12307(triangle-recursive-helper 1 2 1)
12308@end group
12309@end smallexample
12310
12311In this case, the @code{(> counter number)} test will be true! So the
12312instance will return the value of the sum, which will be 1, as
12313expected.
12314
12315Now, let's pass @code{triangle-initialization} an argument
12316of 2, to find out how many pebbles there are in a triangle with two rows.
12317
12318That function calls @code{(triangle-recursive-helper 0 0 2)}.
12319
12320@need 800
12321In stages, the instances called will be:
12322
12323@smallexample
12324@group
12325 @r{sum counter number}
12326(triangle-recursive-helper 0 1 2)
12327
12328(triangle-recursive-helper 1 2 2)
12329
12330(triangle-recursive-helper 3 3 2)
12331@end group
12332@end smallexample
12333
12334When the last instance is called, the @code{(> counter number)} test
12335will be true, so the instance will return the value of @code{sum},
12336which will be 3.
12337
12338This kind of pattern helps when you are writing functions that can use
12339many resources in a computer.
12340
12341@need 1500
12342@node Looping exercise, , Recursion, Loops & Recursion
12343@section Looping Exercise
12344
12345@itemize @bullet
12346@item
12347Write a function similar to @code{triangle} in which each row has a
12348value which is the square of the row number. Use a @code{while} loop.
12349
12350@item
12351Write a function similar to @code{triangle} that multiplies instead of
12352adds the values.
12353
12354@item
12355Rewrite these two functions recursively. Rewrite these functions
12356using @code{cond}.
12357
12358@c comma in printed title causes problem in Info cross reference
12359@item
12360Write a function for Texinfo mode that creates an index entry at the
12361beginning of a paragraph for every @samp{@@dfn} within the paragraph.
12362(In a Texinfo file, @samp{@@dfn} marks a definition. This book is
12363written in Texinfo.)
12364
12365Many of the functions you will need are described in two of the
12366previous chapters, @ref{Cutting & Storing Text, , Cutting and Storing
12367Text}, and @ref{Yanking, , Yanking Text Back}. If you use
12368@code{forward-paragraph} to put the index entry at the beginning of
12369the paragraph, you will have to use @w{@kbd{C-h f}}
12370(@code{describe-function}) to find out how to make the command go
12371backwards.
12372
12373For more information, see
12374@ifinfo
12375@ref{Indicating, , Indicating Definitions, texinfo}.
12376@end ifinfo
12377@ifhtml
12378@ref{Indicating, , Indicating, texinfo, Texinfo Manual}, which goes to
12379a Texinfo manual in the current directory. Or, if you are on the
12380Internet, see
12381@uref{http://www.gnu.org/software/texinfo/manual/texinfo/}
12382@end ifhtml
12383@iftex
12384``Indicating Definitions, Commands, etc.'' in @cite{Texinfo, The GNU
12385Documentation Format}.
12386@end iftex
12387@end itemize
12388
12389@node Regexp Search, Counting Words, Loops & Recursion, Top
12390@comment node-name, next, previous, up
12391@chapter Regular Expression Searches
12392@cindex Searches, illustrating
12393@cindex Regular expression searches
12394@cindex Patterns, searching for
12395@cindex Motion by sentence and paragraph
12396@cindex Sentences, movement by
12397@cindex Paragraphs, movement by
12398
12399Regular expression searches are used extensively in GNU Emacs. The
12400two functions, @code{forward-sentence} and @code{forward-paragraph},
12401illustrate these searches well. They use regular expressions to find
12402where to move point. The phrase `regular expression' is often written
12403as `regexp'.
12404
12405Regular expression searches are described in @ref{Regexp Search, ,
12406Regular Expression Search, emacs, The GNU Emacs Manual}, as well as in
12407@ref{Regular Expressions, , , elisp, The GNU Emacs Lisp Reference
12408Manual}. In writing this chapter, I am presuming that you have at
12409least a mild acquaintance with them. The major point to remember is
12410that regular expressions permit you to search for patterns as well as
12411for literal strings of characters. For example, the code in
12412@code{forward-sentence} searches for the pattern of possible
12413characters that could mark the end of a sentence, and moves point to
12414that spot.
12415
12416Before looking at the code for the @code{forward-sentence} function, it
12417is worth considering what the pattern that marks the end of a sentence
12418must be. The pattern is discussed in the next section; following that
12419is a description of the regular expression search function,
12420@code{re-search-forward}. The @code{forward-sentence} function
12421is described in the section following. Finally, the
12422@code{forward-paragraph} function is described in the last section of
12423this chapter. @code{forward-paragraph} is a complex function that
12424introduces several new features.
12425
12426@menu
12427* sentence-end:: The regular expression for @code{sentence-end}.
12428* re-search-forward:: Very similar to @code{search-forward}.
12429* forward-sentence:: A straightforward example of regexp search.
12430* forward-paragraph:: A somewhat complex example.
12431* etags:: How to create your own @file{TAGS} table.
12432* Regexp Review::
12433* re-search Exercises::
12434@end menu
12435
12436@node sentence-end, re-search-forward, Regexp Search, Regexp Search
12437@comment node-name, next, previous, up
12438@section The Regular Expression for @code{sentence-end}
12439@findex sentence-end
12440
12441The symbol @code{sentence-end} is bound to the pattern that marks the
12442end of a sentence. What should this regular expression be?
12443
12444Clearly, a sentence may be ended by a period, a question mark, or an
12445exclamation mark. Indeed, in English, only clauses that end with one
12446of those three characters should be considered the end of a sentence.
12447This means that the pattern should include the character set:
12448
12449@smallexample
12450[.?!]
12451@end smallexample
12452
12453However, we do not want @code{forward-sentence} merely to jump to a
12454period, a question mark, or an exclamation mark, because such a character
12455might be used in the middle of a sentence. A period, for example, is
12456used after abbreviations. So other information is needed.
12457
12458According to convention, you type two spaces after every sentence, but
12459only one space after a period, a question mark, or an exclamation mark in
12460the body of a sentence. So a period, a question mark, or an exclamation
12461mark followed by two spaces is a good indicator of an end of sentence.
12462However, in a file, the two spaces may instead be a tab or the end of a
12463line. This means that the regular expression should include these three
12464items as alternatives.
12465
12466@need 800
12467This group of alternatives will look like this:
12468
12469@smallexample
12470@group
12471\\($\\| \\| \\)
12472 ^ ^^
12473 TAB SPC
12474@end group
12475@end smallexample
12476
12477@noindent
12478Here, @samp{$} indicates the end of the line, and I have pointed out
12479where the tab and two spaces are inserted in the expression. Both are
12480inserted by putting the actual characters into the expression.
12481
12482Two backslashes, @samp{\\}, are required before the parentheses and
12483vertical bars: the first backslash quotes the following backslash in
12484Emacs; and the second indicates that the following character, the
12485parenthesis or the vertical bar, is special.
12486
12487@need 1000
12488Also, a sentence may be followed by one or more carriage returns, like
12489this:
12490
12491@smallexample
12492@group
12493[
12494]*
12495@end group
12496@end smallexample
12497
12498@noindent
12499Like tabs and spaces, a carriage return is inserted into a regular
12500expression by inserting it literally. The asterisk indicates that the
12501@key{RET} is repeated zero or more times.
12502
12503But a sentence end does not consist only of a period, a question mark or
12504an exclamation mark followed by appropriate space: a closing quotation
12505mark or a closing brace of some kind may precede the space. Indeed more
12506than one such mark or brace may precede the space. These require a
12507expression that looks like this:
12508
12509@smallexample
12510[]\"')@}]*
12511@end smallexample
12512
12513In this expression, the first @samp{]} is the first character in the
12514expression; the second character is @samp{"}, which is preceded by a
12515@samp{\} to tell Emacs the @samp{"} is @emph{not} special. The last
12516three characters are @samp{'}, @samp{)}, and @samp{@}}.
12517
12518All this suggests what the regular expression pattern for matching the
12519end of a sentence should be; and, indeed, if we evaluate
12520@code{sentence-end} we find that it returns the following value:
12521
12522@smallexample
12523@group
12524sentence-end
12525 @result{} "[.?!][]\"')@}]*\\($\\| \\| \\)[
12526]*"
12527@end group
12528@end smallexample
12529
12530@noindent
12531(Well, not in GNU Emacs 22; that is because of an effort to make the
12532process simpler and to handle more glyphs and languages. When the
12533value of @code{sentence-end} is @code{nil}, then use the value defined
12534by the function @code{sentence-end}. (Here is a use of the difference
12535between a value and a function in Emacs Lisp.) The function returns a
12536value constructed from the variables @code{sentence-end-base},
12537@code{sentence-end-double-space}, @code{sentence-end-without-period},
12538and @code{sentence-end-without-space}. The critical variable is
12539@code{sentence-end-base}; its global value is similar to the one
12540described above but it also contains two additional quotation marks.
12541These have differing degrees of curliness. The
12542@code{sentence-end-without-period} variable, when true, tells Emacs
12543that a sentence may end without a period, such as text in Thai.)
12544
12545@ignore
12546@noindent
12547(Note that here the @key{TAB}, two spaces, and @key{RET} are shown
12548literally in the pattern.)
12549
12550This regular expression can be deciphered as follows:
12551
12552@table @code
12553@item [.?!]
12554The first part of the pattern is the three characters, a period, a question
12555mark and an exclamation mark, within square brackets. The pattern must
12556begin with one or other of these characters.
12557
12558@item []\"')@}]*
12559The second part of the pattern is the group of closing braces and
12560quotation marks, which can appear zero or more times. These may follow
12561the period, question mark or exclamation mark. In a regular expression,
12562the backslash, @samp{\}, followed by the double quotation mark,
12563@samp{"}, indicates the class of string-quote characters. Usually, the
12564double quotation mark is the only character in this class. The
12565asterisk, @samp{*}, indicates that the items in the previous group (the
12566group surrounded by square brackets, @samp{[]}) may be repeated zero or
12567more times.
12568
12569@item \\($\\| \\| \\)
12570The third part of the pattern is one or other of: either the end of a
12571line, or two blank spaces, or a tab. The double back-slashes are used
12572to prevent Emacs from reading the parentheses and vertical bars as part
12573of the search pattern; the parentheses are used to mark the group and
12574the vertical bars are used to indicated that the patterns to either side
12575of them are alternatives. The dollar sign is used to indicate the end
12576of a line and both the two spaces and the tab are each inserted as is to
12577indicate what they are.
12578
12579@item [@key{RET}]*
12580Finally, the last part of the pattern indicates that the end of the line
12581or the whitespace following the period, question mark or exclamation
12582mark may, but need not, be followed by one or more carriage returns. In
12583the pattern, the carriage return is inserted as an actual carriage
12584return between square brackets but here it is shown as @key{RET}.
12585@end table
12586@end ignore
12587
12588@node re-search-forward, forward-sentence, sentence-end, Regexp Search
12589@comment node-name, next, previous, up
12590@section The @code{re-search-forward} Function
12591@findex re-search-forward
12592
12593The @code{re-search-forward} function is very like the
12594@code{search-forward} function. (@xref{search-forward, , The
12595@code{search-forward} Function}.)
12596
12597@code{re-search-forward} searches for a regular expression. If the
12598search is successful, it leaves point immediately after the last
12599character in the target. If the search is backwards, it leaves point
12600just before the first character in the target. You may tell
12601@code{re-search-forward} to return @code{t} for true. (Moving point
12602is therefore a `side effect'.)
12603
12604Like @code{search-forward}, the @code{re-search-forward} function takes
12605four arguments:
12606
12607@enumerate
12608@item
12609The first argument is the regular expression that the function searches
12610for. The regular expression will be a string between quotations marks.
12611
12612@item
12613The optional second argument limits how far the function will search; it is a
12614bound, which is specified as a position in the buffer.
12615
12616@item
12617The optional third argument specifies how the function responds to
12618failure: @code{nil} as the third argument causes the function to
12619signal an error (and print a message) when the search fails; any other
12620value causes it to return @code{nil} if the search fails and @code{t}
12621if the search succeeds.
12622
12623@item
12624The optional fourth argument is the repeat count. A negative repeat
12625count causes @code{re-search-forward} to search backwards.
12626@end enumerate
12627
12628@need 800
12629The template for @code{re-search-forward} looks like this:
12630
12631@smallexample
12632@group
12633(re-search-forward "@var{regular-expression}"
12634 @var{limit-of-search}
12635 @var{what-to-do-if-search-fails}
12636 @var{repeat-count})
12637@end group
12638@end smallexample
12639
12640The second, third, and fourth arguments are optional. However, if you
12641want to pass a value to either or both of the last two arguments, you
12642must also pass a value to all the preceding arguments. Otherwise, the
12643Lisp interpreter will mistake which argument you are passing the value
12644to.
12645
12646@need 1200
12647In the @code{forward-sentence} function, the regular expression will be
12648the value of the variable @code{sentence-end}. In simple form, that is:
12649
12650@smallexample
12651@group
12652"[.?!][]\"')@}]*\\($\\| \\| \\)[
12653]*"
12654@end group
12655@end smallexample
12656
12657@noindent
12658The limit of the search will be the end of the paragraph (since a
12659sentence cannot go beyond a paragraph). If the search fails, the
12660function will return @code{nil}; and the repeat count will be provided
12661by the argument to the @code{forward-sentence} function.
12662
12663@node forward-sentence, forward-paragraph, re-search-forward, Regexp Search
12664@comment node-name, next, previous, up
12665@section @code{forward-sentence}
12666@findex forward-sentence
12667
12668The command to move the cursor forward a sentence is a straightforward
12669illustration of how to use regular expression searches in Emacs Lisp.
12670Indeed, the function looks longer and more complicated than it is; this
12671is because the function is designed to go backwards as well as forwards;
12672and, optionally, over more than one sentence. The function is usually
12673bound to the key command @kbd{M-e}.
12674
12675@menu
12676* Complete forward-sentence::
12677* fwd-sentence while loops:: Two @code{while} loops.
12678* fwd-sentence re-search:: A regular expression search.
12679@end menu
12680
12681@node Complete forward-sentence, fwd-sentence while loops, forward-sentence, forward-sentence
12682@ifnottex
12683@unnumberedsubsec Complete @code{forward-sentence} function definition
12684@end ifnottex
12685
12686@need 1250
12687Here is the code for @code{forward-sentence}:
12688
12689@c in GNU Emacs 22
12690@smallexample
12691@group
12692(defun forward-sentence (&optional arg)
12693 "Move forward to next `sentence-end'. With argument, repeat.
12694With negative argument, move backward repeatedly to `sentence-beginning'.
12695
12696The variable `sentence-end' is a regular expression that matches ends of
12697sentences. Also, every paragraph boundary terminates sentences as well."
12698@end group
12699@group
12700 (interactive "p")
12701 (or arg (setq arg 1))
12702 (let ((opoint (point))
12703 (sentence-end (sentence-end)))
12704 (while (< arg 0)
12705 (let ((pos (point))
12706 (par-beg (save-excursion (start-of-paragraph-text) (point))))
12707 (if (and (re-search-backward sentence-end par-beg t)
12708 (or (< (match-end 0) pos)
12709 (re-search-backward sentence-end par-beg t)))
12710 (goto-char (match-end 0))
12711 (goto-char par-beg)))
12712 (setq arg (1+ arg)))
12713@end group
12714@group
12715 (while (> arg 0)
12716 (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
12717 (if (re-search-forward sentence-end par-end t)
12718 (skip-chars-backward " \t\n")
12719 (goto-char par-end)))
12720 (setq arg (1- arg)))
12721 (constrain-to-field nil opoint t)))
12722@end group
12723@end smallexample
12724
12725@ignore
12726GNU Emacs 21
12727@smallexample
12728@group
12729(defun forward-sentence (&optional arg)
12730 "Move forward to next sentence-end. With argument, repeat.
12731With negative argument, move backward repeatedly to sentence-beginning.
12732Sentence ends are identified by the value of sentence-end
12733treated as a regular expression. Also, every paragraph boundary
12734terminates sentences as well."
12735@end group
12736@group
12737 (interactive "p")
12738 (or arg (setq arg 1))
12739 (while (< arg 0)
12740 (let ((par-beg
12741 (save-excursion (start-of-paragraph-text) (point))))
12742 (if (re-search-backward
12743 (concat sentence-end "[^ \t\n]") par-beg t)
12744 (goto-char (1- (match-end 0)))
12745 (goto-char par-beg)))
12746 (setq arg (1+ arg)))
12747 (while (> arg 0)
12748 (let ((par-end
12749 (save-excursion (end-of-paragraph-text) (point))))
12750 (if (re-search-forward sentence-end par-end t)
12751 (skip-chars-backward " \t\n")
12752 (goto-char par-end)))
12753 (setq arg (1- arg))))
12754@end group
12755@end smallexample
12756@end ignore
12757
12758The function looks long at first sight and it is best to look at its
12759skeleton first, and then its muscle. The way to see the skeleton is to
12760look at the expressions that start in the left-most columns:
12761
12762@smallexample
12763@group
12764(defun forward-sentence (&optional arg)
12765 "@var{documentation}@dots{}"
12766 (interactive "p")
12767 (or arg (setq arg 1))
12768 (let ((opoint (point)) (sentence-end (sentence-end)))
12769 (while (< arg 0)
12770 (let ((pos (point))
12771 (par-beg (save-excursion (start-of-paragraph-text) (point))))
12772 @var{rest-of-body-of-while-loop-when-going-backwards}
12773 (while (> arg 0)
12774 (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
12775 @var{rest-of-body-of-while-loop-when-going-forwards}
12776 @var{handle-forms-and-equivalent}
12777@end group
12778@end smallexample
12779
12780This looks much simpler! The function definition consists of
12781documentation, an @code{interactive} expression, an @code{or}
12782expression, a @code{let} expression, and @code{while} loops.
12783
12784Let's look at each of these parts in turn.
12785
12786We note that the documentation is thorough and understandable.
12787
12788The function has an @code{interactive "p"} declaration. This means
12789that the processed prefix argument, if any, is passed to the
12790function as its argument. (This will be a number.) If the function
12791is not passed an argument (it is optional) then the argument
12792@code{arg} will be bound to 1.
12793
12794When @code{forward-sentence} is called non-interactively without an
12795argument, @code{arg} is bound to @code{nil}. The @code{or} expression
12796handles this. What it does is either leave the value of @code{arg} as
12797it is, but only if @code{arg} is bound to a value; or it sets the
12798value of @code{arg} to 1, in the case when @code{arg} is bound to
12799@code{nil}.
12800
12801Next is a @code{let}. That specifies the values of two local
12802variables, @code{point} and @code{sentence-end}. The local value of
12803point, from before the search, is used in the
12804@code{constrain-to-field} function which handles forms and
12805equivalents. The @code{sentence-end} variable is set by the
12806@code{sentence-end} function.
12807
12808@node fwd-sentence while loops, fwd-sentence re-search, Complete forward-sentence, forward-sentence
12809@unnumberedsubsec The @code{while} loops
12810
12811Two @code{while} loops follow. The first @code{while} has a
12812true-or-false-test that tests true if the prefix argument for
12813@code{forward-sentence} is a negative number. This is for going
12814backwards. The body of this loop is similar to the body of the second
12815@code{while} clause, but it is not exactly the same. We will skip
12816this @code{while} loop and concentrate on the second @code{while}
12817loop.
12818
12819@need 1500
12820The second @code{while} loop is for moving point forward. Its skeleton
12821looks like this:
12822
12823@smallexample
12824@group
12825(while (> arg 0) ; @r{true-or-false-test}
12826 (let @var{varlist}
12827 (if (@var{true-or-false-test})
12828 @var{then-part}
12829 @var{else-part}
12830 (setq arg (1- arg)))) ; @code{while} @r{loop decrementer}
12831@end group
12832@end smallexample
12833
12834The @code{while} loop is of the decrementing kind.
12835(@xref{Decrementing Loop, , A Loop with a Decrementing Counter}.) It
12836has a true-or-false-test that tests true so long as the counter (in
12837this case, the variable @code{arg}) is greater than zero; and it has a
12838decrementer that subtracts 1 from the value of the counter every time
12839the loop repeats.
12840
12841If no prefix argument is given to @code{forward-sentence}, which is
12842the most common way the command is used, this @code{while} loop will
12843run once, since the value of @code{arg} will be 1.
12844
12845The body of the @code{while} loop consists of a @code{let} expression,
12846which creates and binds a local variable, and has, as its body, an
12847@code{if} expression.
12848
12849@need 1250
12850The body of the @code{while} loop looks like this:
12851
12852@smallexample
12853@group
12854(let ((par-end
12855 (save-excursion (end-of-paragraph-text) (point))))
12856 (if (re-search-forward sentence-end par-end t)
12857 (skip-chars-backward " \t\n")
12858 (goto-char par-end)))
12859@end group
12860@end smallexample
12861
12862The @code{let} expression creates and binds the local variable
12863@code{par-end}. As we shall see, this local variable is designed to
12864provide a bound or limit to the regular expression search. If the
12865search fails to find a proper sentence ending in the paragraph, it will
12866stop on reaching the end of the paragraph.
12867
12868But first, let us examine how @code{par-end} is bound to the value of
12869the end of the paragraph. What happens is that the @code{let} sets the
12870value of @code{par-end} to the value returned when the Lisp interpreter
12871evaluates the expression
12872
12873@smallexample
12874@group
12875(save-excursion (end-of-paragraph-text) (point))
12876@end group
12877@end smallexample
12878
12879@noindent
12880In this expression, @code{(end-of-paragraph-text)} moves point to the
12881end of the paragraph, @code{(point)} returns the value of point, and then
12882@code{save-excursion} restores point to its original position. Thus,
12883the @code{let} binds @code{par-end} to the value returned by the
12884@code{save-excursion} expression, which is the position of the end of
12885the paragraph. (The @code{end-of-paragraph-text} function uses
12886@code{forward-paragraph}, which we will discuss shortly.)
12887
12888@need 1200
12889Emacs next evaluates the body of the @code{let}, which is an @code{if}
12890expression that looks like this:
12891
12892@smallexample
12893@group
12894(if (re-search-forward sentence-end par-end t) ; @r{if-part}
12895 (skip-chars-backward " \t\n") ; @r{then-part}
12896 (goto-char par-end))) ; @r{else-part}
12897@end group
12898@end smallexample
12899
12900The @code{if} tests whether its first argument is true and if so,
12901evaluates its then-part; otherwise, the Emacs Lisp interpreter
12902evaluates the else-part. The true-or-false-test of the @code{if}
12903expression is the regular expression search.
12904
12905It may seem odd to have what looks like the `real work' of
12906the @code{forward-sentence} function buried here, but this is a common
12907way this kind of operation is carried out in Lisp.
12908
12909@node fwd-sentence re-search, , fwd-sentence while loops, forward-sentence
12910@unnumberedsubsec The regular expression search
12911
12912The @code{re-search-forward} function searches for the end of the
12913sentence, that is, for the pattern defined by the @code{sentence-end}
12914regular expression. If the pattern is found---if the end of the sentence is
12915found---then the @code{re-search-forward} function does two things:
12916
12917@enumerate
12918@item
12919The @code{re-search-forward} function carries out a side effect, which
12920is to move point to the end of the occurrence found.
12921
12922@item
12923The @code{re-search-forward} function returns a value of true. This is
12924the value received by the @code{if}, and means that the search was
12925successful.
12926@end enumerate
12927
12928@noindent
12929The side effect, the movement of point, is completed before the
12930@code{if} function is handed the value returned by the successful
12931conclusion of the search.
12932
12933When the @code{if} function receives the value of true from a successful
12934call to @code{re-search-forward}, the @code{if} evaluates the then-part,
12935which is the expression @code{(skip-chars-backward " \t\n")}. This
12936expression moves backwards over any blank spaces, tabs or carriage
12937returns until a printed character is found and then leaves point after
12938the character. Since point has already been moved to the end of the
12939pattern that marks the end of the sentence, this action leaves point
12940right after the closing printed character of the sentence, which is
12941usually a period.
12942
12943On the other hand, if the @code{re-search-forward} function fails to
12944find a pattern marking the end of the sentence, the function returns
12945false. The false then causes the @code{if} to evaluate its third
12946argument, which is @code{(goto-char par-end)}: it moves point to the
12947end of the paragraph.
12948
12949(And if the text is in a form or equivalent, and point may not move
12950fully, then the @code{constrain-to-field} function comes into play.)
12951
12952Regular expression searches are exceptionally useful and the pattern
12953illustrated by @code{re-search-forward}, in which the search is the
12954test of an @code{if} expression, is handy. You will see or write code
12955incorporating this pattern often.
12956
12957@node forward-paragraph, etags, forward-sentence, Regexp Search
12958@comment node-name, next, previous, up
12959@section @code{forward-paragraph}: a Goldmine of Functions
12960@findex forward-paragraph
12961
12962@ignore
12963@c in GNU Emacs 22
12964(defun forward-paragraph (&optional arg)
12965 "Move forward to end of paragraph.
12966With argument ARG, do it ARG times;
12967a negative argument ARG = -N means move backward N paragraphs.
12968
12969A line which `paragraph-start' matches either separates paragraphs
12970\(if `paragraph-separate' matches it also) or is the first line of a paragraph.
12971A paragraph end is the beginning of a line which is not part of the paragraph
12972to which the end of the previous line belongs, or the end of the buffer.
12973Returns the count of paragraphs left to move."
12974 (interactive "p")
12975 (or arg (setq arg 1))
12976 (let* ((opoint (point))
12977 (fill-prefix-regexp
12978 (and fill-prefix (not (equal fill-prefix ""))
12979 (not paragraph-ignore-fill-prefix)
12980 (regexp-quote fill-prefix)))
12981 ;; Remove ^ from paragraph-start and paragraph-sep if they are there.
12982 ;; These regexps shouldn't be anchored, because we look for them
12983 ;; starting at the left-margin. This allows paragraph commands to
12984 ;; work normally with indented text.
12985 ;; This hack will not find problem cases like "whatever\\|^something".
12986 (parstart (if (and (not (equal "" paragraph-start))
12987 (equal ?^ (aref paragraph-start 0)))
12988 (substring paragraph-start 1)
12989 paragraph-start))
12990 (parsep (if (and (not (equal "" paragraph-separate))
12991 (equal ?^ (aref paragraph-separate 0)))
12992 (substring paragraph-separate 1)
12993 paragraph-separate))
12994 (parsep
12995 (if fill-prefix-regexp
12996 (concat parsep "\\|"
12997 fill-prefix-regexp "[ \t]*$")
12998 parsep))
12999 ;; This is used for searching.
13000 (sp-parstart (concat "^[ \t]*\\(?:" parstart "\\|" parsep "\\)"))
13001 start found-start)
13002 (while (and (< arg 0) (not (bobp)))
13003 (if (and (not (looking-at parsep))
13004 (re-search-backward "^\n" (max (1- (point)) (point-min)) t)
13005 (looking-at parsep))
13006 (setq arg (1+ arg))
13007 (setq start (point))
13008 ;; Move back over paragraph-separating lines.
13009 (forward-char -1) (beginning-of-line)
13010 (while (and (not (bobp))
13011 (progn (move-to-left-margin)
13012 (looking-at parsep)))
13013 (forward-line -1))
13014 (if (bobp)
13015 nil
13016 (setq arg (1+ arg))
13017 ;; Go to end of the previous (non-separating) line.
13018 (end-of-line)
13019 ;; Search back for line that starts or separates paragraphs.
13020 (if (if fill-prefix-regexp
13021 ;; There is a fill prefix; it overrides parstart.
13022 (let (multiple-lines)
13023 (while (and (progn (beginning-of-line) (not (bobp)))
13024 (progn (move-to-left-margin)
13025 (not (looking-at parsep)))
13026 (looking-at fill-prefix-regexp))
13027 (unless (= (point) start)
13028 (setq multiple-lines t))
13029 (forward-line -1))
13030 (move-to-left-margin)
13031 ;; This deleted code caused a long hanging-indent line
13032 ;; not to be filled together with the following lines.
13033 ;; ;; Don't move back over a line before the paragraph
13034 ;; ;; which doesn't start with fill-prefix
13035 ;; ;; unless that is the only line we've moved over.
13036 ;; (and (not (looking-at fill-prefix-regexp))
13037 ;; multiple-lines
13038 ;; (forward-line 1))
13039 (not (bobp)))
13040 (while (and (re-search-backward sp-parstart nil 1)
13041 (setq found-start t)
13042 ;; Found a candidate, but need to check if it is a
13043 ;; REAL parstart.
13044 (progn (setq start (point))
13045 (move-to-left-margin)
13046 (not (looking-at parsep)))
13047 (not (and (looking-at parstart)
13048 (or (not use-hard-newlines)
13049 (bobp)
13050 (get-text-property
13051 (1- start) 'hard)))))
13052 (setq found-start nil)
13053 (goto-char start))
13054 found-start)
13055 ;; Found one.
13056 (progn
13057 ;; Move forward over paragraph separators.
13058 ;; We know this cannot reach the place we started
13059 ;; because we know we moved back over a non-separator.
13060 (while (and (not (eobp))
13061 (progn (move-to-left-margin)
13062 (looking-at parsep)))
13063 (forward-line 1))
13064 ;; If line before paragraph is just margin, back up to there.
13065 (end-of-line 0)
13066 (if (> (current-column) (current-left-margin))
13067 (forward-char 1)
13068 (skip-chars-backward " \t")
13069 (if (not (bolp))
13070 (forward-line 1))))
13071 ;; No starter or separator line => use buffer beg.
13072 (goto-char (point-min))))))
13073
13074 (while (and (> arg 0) (not (eobp)))
13075 ;; Move forward over separator lines...
13076 (while (and (not (eobp))
13077 (progn (move-to-left-margin) (not (eobp)))
13078 (looking-at parsep))
13079 (forward-line 1))
13080 (unless (eobp) (setq arg (1- arg)))
13081 ;; ... and one more line.
13082 (forward-line 1)
13083 (if fill-prefix-regexp
13084 ;; There is a fill prefix; it overrides parstart.
13085 (while (and (not (eobp))
13086 (progn (move-to-left-margin) (not (eobp)))
13087 (not (looking-at parsep))
13088 (looking-at fill-prefix-regexp))
13089 (forward-line 1))
13090 (while (and (re-search-forward sp-parstart nil 1)
13091 (progn (setq start (match-beginning 0))
13092 (goto-char start)
13093 (not (eobp)))
13094 (progn (move-to-left-margin)
13095 (not (looking-at parsep)))
13096 (or (not (looking-at parstart))
13097 (and use-hard-newlines
13098 (not (get-text-property (1- start) 'hard)))))
13099 (forward-char 1))
13100 (if (< (point) (point-max))
13101 (goto-char start))))
13102 (constrain-to-field nil opoint t)
13103 ;; Return the number of steps that could not be done.
13104 arg))
13105@end ignore
13106
13107The @code{forward-paragraph} function moves point forward to the end
13108of the paragraph. It is usually bound to @kbd{M-@}} and makes use of a
13109number of functions that are important in themselves, including
13110@code{let*}, @code{match-beginning}, and @code{looking-at}.
13111
13112The function definition for @code{forward-paragraph} is considerably
13113longer than the function definition for @code{forward-sentence}
13114because it works with a paragraph, each line of which may begin with a
13115fill prefix.
13116
13117A fill prefix consists of a string of characters that are repeated at
13118the beginning of each line. For example, in Lisp code, it is a
13119convention to start each line of a paragraph-long comment with
13120@samp{;;; }. In Text mode, four blank spaces make up another common
13121fill prefix, creating an indented paragraph. (@xref{Fill Prefix, , ,
13122emacs, The GNU Emacs Manual}, for more information about fill
13123prefixes.)
13124
13125The existence of a fill prefix means that in addition to being able to
13126find the end of a paragraph whose lines begin on the left-most
13127column, the @code{forward-paragraph} function must be able to find the
13128end of a paragraph when all or many of the lines in the buffer begin
13129with the fill prefix.
13130
13131Moreover, it is sometimes practical to ignore a fill prefix that
13132exists, especially when blank lines separate paragraphs.
13133This is an added complication.
13134
13135@menu
13136* forward-paragraph in brief:: Key parts of the function definition.
13137* fwd-para let:: The @code{let*} expression.
13138* fwd-para while:: The forward motion @code{while} loop.
13139@end menu
13140
13141@node forward-paragraph in brief, fwd-para let, forward-paragraph, forward-paragraph
13142@ifnottex
13143@unnumberedsubsec Shortened @code{forward-paragraph} function definition
13144@end ifnottex
13145
13146Rather than print all of the @code{forward-paragraph} function, we
13147will only print parts of it. Read without preparation, the function
13148can be daunting!
13149
13150@need 800
13151In outline, the function looks like this:
13152
13153@smallexample
13154@group
13155(defun forward-paragraph (&optional arg)
13156 "@var{documentation}@dots{}"
13157 (interactive "p")
13158 (or arg (setq arg 1))
13159 (let*
13160 @var{varlist}
13161 (while (and (< arg 0) (not (bobp))) ; @r{backward-moving-code}
13162 @dots{}
13163 (while (and (> arg 0) (not (eobp))) ; @r{forward-moving-code}
13164 @dots{}
13165@end group
13166@end smallexample
13167
13168The first parts of the function are routine: the function's argument
13169list consists of one optional argument. Documentation follows.
13170
13171The lower case @samp{p} in the @code{interactive} declaration means
13172that the processed prefix argument, if any, is passed to the function.
13173This will be a number, and is the repeat count of how many paragraphs
13174point will move. The @code{or} expression in the next line handles
13175the common case when no argument is passed to the function, which occurs
13176if the function is called from other code rather than interactively.
13177This case was described earlier. (@xref{forward-sentence, The
13178@code{forward-sentence} function}.) Now we reach the end of the
13179familiar part of this function.
13180
13181@node fwd-para let, fwd-para while, forward-paragraph in brief, forward-paragraph
13182@unnumberedsubsec The @code{let*} expression
13183
13184The next line of the @code{forward-paragraph} function begins a
13185@code{let*} expression. This is a different than @code{let}. The
13186symbol is @code{let*} not @code{let}.
13187
13188The @code{let*} special form is like @code{let} except that Emacs sets
13189each variable in sequence, one after another, and variables in the
13190latter part of the varlist can make use of the values to which Emacs
13191set variables in the earlier part of the varlist.
13192
13193@ignore
13194( refappend save-excursion, , code save-excursion in code append-to-buffer .)
13195@end ignore
13196
13197(@ref{append save-excursion, , @code{save-excursion} in @code{append-to-buffer}}.)
13198
13199In the @code{let*} expression in this function, Emacs binds a total of
13200seven variables: @code{opoint}, @code{fill-prefix-regexp},
13201@code{parstart}, @code{parsep}, @code{sp-parstart}, @code{start}, and
13202@code{found-start}.
13203
13204The variable @code{parsep} appears twice, first, to remove instances
13205of @samp{^}, and second, to handle fill prefixes.
13206
13207The variable @code{opoint} is just the value of @code{point}. As you
13208can guess, it is used in a @code{constrain-to-field} expression, just
13209as in @code{forward-sentence}.
13210
13211The variable @code{fill-prefix-regexp} is set to the value returned by
13212evaluating the following list:
13213
13214@smallexample
13215@group
13216(and fill-prefix
13217 (not (equal fill-prefix ""))
13218 (not paragraph-ignore-fill-prefix)
13219 (regexp-quote fill-prefix))
13220@end group
13221@end smallexample
13222
13223@noindent
13224This is an expression whose first element is the @code{and} special form.
13225
13226As we learned earlier (@pxref{kill-new function, , The @code{kill-new}
13227function}), the @code{and} special form evaluates each of its
13228arguments until one of the arguments returns a value of @code{nil}, in
13229which case the @code{and} expression returns @code{nil}; however, if
13230none of the arguments returns a value of @code{nil}, the value
13231resulting from evaluating the last argument is returned. (Since such
13232a value is not @code{nil}, it is considered true in Lisp.) In other
13233words, an @code{and} expression returns a true value only if all its
13234arguments are true.
13235@findex and
13236
13237In this case, the variable @code{fill-prefix-regexp} is bound to a
13238non-@code{nil} value only if the following four expressions produce a
13239true (i.e., a non-@code{nil}) value when they are evaluated; otherwise,
13240@code{fill-prefix-regexp} is bound to @code{nil}.
13241
13242@table @code
13243@item fill-prefix
13244When this variable is evaluated, the value of the fill prefix, if any,
13245is returned. If there is no fill prefix, this variable returns
13246@code{nil}.
13247
13248@item (not (equal fill-prefix "")
13249This expression checks whether an existing fill prefix is an empty
13250string, that is, a string with no characters in it. An empty string is
13251not a useful fill prefix.
13252
13253@item (not paragraph-ignore-fill-prefix)
13254This expression returns @code{nil} if the variable
13255@code{paragraph-ignore-fill-prefix} has been turned on by being set to a
13256true value such as @code{t}.
13257
13258@item (regexp-quote fill-prefix)
13259This is the last argument to the @code{and} special form. If all the
13260arguments to the @code{and} are true, the value resulting from
13261evaluating this expression will be returned by the @code{and} expression
13262and bound to the variable @code{fill-prefix-regexp},
13263@end table
13264
13265@findex regexp-quote
13266@noindent
13267The result of evaluating this @code{and} expression successfully is that
13268@code{fill-prefix-regexp} will be bound to the value of
13269@code{fill-prefix} as modified by the @code{regexp-quote} function.
13270What @code{regexp-quote} does is read a string and return a regular
13271expression that will exactly match the string and match nothing else.
13272This means that @code{fill-prefix-regexp} will be set to a value that
13273will exactly match the fill prefix if the fill prefix exists.
13274Otherwise, the variable will be set to @code{nil}.
13275
13276The next two local variables in the @code{let*} expression are
13277designed to remove instances of @samp{^} from @code{parstart} and
13278@code{parsep}, the local variables which indicate the paragraph start
13279and the paragraph separator. The next expression sets @code{parsep}
13280again. That is to handle fill prefixes.
13281
13282This is the setting that requires the definition call @code{let*}
13283rather than @code{let}. The true-or-false-test for the @code{if}
13284depends on whether the variable @code{fill-prefix-regexp} evaluates to
13285@code{nil} or some other value.
13286
13287If @code{fill-prefix-regexp} does not have a value, Emacs evaluates
13288the else-part of the @code{if} expression and binds @code{parsep} to
13289its local value. (@code{parsep} is a regular expression that matches
13290what separates paragraphs.)
13291
13292But if @code{fill-prefix-regexp} does have a value, Emacs evaluates
13293the then-part of the @code{if} expression and binds @code{parsep} to a
13294regular expression that includes the @code{fill-prefix-regexp} as part
13295of the pattern.
13296
13297Specifically, @code{parsep} is set to the original value of the
13298paragraph separate regular expression concatenated with an alternative
13299expression that consists of the @code{fill-prefix-regexp} followed by
13300optional whitespace to the end of the line. The whitespace is defined
13301by @w{@code{"[ \t]*$"}}.) The @samp{\\|} defines this portion of the
13302regexp as an alternative to @code{parsep}.
13303
13304According to a comment in the code, the next local variable,
13305@code{sp-parstart}, is used for searching, and then the final two,
13306@code{start} and @code{found-start}, are set to @code{nil}.
13307
13308Now we get into the body of the @code{let*}. The first part of the body
13309of the @code{let*} deals with the case when the function is given a
13310negative argument and is therefore moving backwards. We will skip this
13311section.
13312
13313@node fwd-para while, , fwd-para let, forward-paragraph
13314@unnumberedsubsec The forward motion @code{while} loop
13315
13316The second part of the body of the @code{let*} deals with forward
13317motion. It is a @code{while} loop that repeats itself so long as the
13318value of @code{arg} is greater than zero. In the most common use of
13319the function, the value of the argument is 1, so the body of the
13320@code{while} loop is evaluated exactly once, and the cursor moves
13321forward one paragraph.
13322
13323@ignore
13324(while (and (> arg 0) (not (eobp)))
13325
13326 ;; Move forward over separator lines...
13327 (while (and (not (eobp))
13328 (progn (move-to-left-margin) (not (eobp)))
13329 (looking-at parsep))
13330 (forward-line 1))
13331 (unless (eobp) (setq arg (1- arg)))
13332 ;; ... and one more line.
13333 (forward-line 1)
13334
13335 (if fill-prefix-regexp
13336 ;; There is a fill prefix; it overrides parstart.
13337 (while (and (not (eobp))
13338 (progn (move-to-left-margin) (not (eobp)))
13339 (not (looking-at parsep))
13340 (looking-at fill-prefix-regexp))
13341 (forward-line 1))
13342
13343 (while (and (re-search-forward sp-parstart nil 1)
13344 (progn (setq start (match-beginning 0))
13345 (goto-char start)
13346 (not (eobp)))
13347 (progn (move-to-left-margin)
13348 (not (looking-at parsep)))
13349 (or (not (looking-at parstart))
13350 (and use-hard-newlines
13351 (not (get-text-property (1- start) 'hard)))))
13352 (forward-char 1))
13353
13354 (if (< (point) (point-max))
13355 (goto-char start))))
13356@end ignore
13357
13358This part handles three situations: when point is between paragraphs,
13359when there is a fill prefix and when there is no fill prefix.
13360
13361@need 800
13362The @code{while} loop looks like this:
13363
13364@smallexample
13365@group
13366;; @r{going forwards and not at the end of the buffer}
13367(while (and (> arg 0) (not (eobp)))
13368
13369 ;; @r{between paragraphs}
13370 ;; Move forward over separator lines...
13371 (while (and (not (eobp))
13372 (progn (move-to-left-margin) (not (eobp)))
13373 (looking-at parsep))
13374 (forward-line 1))
13375 ;; @r{This decrements the loop}
13376 (unless (eobp) (setq arg (1- arg)))
13377 ;; ... and one more line.
13378 (forward-line 1)
13379@end group
13380
13381@group
13382 (if fill-prefix-regexp
13383 ;; There is a fill prefix; it overrides parstart;
13384 ;; we go forward line by line
13385 (while (and (not (eobp))
13386 (progn (move-to-left-margin) (not (eobp)))
13387 (not (looking-at parsep))
13388 (looking-at fill-prefix-regexp))
13389 (forward-line 1))
13390@end group
13391
13392@group
13393 ;; There is no fill prefix;
13394 ;; we go forward character by character
13395 (while (and (re-search-forward sp-parstart nil 1)
13396 (progn (setq start (match-beginning 0))
13397 (goto-char start)
13398 (not (eobp)))
13399 (progn (move-to-left-margin)
13400 (not (looking-at parsep)))
13401 (or (not (looking-at parstart))
13402 (and use-hard-newlines
13403 (not (get-text-property (1- start) 'hard)))))
13404 (forward-char 1))
13405@end group
13406
13407@group
13408 ;; and if there is no fill prefix and if we are not at the end,
13409 ;; go to whatever was found in the regular expression search
13410 ;; for sp-parstart
13411 (if (< (point) (point-max))
13412 (goto-char start))))
13413@end group
13414@end smallexample
13415
13416@findex eobp
13417We can see that this is a decrementing counter @code{while} loop,
13418using the expression @code{(setq arg (1- arg))} as the decrementer.
13419That expression is not far from the @code{while}, but is hidden in
13420another Lisp macro, an @code{unless} macro. Unless we are at the end
13421of the buffer --- that is what the @code{eobp} function determines; it
13422is an abbreviation of @samp{End Of Buffer P} --- we decrease the value
13423of @code{arg} by one.
13424
13425(If we are at the end of the buffer, we cannot go forward any more and
13426the next loop of the @code{while} expression will test false since the
13427test is an @code{and} with @code{(not (eobp))}. The @code{not}
13428function means exactly as you expect; it is another name for
13429@code{null}, a function that returns true when its argument is false.)
13430
13431Interestingly, the loop count is not decremented until we leave the
13432space between paragraphs, unless we come to the end of buffer or stop
13433seeing the local value of the paragraph separator.
13434
13435That second @code{while} also has a @code{(move-to-left-margin)}
13436expression. The function is self-explanatory. It is inside a
13437@code{progn} expression and not the last element of its body, so it is
13438only invoked for its side effect, which is to move point to the left
13439margin of the current line.
13440
13441@findex looking-at
13442The @code{looking-at} function is also self-explanatory; it returns
13443true if the text after point matches the regular expression given as
13444its argument.
13445
13446The rest of the body of the loop looks difficult at first, but makes
13447sense as you come to understand it.
13448
13449@need 800
13450First consider what happens if there is a fill prefix:
13451
13452@smallexample
13453@group
13454 (if fill-prefix-regexp
13455 ;; There is a fill prefix; it overrides parstart;
13456 ;; we go forward line by line
13457 (while (and (not (eobp))
13458 (progn (move-to-left-margin) (not (eobp)))
13459 (not (looking-at parsep))
13460 (looking-at fill-prefix-regexp))
13461 (forward-line 1))
13462@end group
13463@end smallexample
13464
13465@noindent
13466This expression moves point forward line by line so long
13467as four conditions are true:
13468
13469@enumerate
13470@item
13471Point is not at the end of the buffer.
13472
13473@item
13474We can move to the left margin of the text and are
13475not at the end of the buffer.
13476
13477@item
13478The text following point does not separate paragraphs.
13479
13480@item
13481The pattern following point is the fill prefix regular expression.
13482@end enumerate
13483
13484The last condition may be puzzling, until you remember that point was
13485moved to the beginning of the line early in the @code{forward-paragraph}
13486function. This means that if the text has a fill prefix, the
13487@code{looking-at} function will see it.
13488
13489@need 1250
13490Consider what happens when there is no fill prefix.
13491
13492@smallexample
13493@group
13494 (while (and (re-search-forward sp-parstart nil 1)
13495 (progn (setq start (match-beginning 0))
13496 (goto-char start)
13497 (not (eobp)))
13498 (progn (move-to-left-margin)
13499 (not (looking-at parsep)))
13500 (or (not (looking-at parstart))
13501 (and use-hard-newlines
13502 (not (get-text-property (1- start) 'hard)))))
13503 (forward-char 1))
13504@end group
13505@end smallexample
13506
13507@noindent
13508This @code{while} loop has us searching forward for
13509@code{sp-parstart}, which is the combination of possible whitespace
13510with a the local value of the start of a paragraph or of a paragraph
13511separator. (The latter two are within an expression starting
13512@code{\(?:} so that they are not referenced by the
13513@code{match-beginning} function.)
13514
13515@need 800
13516The two expressions,
13517
13518@smallexample
13519@group
13520(setq start (match-beginning 0))
13521(goto-char start)
13522@end group
13523@end smallexample
13524
13525@noindent
13526mean go to the start of the text matched by the regular expression
13527search.
13528
13529The @code{(match-beginning 0)} expression is new. It returns a number
13530specifying the location of the start of the text that was matched by
13531the last search.
13532
13533The @code{match-beginning} function is used here because of a
13534characteristic of a forward search: a successful forward search,
13535regardless of whether it is a plain search or a regular expression
13536search, moves point to the end of the text that is found. In this
13537case, a successful search moves point to the end of the pattern for
13538@code{sp-parstart}.
13539
13540However, we want to put point at the end of the current paragraph, not
13541somewhere else. Indeed, since the search possibly includes the
13542paragraph separator, point may end up at the beginning of the next one
13543unless we use an expression that includes @code{match-beginning}.
13544
13545@findex match-beginning
13546When given an argument of 0, @code{match-beginning} returns the
13547position that is the start of the text matched by the most recent
13548search. In this case, the most recent search looks for
13549@code{sp-parstart}. The @code{(match-beginning 0)} expression returns
13550the beginning position of that pattern, rather than the end position
13551of that pattern.
13552
13553(Incidentally, when passed a positive number as an argument, the
13554@code{match-beginning} function returns the location of point at that
13555parenthesized expression in the last search unless that parenthesized
13556expression begins with @code{\(?:}. I don't know why @code{\(?:}
13557appears here since the argument is 0.)
13558
13559@need 1250
13560The last expression when there is no fill prefix is
13561
13562@smallexample
13563@group
13564(if (< (point) (point-max))
13565 (goto-char start))))
13566@end group
13567@end smallexample
13568
13569@noindent
13570This says that if there is no fill prefix and if we are not at the
13571end, point should move to the beginning of whatever was found by the
13572regular expression search for @code{sp-parstart}.
13573
13574The full definition for the @code{forward-paragraph} function not only
13575includes code for going forwards, but also code for going backwards.
13576
13577If you are reading this inside of GNU Emacs and you want to see the
13578whole function, you can type @kbd{C-h f} (@code{describe-function})
13579and the name of the function. This gives you the function
13580documentation and the name of the library containing the function's
13581source. Place point over the name of the library and press the RET
13582key; you will be taken directly to the source. (Be sure to install
13583your sources! Without them, you are like a person who tries to drive
13584a car with his eyes shut!)
13585
13586@node etags, Regexp Review, forward-paragraph, Regexp Search
13587@section Create Your Own @file{TAGS} File
13588@findex etags
13589@cindex @file{TAGS} file, create own
13590
13591Besides @kbd{C-h f} (@code{describe-function}), another way to see the
13592source of a function is to type @kbd{M-.} (@code{find-tag}) and the
13593name of the function when prompted for it. This is a good habit to
13594get into. The @kbd{M-.} (@code{find-tag}) command takes you directly
13595to the source for a function, variable, or node. The function depends
13596on tags tables to tell it where to go.
13597
13598If the @code{find-tag} function first asks you for the name of a
13599@file{TAGS} table, give it the name of a @file{TAGS} file such as
13600@file{/usr/local/src/emacs/src/TAGS}. (The exact path to your
13601@file{TAGS} file depends on how your copy of Emacs was installed. I
13602just told you the location that provides both my C and my Emacs Lisp
13603sources.)
13604
13605You can also create your own @file{TAGS} file for directories that
13606lack one.
13607
13608You often need to build and install tags tables yourself. They are
13609not built automatically. A tags table is called a @file{TAGS} file;
13610the name is in upper case letters.
13611
13612You can create a @file{TAGS} file by calling the @code{etags} program
13613that comes as a part of the Emacs distribution. Usually, @code{etags}
13614is compiled and installed when Emacs is built. (@code{etags} is not
13615an Emacs Lisp function or a part of Emacs; it is a C program.)
13616
13617@need 1250
13618To create a @file{TAGS} file, first switch to the directory in which
13619you want to create the file. In Emacs you can do this with the
13620@kbd{M-x cd} command, or by visiting a file in the directory, or by
13621listing the directory with @kbd{C-x d} (@code{dired}). Then run the
13622compile command, with @w{@code{etags *.el}} as the command to execute
13623
13624@smallexample
13625M-x compile RET etags *.el RET
13626@end smallexample
13627
13628@noindent
13629to create a @file{TAGS} file for Emacs Lisp.
13630
13631For example, if you have a large number of files in your
13632@file{~/emacs} directory, as I do---I have 137 @file{.el} files in it,
13633of which I load 12---you can create a @file{TAGS} file for the Emacs
13634Lisp files in that directory.
13635
13636@need 1250
13637The @code{etags} program takes all the usual shell `wildcards'. For
13638example, if you have two directories for which you want a single
13639@file{TAGS} file, type @w{@code{etags *.el ../elisp/*.el}}, where
13640@file{../elisp/} is the second directory:
13641
13642@smallexample
13643M-x compile RET etags *.el ../elisp/*.el RET
13644@end smallexample
13645
13646@need 1250
13647Type
13648
13649@smallexample
13650M-x compile RET etags --help RET
13651@end smallexample
13652
13653@noindent
13654to see a list of the options accepted by @code{etags} as well as a
13655list of supported languages.
13656
13657The @code{etags} program handles more than 20 languages, including
13658Emacs Lisp, Common Lisp, Scheme, C, C++, Ada, Fortran, HTML, Java,
7877f373 13659LaTeX, Pascal, Perl, PostScript, Python, TeX, Texinfo, makefiles, and
8cda6f8f
GM
13660most assemblers. The program has no switches for specifying the
13661language; it recognizes the language in an input file according to its
13662file name and contents.
13663
13664@file{etags} is very helpful when you are writing code yourself and
13665want to refer back to functions you have already written. Just run
13666@code{etags} again at intervals as you write new functions, so they
13667become part of the @file{TAGS} file.
13668
13669If you think an appropriate @file{TAGS} file already exists for what
13670you want, but do not know where it is, you can use the @code{locate}
13671program to attempt to find it.
13672
13673Type @w{@kbd{M-x locate @key{RET} TAGS @key{RET}}} and Emacs will list
13674for you the full path names of all your @file{TAGS} files. On my
13675system, this command lists 34 @file{TAGS} files. On the other hand, a
13676`plain vanilla' system I recently installed did not contain any
13677@file{TAGS} files.
13678
13679If the tags table you want has been created, you can use the @code{M-x
13680visit-tags-table} command to specify it. Otherwise, you will need to
13681create the tag table yourself and then use @code{M-x
13682visit-tags-table}.
13683
13684@subsubheading Building Tags in the Emacs sources
13685@cindex Building Tags in the Emacs sources
13686@cindex Tags in the Emacs sources
13687@findex make tags
13688
13689The GNU Emacs sources come with a @file{Makefile} that contains a
13690sophisticated @code{etags} command that creates, collects, and merges
13691tags tables from all over the Emacs sources and puts the information
13692into one @file{TAGS} file in the @file{src/} directory. (The
13693@file{src/} directory is below the top level of your Emacs directory.)
13694
13695@need 1250
13696To build this @file{TAGS} file, go to the top level of your Emacs
13697source directory and run the compile command @code{make tags}:
13698
13699@smallexample
13700M-x compile RET make tags RET
13701@end smallexample
13702
13703@noindent
13704(The @code{make tags} command works well with the GNU Emacs sources,
13705as well as with some other source packages.)
13706
13707For more information, see @ref{Tags, , Tag Tables, emacs, The GNU Emacs
13708Manual}.
13709
13710@node Regexp Review, re-search Exercises, etags, Regexp Search
13711@comment node-name, next, previous, up
13712@section Review
13713
13714Here is a brief summary of some recently introduced functions.
13715
13716@table @code
13717@item while
13718Repeatedly evaluate the body of the expression so long as the first
13719element of the body tests true. Then return @code{nil}. (The
13720expression is evaluated only for its side effects.)
13721
13722@need 1250
13723For example:
13724
13725@smallexample
13726@group
13727(let ((foo 2))
13728 (while (> foo 0)
13729 (insert (format "foo is %d.\n" foo))
13730 (setq foo (1- foo))))
13731
13732 @result{} foo is 2.
13733 foo is 1.
13734 nil
13735@end group
13736@end smallexample
13737
13738@noindent
13739(The @code{insert} function inserts its arguments at point; the
13740@code{format} function returns a string formatted from its arguments
13741the way @code{message} formats its arguments; @code{\n} produces a new
13742line.)
13743
13744@item re-search-forward
13745Search for a pattern, and if the pattern is found, move point to rest
13746just after it.
13747
13748@noindent
13749Takes four arguments, like @code{search-forward}:
13750
13751@enumerate
13752@item
13753A regular expression that specifies the pattern to search for.
13754(Remember to put quotation marks around this argument!)
13755
13756@item
13757Optionally, the limit of the search.
13758
13759@item
13760Optionally, what to do if the search fails, return @code{nil} or an
13761error message.
13762
13763@item
13764Optionally, how many times to repeat the search; if negative, the
13765search goes backwards.
13766@end enumerate
13767
13768@item let*
13769Bind some variables locally to particular values,
13770and then evaluate the remaining arguments, returning the value of the
13771last one. While binding the local variables, use the local values of
13772variables bound earlier, if any.
13773
13774@need 1250
13775For example:
13776
13777@smallexample
13778@group
13779(let* ((foo 7)
13780 (bar (* 3 foo)))
13781 (message "`bar' is %d." bar))
13782 @result{} `bar' is 21.
13783@end group
13784@end smallexample
13785
13786@item match-beginning
13787Return the position of the start of the text found by the last regular
13788expression search.
13789
13790@item looking-at
13791Return @code{t} for true if the text after point matches the argument,
13792which should be a regular expression.
13793
13794@item eobp
13795Return @code{t} for true if point is at the end of the accessible part
13796of a buffer. The end of the accessible part is the end of the buffer
13797if the buffer is not narrowed; it is the end of the narrowed part if
13798the buffer is narrowed.
13799@end table
13800
13801@need 1500
13802@node re-search Exercises, , Regexp Review, Regexp Search
13803@section Exercises with @code{re-search-forward}
13804
13805@itemize @bullet
13806@item
13807Write a function to search for a regular expression that matches two
13808or more blank lines in sequence.
13809
13810@item
13811Write a function to search for duplicated words, such as `the the'.
13812@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
13813Manual}, for information on how to write a regexp (a regular
13814expression) to match a string that is composed of two identical
13815halves. You can devise several regexps; some are better than others.
13816The function I use is described in an appendix, along with several
13817regexps. @xref{the-the, , @code{the-the} Duplicated Words Function}.
13818@end itemize
13819
13820@node Counting Words, Words in a defun, Regexp Search, Top
13821@chapter Counting: Repetition and Regexps
13822@cindex Repetition for word counting
13823@cindex Regular expressions for word counting
13824
13825Repetition and regular expression searches are powerful tools that you
13826often use when you write code in Emacs Lisp. This chapter illustrates
13827the use of regular expression searches through the construction of
13828word count commands using @code{while} loops and recursion.
13829
13830@menu
13831* Why Count Words::
ea4f7750 13832* @value{COUNT-WORDS}:: Use a regexp, but find a problem.
8cda6f8f
GM
13833* recursive-count-words:: Start with case of no words in region.
13834* Counting Exercise::
13835@end menu
13836
ea4f7750 13837@node Why Count Words, @value{COUNT-WORDS}, Counting Words, Counting Words
8cda6f8f
GM
13838@ifnottex
13839@unnumberedsec Counting words
13840@end ifnottex
13841
ea4f7750
GM
13842The standard Emacs distribution contains functions for counting the
13843number of lines and words within a region.
8cda6f8f
GM
13844
13845Certain types of writing ask you to count words. Thus, if you write
13846an essay, you may be limited to 800 words; if you write a novel, you
ea4f7750
GM
13847may discipline yourself to write 1000 words a day. It seems odd, but
13848for a long time, Emacs lacked a word count command. Perhaps people used
13849Emacs mostly for code or types of documentation that did not require
13850word counts; or perhaps they restricted themselves to the operating
13851system word count command, @code{wc}. Alternatively, people may have
13852followed the publishers' convention and computed a word count by
13853dividing the number of characters in a document by five.
13854
13855There are many ways to implement a command to count words. Here are
13856some examples, which you may wish to compare with the standard Emacs
13857command, @code{count-words-region}.
13858
13859@node @value{COUNT-WORDS}, recursive-count-words, Why Count Words, Counting Words
8cda6f8f 13860@comment node-name, next, previous, up
ea4f7750
GM
13861@section The @code{@value{COUNT-WORDS}} Function
13862@findex @value{COUNT-WORDS}
8cda6f8f
GM
13863
13864A word count command could count words in a line, paragraph, region,
13865or buffer. What should the command cover? You could design the
13866command to count the number of words in a complete buffer. However,
13867the Emacs tradition encourages flexibility---you may want to count
13868words in just a section, rather than all of a buffer. So it makes
13869more sense to design the command to count the number of words in a
ea4f7750 13870region. Once you have a command to count words in a region, you can,
8cda6f8f
GM
13871if you wish, count words in a whole buffer by marking it with
13872@w{@kbd{C-x h}} (@code{mark-whole-buffer}).
13873
13874Clearly, counting words is a repetitive act: starting from the
13875beginning of the region, you count the first word, then the second
13876word, then the third word, and so on, until you reach the end of the
13877region. This means that word counting is ideally suited to recursion
13878or to a @code{while} loop.
13879
13880@menu
ea4f7750
GM
13881* Design @value{COUNT-WORDS}:: The definition using a @code{while} loop.
13882* Whitespace Bug:: The Whitespace Bug in @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
13883@end menu
13884
ea4f7750 13885@node Design @value{COUNT-WORDS}, Whitespace Bug, @value{COUNT-WORDS}, @value{COUNT-WORDS}
8cda6f8f 13886@ifnottex
ea4f7750 13887@unnumberedsubsec Designing @code{@value{COUNT-WORDS}}
8cda6f8f
GM
13888@end ifnottex
13889
13890First, we will implement the word count command with a @code{while}
13891loop, then with recursion. The command will, of course, be
13892interactive.
13893
13894@need 800
13895The template for an interactive function definition is, as always:
13896
13897@smallexample
13898@group
13899(defun @var{name-of-function} (@var{argument-list})
13900 "@var{documentation}@dots{}"
13901 (@var{interactive-expression}@dots{})
13902 @var{body}@dots{})
13903@end group
13904@end smallexample
13905
13906What we need to do is fill in the slots.
13907
13908The name of the function should be self-explanatory and similar to the
13909existing @code{count-lines-region} name. This makes the name easier
ea4f7750
GM
13910to remember. @code{count-words-region} is the obvious choice. Since
13911that name is now used for the standard Emacs command to count words, we
13912will name our implementation @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
13913
13914The function counts words within a region. This means that the
13915argument list must contain symbols that are bound to the two
13916positions, the beginning and end of the region. These two positions
13917can be called @samp{beginning} and @samp{end} respectively. The first
13918line of the documentation should be a single sentence, since that is
13919all that is printed as documentation by a command such as
13920@code{apropos}. The interactive expression will be of the form
13921@samp{(interactive "r")}, since that will cause Emacs to pass the
13922beginning and end of the region to the function's argument list. All
13923this is routine.
13924
13925The body of the function needs to be written to do three tasks:
13926first, to set up conditions under which the @code{while} loop can
13927count words, second, to run the @code{while} loop, and third, to send
13928a message to the user.
13929
ea4f7750 13930When a user calls @code{@value{COUNT-WORDS}}, point may be at the
8cda6f8f
GM
13931beginning or the end of the region. However, the counting process
13932must start at the beginning of the region. This means we will want
13933to put point there if it is not already there. Executing
13934@code{(goto-char beginning)} ensures this. Of course, we will want to
13935return point to its expected position when the function finishes its
13936work. For this reason, the body must be enclosed in a
13937@code{save-excursion} expression.
13938
13939The central part of the body of the function consists of a
13940@code{while} loop in which one expression jumps point forward word by
13941word, and another expression counts those jumps. The true-or-false-test
13942of the @code{while} loop should test true so long as point should jump
13943forward, and false when point is at the end of the region.
13944
13945We could use @code{(forward-word 1)} as the expression for moving point
13946forward word by word, but it is easier to see what Emacs identifies as a
13947`word' if we use a regular expression search.
13948
13949A regular expression search that finds the pattern for which it is
13950searching leaves point after the last character matched. This means
13951that a succession of successful word searches will move point forward
13952word by word.
13953
13954As a practical matter, we want the regular expression search to jump
13955over whitespace and punctuation between words as well as over the
13956words themselves. A regexp that refuses to jump over interword
13957whitespace would never jump more than one word! This means that
13958the regexp should include the whitespace and punctuation that follows
13959a word, if any, as well as the word itself. (A word may end a buffer
13960and not have any following whitespace or punctuation, so that part of
13961the regexp must be optional.)
13962
13963Thus, what we want for the regexp is a pattern defining one or more
13964word constituent characters followed, optionally, by one or more
13965characters that are not word constituents. The regular expression for
13966this is:
13967
13968@smallexample
13969\w+\W*
13970@end smallexample
13971
13972@noindent
13973The buffer's syntax table determines which characters are and are not
13974word constituents. (@xref{Syntax, , What Constitutes a Word or
13975Symbol?}, for more about syntax. Also, see @ref{Syntax, Syntax, The
13976Syntax Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, ,
13977Syntax Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
13978
13979@need 800
13980The search expression looks like this:
13981
13982@smallexample
13983(re-search-forward "\\w+\\W*")
13984@end smallexample
13985
13986@noindent
13987(Note that paired backslashes precede the @samp{w} and @samp{W}. A
13988single backslash has special meaning to the Emacs Lisp interpreter.
13989It indicates that the following character is interpreted differently
13990than usual. For example, the two characters, @samp{\n}, stand for
13991@samp{newline}, rather than for a backslash followed by @samp{n}. Two
13992backslashes in a row stand for an ordinary, `unspecial' backslash, so
13993Emacs Lisp interpreter ends of seeing a single backslash followed by a
13994letter. So it discovers the letter is special.)
13995
13996We need a counter to count how many words there are; this variable
13997must first be set to 0 and then incremented each time Emacs goes
13998around the @code{while} loop. The incrementing expression is simply:
13999
14000@smallexample
14001(setq count (1+ count))
14002@end smallexample
14003
14004Finally, we want to tell the user how many words there are in the
14005region. The @code{message} function is intended for presenting this
14006kind of information to the user. The message has to be phrased so
14007that it reads properly regardless of how many words there are in the
14008region: we don't want to say that ``there are 1 words in the region''.
14009The conflict between singular and plural is ungrammatical. We can
14010solve this problem by using a conditional expression that evaluates
14011different messages depending on the number of words in the region.
14012There are three possibilities: no words in the region, one word in the
14013region, and more than one word. This means that the @code{cond}
14014special form is appropriate.
14015
14016@need 1500
14017All this leads to the following function definition:
14018
14019@smallexample
14020@group
14021;;; @r{First version; has bugs!}
ea4f7750 14022(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14023 "Print number of words in the region.
14024Words are defined as at least one word-constituent
14025character followed by at least one character that
14026is not a word-constituent. The buffer's syntax
14027table determines which characters these are."
14028 (interactive "r")
14029 (message "Counting words in region ... ")
14030@end group
14031
14032@group
14033;;; @r{1. Set up appropriate conditions.}
14034 (save-excursion
14035 (goto-char beginning)
14036 (let ((count 0))
14037@end group
14038
14039@group
14040;;; @r{2. Run the} while @r{loop.}
14041 (while (< (point) end)
14042 (re-search-forward "\\w+\\W*")
14043 (setq count (1+ count)))
14044@end group
14045
14046@group
14047;;; @r{3. Send a message to the user.}
14048 (cond ((zerop count)
14049 (message
14050 "The region does NOT have any words."))
14051 ((= 1 count)
14052 (message
14053 "The region has 1 word."))
14054 (t
14055 (message
14056 "The region has %d words." count))))))
14057@end group
14058@end smallexample
14059
14060@noindent
14061As written, the function works, but not in all circumstances.
14062
ea4f7750 14063@node Whitespace Bug, , Design @value{COUNT-WORDS}, @value{COUNT-WORDS}
8cda6f8f 14064@comment node-name, next, previous, up
ea4f7750 14065@subsection The Whitespace Bug in @code{@value{COUNT-WORDS}}
8cda6f8f 14066
ea4f7750 14067The @code{@value{COUNT-WORDS}} command described in the preceding
8cda6f8f
GM
14068section has two bugs, or rather, one bug with two manifestations.
14069First, if you mark a region containing only whitespace in the middle
ea4f7750 14070of some text, the @code{@value{COUNT-WORDS}} command tells you that the
8cda6f8f
GM
14071region contains one word! Second, if you mark a region containing
14072only whitespace at the end of the buffer or the accessible portion of
14073a narrowed buffer, the command displays an error message that looks
14074like this:
14075
14076@smallexample
14077Search failed: "\\w+\\W*"
14078@end smallexample
14079
14080If you are reading this in Info in GNU Emacs, you can test for these
14081bugs yourself.
14082
14083First, evaluate the function in the usual manner to install it.
14084@ifinfo
14085Here is a copy of the definition. Place your cursor after the closing
14086parenthesis and type @kbd{C-x C-e} to install it.
14087
14088@smallexample
14089@group
14090;; @r{First version; has bugs!}
ea4f7750 14091(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14092 "Print number of words in the region.
14093Words are defined as at least one word-constituent character followed
14094by at least one character that is not a word-constituent. The buffer's
14095syntax table determines which characters these are."
14096@end group
14097@group
14098 (interactive "r")
14099 (message "Counting words in region ... ")
14100@end group
14101
14102@group
14103;;; @r{1. Set up appropriate conditions.}
14104 (save-excursion
14105 (goto-char beginning)
14106 (let ((count 0))
14107@end group
14108
14109@group
14110;;; @r{2. Run the} while @r{loop.}
14111 (while (< (point) end)
14112 (re-search-forward "\\w+\\W*")
14113 (setq count (1+ count)))
14114@end group
14115
14116@group
14117;;; @r{3. Send a message to the user.}
14118 (cond ((zerop count)
14119 (message "The region does NOT have any words."))
14120 ((= 1 count) (message "The region has 1 word."))
14121 (t (message "The region has %d words." count))))))
14122@end group
14123@end smallexample
14124@end ifinfo
14125
14126@need 1000
14127If you wish, you can also install this keybinding by evaluating it:
14128
14129@smallexample
ea4f7750 14130(global-set-key "\C-c=" '@value{COUNT-WORDS})
8cda6f8f
GM
14131@end smallexample
14132
14133To conduct the first test, set mark and point to the beginning and end
14134of the following line and then type @kbd{C-c =} (or @kbd{M-x
ea4f7750 14135@value{COUNT-WORDS}} if you have not bound @kbd{C-c =}):
8cda6f8f
GM
14136
14137@smallexample
14138 one two three
14139@end smallexample
14140
14141@noindent
14142Emacs will tell you, correctly, that the region has three words.
14143
14144Repeat the test, but place mark at the beginning of the line and place
14145point just @emph{before} the word @samp{one}. Again type the command
ea4f7750 14146@kbd{C-c =} (or @kbd{M-x @value{COUNT-WORDS}}). Emacs should tell you
8cda6f8f
GM
14147that the region has no words, since it is composed only of the
14148whitespace at the beginning of the line. But instead Emacs tells you
14149that the region has one word!
14150
14151For the third test, copy the sample line to the end of the
14152@file{*scratch*} buffer and then type several spaces at the end of the
14153line. Place mark right after the word @samp{three} and point at the
14154end of line. (The end of the line will be the end of the buffer.)
ea4f7750 14155Type @kbd{C-c =} (or @kbd{M-x @value{COUNT-WORDS}}) as you did before.
8cda6f8f
GM
14156Again, Emacs should tell you that the region has no words, since it is
14157composed only of the whitespace at the end of the line. Instead,
14158Emacs displays an error message saying @samp{Search failed}.
14159
14160The two bugs stem from the same problem.
14161
14162Consider the first manifestation of the bug, in which the command
14163tells you that the whitespace at the beginning of the line contains
ea4f7750 14164one word. What happens is this: The @code{M-x @value{COUNT-WORDS}}
8cda6f8f
GM
14165command moves point to the beginning of the region. The @code{while}
14166tests whether the value of point is smaller than the value of
14167@code{end}, which it is. Consequently, the regular expression search
14168looks for and finds the first word. It leaves point after the word.
14169@code{count} is set to one. The @code{while} loop repeats; but this
14170time the value of point is larger than the value of @code{end}, the
14171loop is exited; and the function displays a message saying the number
14172of words in the region is one. In brief, the regular expression
14173search looks for and finds the word even though it is outside
14174the marked region.
14175
14176In the second manifestation of the bug, the region is whitespace at
14177the end of the buffer. Emacs says @samp{Search failed}. What happens
14178is that the true-or-false-test in the @code{while} loop tests true, so
14179the search expression is executed. But since there are no more words
14180in the buffer, the search fails.
14181
14182In both manifestations of the bug, the search extends or attempts to
14183extend outside of the region.
14184
14185The solution is to limit the search to the region---this is a fairly
14186simple action, but as you may have come to expect, it is not quite as
14187simple as you might think.
14188
14189As we have seen, the @code{re-search-forward} function takes a search
14190pattern as its first argument. But in addition to this first,
14191mandatory argument, it accepts three optional arguments. The optional
14192second argument bounds the search. The optional third argument, if
14193@code{t}, causes the function to return @code{nil} rather than signal
14194an error if the search fails. The optional fourth argument is a
14195repeat count. (In Emacs, you can see a function's documentation by
14196typing @kbd{C-h f}, the name of the function, and then @key{RET}.)
14197
ea4f7750 14198In the @code{@value{COUNT-WORDS}} definition, the value of the end of
8cda6f8f
GM
14199the region is held by the variable @code{end} which is passed as an
14200argument to the function. Thus, we can add @code{end} as an argument
14201to the regular expression search expression:
14202
14203@smallexample
14204(re-search-forward "\\w+\\W*" end)
14205@end smallexample
14206
ea4f7750 14207However, if you make only this change to the @code{@value{COUNT-WORDS}}
8cda6f8f
GM
14208definition and then test the new version of the definition on a
14209stretch of whitespace, you will receive an error message saying
14210@samp{Search failed}.
14211
14212What happens is this: the search is limited to the region, and fails
14213as you expect because there are no word-constituent characters in the
14214region. Since it fails, we receive an error message. But we do not
14215want to receive an error message in this case; we want to receive the
14216message that "The region does NOT have any words."
14217
14218The solution to this problem is to provide @code{re-search-forward}
14219with a third argument of @code{t}, which causes the function to return
14220@code{nil} rather than signal an error if the search fails.
14221
14222However, if you make this change and try it, you will see the message
14223``Counting words in region ... '' and @dots{} you will keep on seeing
14224that message @dots{}, until you type @kbd{C-g} (@code{keyboard-quit}).
14225
14226Here is what happens: the search is limited to the region, as before,
14227and it fails because there are no word-constituent characters in the
14228region, as expected. Consequently, the @code{re-search-forward}
14229expression returns @code{nil}. It does nothing else. In particular,
14230it does not move point, which it does as a side effect if it finds the
14231search target. After the @code{re-search-forward} expression returns
14232@code{nil}, the next expression in the @code{while} loop is evaluated.
14233This expression increments the count. Then the loop repeats. The
14234true-or-false-test tests true because the value of point is still less
14235than the value of end, since the @code{re-search-forward} expression
14236did not move point. @dots{} and the cycle repeats @dots{}
14237
ea4f7750 14238The @code{@value{COUNT-WORDS}} definition requires yet another
8cda6f8f
GM
14239modification, to cause the true-or-false-test of the @code{while} loop
14240to test false if the search fails. Put another way, there are two
14241conditions that must be satisfied in the true-or-false-test before the
14242word count variable is incremented: point must still be within the
14243region and the search expression must have found a word to count.
14244
14245Since both the first condition and the second condition must be true
14246together, the two expressions, the region test and the search
14247expression, can be joined with an @code{and} special form and embedded in
14248the @code{while} loop as the true-or-false-test, like this:
14249
14250@smallexample
14251(and (< (point) end) (re-search-forward "\\w+\\W*" end t))
14252@end smallexample
14253
14254@c colon in printed section title causes problem in Info cross reference
14255@c also trouble with an overfull hbox
14256@iftex
14257@noindent
14258(For information about @code{and}, see
14259@ref{kill-new function, , The @code{kill-new} function}.)
14260@end iftex
14261@ifinfo
14262@noindent
14263(@xref{kill-new function, , The @code{kill-new} function}, for
14264information about @code{and}.)
14265@end ifinfo
14266
14267The @code{re-search-forward} expression returns @code{t} if the search
14268succeeds and as a side effect moves point. Consequently, as words are
14269found, point is moved through the region. When the search expression
14270fails to find another word, or when point reaches the end of the
14271region, the true-or-false-test tests false, the @code{while} loop
ea4f7750 14272exits, and the @code{@value{COUNT-WORDS}} function displays one or
8cda6f8f
GM
14273other of its messages.
14274
ea4f7750 14275After incorporating these final changes, the @code{@value{COUNT-WORDS}}
8cda6f8f
GM
14276works without bugs (or at least, without bugs that I have found!).
14277Here is what it looks like:
14278
14279@smallexample
14280@group
14281;;; @r{Final version:} @code{while}
ea4f7750 14282(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14283 "Print number of words in the region."
14284 (interactive "r")
14285 (message "Counting words in region ... ")
14286@end group
14287
14288@group
14289;;; @r{1. Set up appropriate conditions.}
14290 (save-excursion
14291 (let ((count 0))
14292 (goto-char beginning)
14293@end group
14294
14295@group
14296;;; @r{2. Run the} while @r{loop.}
14297 (while (and (< (point) end)
14298 (re-search-forward "\\w+\\W*" end t))
14299 (setq count (1+ count)))
14300@end group
14301
14302@group
14303;;; @r{3. Send a message to the user.}
14304 (cond ((zerop count)
14305 (message
14306 "The region does NOT have any words."))
14307 ((= 1 count)
14308 (message
14309 "The region has 1 word."))
14310 (t
14311 (message
14312 "The region has %d words." count))))))
14313@end group
14314@end smallexample
14315
ea4f7750 14316@node recursive-count-words, Counting Exercise, @value{COUNT-WORDS}, Counting Words
8cda6f8f
GM
14317@comment node-name, next, previous, up
14318@section Count Words Recursively
14319@cindex Count words recursively
14320@cindex Recursively counting words
14321@cindex Words, counted recursively
14322
14323You can write the function for counting words recursively as well as
14324with a @code{while} loop. Let's see how this is done.
14325
ea4f7750 14326First, we need to recognize that the @code{@value{COUNT-WORDS}}
8cda6f8f
GM
14327function has three jobs: it sets up the appropriate conditions for
14328counting to occur; it counts the words in the region; and it sends a
14329message to the user telling how many words there are.
14330
14331If we write a single recursive function to do everything, we will
14332receive a message for every recursive call. If the region contains 13
14333words, we will receive thirteen messages, one right after the other.
14334We don't want this! Instead, we must write two functions to do the
14335job, one of which (the recursive function) will be used inside of the
14336other. One function will set up the conditions and display the
14337message; the other will return the word count.
14338
14339Let us start with the function that causes the message to be displayed.
ea4f7750 14340We can continue to call this @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
14341
14342This is the function that the user will call. It will be interactive.
14343Indeed, it will be similar to our previous versions of this
14344function, except that it will call @code{recursive-count-words} to
14345determine how many words are in the region.
14346
14347@need 1250
14348We can readily construct a template for this function, based on our
14349previous versions:
14350
14351@smallexample
14352@group
14353;; @r{Recursive version; uses regular expression search}
ea4f7750 14354(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14355 "@var{documentation}@dots{}"
14356 (@var{interactive-expression}@dots{})
14357@end group
14358@group
14359
14360;;; @r{1. Set up appropriate conditions.}
14361 (@var{explanatory message})
14362 (@var{set-up functions}@dots{}
14363@end group
14364@group
14365
14366;;; @r{2. Count the words.}
14367 @var{recursive call}
14368@end group
14369@group
14370
14371;;; @r{3. Send a message to the user.}
14372 @var{message providing word count}))
14373@end group
14374@end smallexample
14375
14376The definition looks straightforward, except that somehow the count
14377returned by the recursive call must be passed to the message
14378displaying the word count. A little thought suggests that this can be
14379done by making use of a @code{let} expression: we can bind a variable
14380in the varlist of a @code{let} expression to the number of words in
14381the region, as returned by the recursive call; and then the
14382@code{cond} expression, using binding, can display the value to the
14383user.
14384
14385Often, one thinks of the binding within a @code{let} expression as
14386somehow secondary to the `primary' work of a function. But in this
14387case, what you might consider the `primary' job of the function,
14388counting words, is done within the @code{let} expression.
14389
14390@need 1250
14391Using @code{let}, the function definition looks like this:
14392
14393@smallexample
14394@group
ea4f7750 14395(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14396 "Print number of words in the region."
14397 (interactive "r")
14398@end group
14399
14400@group
14401;;; @r{1. Set up appropriate conditions.}
14402 (message "Counting words in region ... ")
14403 (save-excursion
14404 (goto-char beginning)
14405@end group
14406
14407@group
14408;;; @r{2. Count the words.}
14409 (let ((count (recursive-count-words end)))
14410@end group
14411
14412@group
14413;;; @r{3. Send a message to the user.}
14414 (cond ((zerop count)
14415 (message
14416 "The region does NOT have any words."))
14417 ((= 1 count)
14418 (message
14419 "The region has 1 word."))
14420 (t
14421 (message
14422 "The region has %d words." count))))))
14423@end group
14424@end smallexample
14425
14426Next, we need to write the recursive counting function.
14427
14428A recursive function has at least three parts: the `do-again-test', the
14429`next-step-expression', and the recursive call.
14430
14431The do-again-test determines whether the function will or will not be
14432called again. Since we are counting words in a region and can use a
14433function that moves point forward for every word, the do-again-test
14434can check whether point is still within the region. The do-again-test
14435should find the value of point and determine whether point is before,
14436at, or after the value of the end of the region. We can use the
14437@code{point} function to locate point. Clearly, we must pass the
14438value of the end of the region to the recursive counting function as an
14439argument.
14440
14441In addition, the do-again-test should also test whether the search finds a
14442word. If it does not, the function should not call itself again.
14443
14444The next-step-expression changes a value so that when the recursive
14445function is supposed to stop calling itself, it stops. More
14446precisely, the next-step-expression changes a value so that at the
14447right time, the do-again-test stops the recursive function from
14448calling itself again. In this case, the next-step-expression can be
14449the expression that moves point forward, word by word.
14450
14451The third part of a recursive function is the recursive call.
14452
14453Somewhere, also, we also need a part that does the `work' of the
14454function, a part that does the counting. A vital part!
14455
14456@need 1250
14457But already, we have an outline of the recursive counting function:
14458
14459@smallexample
14460@group
14461(defun recursive-count-words (region-end)
14462 "@var{documentation}@dots{}"
14463 @var{do-again-test}
14464 @var{next-step-expression}
14465 @var{recursive call})
14466@end group
14467@end smallexample
14468
14469Now we need to fill in the slots. Let's start with the simplest cases
14470first: if point is at or beyond the end of the region, there cannot
14471be any words in the region, so the function should return zero.
14472Likewise, if the search fails, there are no words to count, so the
14473function should return zero.
14474
14475On the other hand, if point is within the region and the search
14476succeeds, the function should call itself again.
14477
14478@need 800
14479Thus, the do-again-test should look like this:
14480
14481@smallexample
14482@group
14483(and (< (point) region-end)
14484 (re-search-forward "\\w+\\W*" region-end t))
14485@end group
14486@end smallexample
14487
14488Note that the search expression is part of the do-again-test---the
14489function returns @code{t} if its search succeeds and @code{nil} if it
14490fails. (@xref{Whitespace Bug, , The Whitespace Bug in
ea4f7750 14491@code{@value{COUNT-WORDS}}}, for an explanation of how
8cda6f8f
GM
14492@code{re-search-forward} works.)
14493
14494The do-again-test is the true-or-false test of an @code{if} clause.
14495Clearly, if the do-again-test succeeds, the then-part of the @code{if}
14496clause should call the function again; but if it fails, the else-part
14497should return zero since either point is outside the region or the
14498search failed because there were no words to find.
14499
14500But before considering the recursive call, we need to consider the
14501next-step-expression. What is it? Interestingly, it is the search
14502part of the do-again-test.
14503
14504In addition to returning @code{t} or @code{nil} for the
14505do-again-test, @code{re-search-forward} moves point forward as a side
14506effect of a successful search. This is the action that changes the
14507value of point so that the recursive function stops calling itself
14508when point completes its movement through the region. Consequently,
14509the @code{re-search-forward} expression is the next-step-expression.
14510
14511@need 1200
14512In outline, then, the body of the @code{recursive-count-words}
14513function looks like this:
14514
14515@smallexample
14516@group
14517(if @var{do-again-test-and-next-step-combined}
14518 ;; @r{then}
14519 @var{recursive-call-returning-count}
14520 ;; @r{else}
14521 @var{return-zero})
14522@end group
14523@end smallexample
14524
14525How to incorporate the mechanism that counts?
14526
14527If you are not used to writing recursive functions, a question like
14528this can be troublesome. But it can and should be approached
14529systematically.
14530
14531We know that the counting mechanism should be associated in some way
14532with the recursive call. Indeed, since the next-step-expression moves
14533point forward by one word, and since a recursive call is made for
14534each word, the counting mechanism must be an expression that adds one
14535to the value returned by a call to @code{recursive-count-words}.
14536
14537@need 800
14538Consider several cases:
14539
14540@itemize @bullet
14541@item
14542If there are two words in the region, the function should return
14543a value resulting from adding one to the value returned when it counts
14544the first word, plus the number returned when it counts the remaining
14545words in the region, which in this case is one.
14546
14547@item
14548If there is one word in the region, the function should return
14549a value resulting from adding one to the value returned when it counts
14550that word, plus the number returned when it counts the remaining
14551words in the region, which in this case is zero.
14552
14553@item
14554If there are no words in the region, the function should return zero.
14555@end itemize
14556
14557From the sketch we can see that the else-part of the @code{if} returns
14558zero for the case of no words. This means that the then-part of the
14559@code{if} must return a value resulting from adding one to the value
14560returned from a count of the remaining words.
14561
14562@need 1200
14563The expression will look like this, where @code{1+} is a function that
14564adds one to its argument.
14565
14566@smallexample
14567(1+ (recursive-count-words region-end))
14568@end smallexample
14569
14570@need 1200
14571The whole @code{recursive-count-words} function will then look like
14572this:
14573
14574@smallexample
14575@group
14576(defun recursive-count-words (region-end)
14577 "@var{documentation}@dots{}"
14578
14579;;; @r{1. do-again-test}
14580 (if (and (< (point) region-end)
14581 (re-search-forward "\\w+\\W*" region-end t))
14582@end group
14583
14584@group
14585;;; @r{2. then-part: the recursive call}
14586 (1+ (recursive-count-words region-end))
14587
14588;;; @r{3. else-part}
14589 0))
14590@end group
14591@end smallexample
14592
14593@need 1250
14594Let's examine how this works:
14595
14596If there are no words in the region, the else part of the @code{if}
14597expression is evaluated and consequently the function returns zero.
14598
14599If there is one word in the region, the value of point is less than
14600the value of @code{region-end} and the search succeeds. In this case,
14601the true-or-false-test of the @code{if} expression tests true, and the
14602then-part of the @code{if} expression is evaluated. The counting
14603expression is evaluated. This expression returns a value (which will
14604be the value returned by the whole function) that is the sum of one
14605added to the value returned by a recursive call.
14606
14607Meanwhile, the next-step-expression has caused point to jump over the
14608first (and in this case only) word in the region. This means that
14609when @code{(recursive-count-words region-end)} is evaluated a second
14610time, as a result of the recursive call, the value of point will be
14611equal to or greater than the value of region end. So this time,
14612@code{recursive-count-words} will return zero. The zero will be added
14613to one, and the original evaluation of @code{recursive-count-words}
14614will return one plus zero, which is one, which is the correct amount.
14615
14616Clearly, if there are two words in the region, the first call to
14617@code{recursive-count-words} returns one added to the value returned
14618by calling @code{recursive-count-words} on a region containing the
14619remaining word---that is, it adds one to one, producing two, which is
14620the correct amount.
14621
14622Similarly, if there are three words in the region, the first call to
14623@code{recursive-count-words} returns one added to the value returned
14624by calling @code{recursive-count-words} on a region containing the
14625remaining two words---and so on and so on.
14626
14627@need 1250
14628@noindent
14629With full documentation the two functions look like this:
14630
14631@need 1250
14632@noindent
14633The recursive function:
14634
14635@findex recursive-count-words
14636@smallexample
14637@group
14638(defun recursive-count-words (region-end)
14639 "Number of words between point and REGION-END."
14640@end group
14641
14642@group
14643;;; @r{1. do-again-test}
14644 (if (and (< (point) region-end)
14645 (re-search-forward "\\w+\\W*" region-end t))
14646@end group
14647
14648@group
14649;;; @r{2. then-part: the recursive call}
14650 (1+ (recursive-count-words region-end))
14651
14652;;; @r{3. else-part}
14653 0))
14654@end group
14655@end smallexample
14656
14657@need 800
14658@noindent
14659The wrapper:
14660
14661@smallexample
14662@group
14663;;; @r{Recursive version}
ea4f7750 14664(defun @value{COUNT-WORDS} (beginning end)
8cda6f8f
GM
14665 "Print number of words in the region.
14666@end group
14667
14668@group
14669Words are defined as at least one word-constituent
14670character followed by at least one character that is
14671not a word-constituent. The buffer's syntax table
14672determines which characters these are."
14673@end group
14674@group
14675 (interactive "r")
14676 (message "Counting words in region ... ")
14677 (save-excursion
14678 (goto-char beginning)
14679 (let ((count (recursive-count-words end)))
14680@end group
14681@group
14682 (cond ((zerop count)
14683 (message
14684 "The region does NOT have any words."))
14685@end group
14686@group
14687 ((= 1 count)
14688 (message "The region has 1 word."))
14689 (t
14690 (message
14691 "The region has %d words." count))))))
14692@end group
14693@end smallexample
14694
14695@node Counting Exercise, , recursive-count-words, Counting Words
14696@section Exercise: Counting Punctuation
14697
14698Using a @code{while} loop, write a function to count the number of
14699punctuation marks in a region---period, comma, semicolon, colon,
14700exclamation mark, and question mark. Do the same using recursion.
14701
14702@node Words in a defun, Readying a Graph, Counting Words, Top
14703@chapter Counting Words in a @code{defun}
14704@cindex Counting words in a @code{defun}
14705@cindex Word counting in a @code{defun}
14706
14707Our next project is to count the number of words in a function
14708definition. Clearly, this can be done using some variant of
ea4f7750 14709@code{@value{COUNT-WORDS}}. @xref{Counting Words, , Counting Words:
8cda6f8f
GM
14710Repetition and Regexps}. If we are just going to count the words in
14711one definition, it is easy enough to mark the definition with the
14712@kbd{C-M-h} (@code{mark-defun}) command, and then call
ea4f7750 14713@code{@value{COUNT-WORDS}}.
8cda6f8f
GM
14714
14715However, I am more ambitious: I want to count the words and symbols in
14716every definition in the Emacs sources and then print a graph that
14717shows how many functions there are of each length: how many contain 40
14718to 49 words or symbols, how many contain 50 to 59 words or symbols,
14719and so on. I have often been curious how long a typical function is,
14720and this will tell.
14721
14722@menu
14723* Divide and Conquer::
14724* Words and Symbols:: What to count?
14725* Syntax:: What constitutes a word or symbol?
ea4f7750 14726* count-words-in-defun:: Very like @code{@value{COUNT-WORDS}}.
8cda6f8f
GM
14727* Several defuns:: Counting several defuns in a file.
14728* Find a File:: Do you want to look at a file?
14729* lengths-list-file:: A list of the lengths of many definitions.
14730* Several files:: Counting in definitions in different files.
14731* Several files recursively:: Recursively counting in different files.
14732* Prepare the data:: Prepare the data for display in a graph.
14733@end menu
14734
14735@node Divide and Conquer, Words and Symbols, Words in a defun, Words in a defun
14736@ifnottex
14737@unnumberedsec Divide and Conquer
14738@end ifnottex
14739
14740Described in one phrase, the histogram project is daunting; but
14741divided into numerous small steps, each of which we can take one at a
14742time, the project becomes less fearsome. Let us consider what the
14743steps must be:
14744
14745@itemize @bullet
14746@item
14747First, write a function to count the words in one definition. This
14748includes the problem of handling symbols as well as words.
14749
14750@item
14751Second, write a function to list the numbers of words in each function
14752in a file. This function can use the @code{count-words-in-defun}
14753function.
14754
14755@item
14756Third, write a function to list the numbers of words in each function
14757in each of several files. This entails automatically finding the
14758various files, switching to them, and counting the words in the
14759definitions within them.
14760
14761@item
14762Fourth, write a function to convert the list of numbers that we
14763created in step three to a form that will be suitable for printing as
14764a graph.
14765
14766@item
14767Fifth, write a function to print the results as a graph.
14768@end itemize
14769
14770This is quite a project! But if we take each step slowly, it will not
14771be difficult.
14772
14773@node Words and Symbols, Syntax, Divide and Conquer, Words in a defun
14774@section What to Count?
14775@cindex Words and symbols in defun
14776
14777When we first start thinking about how to count the words in a
14778function definition, the first question is (or ought to be) what are
14779we going to count? When we speak of `words' with respect to a Lisp
14780function definition, we are actually speaking, in large part, of
14781`symbols'. For example, the following @code{multiply-by-seven}
14782function contains the five symbols @code{defun},
14783@code{multiply-by-seven}, @code{number}, @code{*}, and @code{7}. In
14784addition, in the documentation string, it contains the four words
14785@samp{Multiply}, @samp{NUMBER}, @samp{by}, and @samp{seven}. The
14786symbol @samp{number} is repeated, so the definition contains a total
14787of ten words and symbols.
14788
14789@smallexample
14790@group
14791(defun multiply-by-seven (number)
14792 "Multiply NUMBER by seven."
14793 (* 7 number))
14794@end group
14795@end smallexample
14796
14797@noindent
14798However, if we mark the @code{multiply-by-seven} definition with
14799@kbd{C-M-h} (@code{mark-defun}), and then call
ea4f7750
GM
14800@code{@value{COUNT-WORDS}} on it, we will find that
14801@code{@value{COUNT-WORDS}} claims the definition has eleven words, not
8cda6f8f
GM
14802ten! Something is wrong!
14803
ea4f7750 14804The problem is twofold: @code{@value{COUNT-WORDS}} does not count the
8cda6f8f
GM
14805@samp{*} as a word, and it counts the single symbol,
14806@code{multiply-by-seven}, as containing three words. The hyphens are
14807treated as if they were interword spaces rather than intraword
14808connectors: @samp{multiply-by-seven} is counted as if it were written
14809@samp{multiply by seven}.
14810
14811The cause of this confusion is the regular expression search within
ea4f7750
GM
14812the @code{@value{COUNT-WORDS}} definition that moves point forward word
14813by word. In the canonical version of @code{@value{COUNT-WORDS}}, the
8cda6f8f
GM
14814regexp is:
14815
14816@smallexample
14817"\\w+\\W*"
14818@end smallexample
14819
14820@noindent
14821This regular expression is a pattern defining one or more word
14822constituent characters possibly followed by one or more characters
14823that are not word constituents. What is meant by `word constituent
14824characters' brings us to the issue of syntax, which is worth a section
14825of its own.
14826
14827@node Syntax, count-words-in-defun, Words and Symbols, Words in a defun
14828@section What Constitutes a Word or Symbol?
14829@cindex Syntax categories and tables
14830
14831Emacs treats different characters as belonging to different
14832@dfn{syntax categories}. For example, the regular expression,
14833@samp{\\w+}, is a pattern specifying one or more @emph{word
14834constituent} characters. Word constituent characters are members of
14835one syntax category. Other syntax categories include the class of
14836punctuation characters, such as the period and the comma, and the
14837class of whitespace characters, such as the blank space and the tab
14838character. (For more information, see @ref{Syntax, Syntax, The Syntax
14839Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, , Syntax
14840Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
14841
14842Syntax tables specify which characters belong to which categories.
14843Usually, a hyphen is not specified as a `word constituent character'.
14844Instead, it is specified as being in the `class of characters that are
14845part of symbol names but not words.' This means that the
ea4f7750
GM
14846@code{@value{COUNT-WORDS}} function treats it in the same way it treats
14847an interword white space, which is why @code{@value{COUNT-WORDS}}
8cda6f8f
GM
14848counts @samp{multiply-by-seven} as three words.
14849
14850There are two ways to cause Emacs to count @samp{multiply-by-seven} as
14851one symbol: modify the syntax table or modify the regular expression.
14852
14853We could redefine a hyphen as a word constituent character by
14854modifying the syntax table that Emacs keeps for each mode. This
14855action would serve our purpose, except that a hyphen is merely the
14856most common character within symbols that is not typically a word
14857constituent character; there are others, too.
14858
14859Alternatively, we can redefine the regular expression used in the
ea4f7750 14860@code{@value{COUNT-WORDS}} definition so as to include symbols. This
8cda6f8f
GM
14861procedure has the merit of clarity, but the task is a little tricky.
14862
14863@need 1200
14864The first part is simple enough: the pattern must match ``at least one
14865character that is a word or symbol constituent''. Thus:
14866
14867@smallexample
14868"\\(\\w\\|\\s_\\)+"
14869@end smallexample
14870
14871@noindent
14872The @samp{\\(} is the first part of the grouping construct that
14873includes the @samp{\\w} and the @samp{\\s_} as alternatives, separated
14874by the @samp{\\|}. The @samp{\\w} matches any word-constituent
14875character and the @samp{\\s_} matches any character that is part of a
14876symbol name but not a word-constituent character. The @samp{+}
14877following the group indicates that the word or symbol constituent
14878characters must be matched at least once.
14879
14880However, the second part of the regexp is more difficult to design.
14881What we want is to follow the first part with ``optionally one or more
14882characters that are not constituents of a word or symbol''. At first,
14883I thought I could define this with the following:
14884
14885@smallexample
14886"\\(\\W\\|\\S_\\)*"
14887@end smallexample
14888
14889@noindent
14890The upper case @samp{W} and @samp{S} match characters that are
14891@emph{not} word or symbol constituents. Unfortunately, this
14892expression matches any character that is either not a word constituent
14893or not a symbol constituent. This matches any character!
14894
14895I then noticed that every word or symbol in my test region was
14896followed by white space (blank space, tab, or newline). So I tried
14897placing a pattern to match one or more blank spaces after the pattern
14898for one or more word or symbol constituents. This failed, too. Words
14899and symbols are often separated by whitespace, but in actual code
14900parentheses may follow symbols and punctuation may follow words. So
14901finally, I designed a pattern in which the word or symbol constituents
14902are followed optionally by characters that are not white space and
14903then followed optionally by white space.
14904
14905@need 800
14906Here is the full regular expression:
14907
14908@smallexample
14909"\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
14910@end smallexample
14911
14912@node count-words-in-defun, Several defuns, Syntax, Words in a defun
14913@section The @code{count-words-in-defun} Function
14914@cindex Counting words in a @code{defun}
14915
14916We have seen that there are several ways to write a
ea4f7750 14917@code{count-words-region} function. To write a
8cda6f8f
GM
14918@code{count-words-in-defun}, we need merely adapt one of these
14919versions.
14920
14921The version that uses a @code{while} loop is easy to understand, so I
14922am going to adapt that. Because @code{count-words-in-defun} will be
14923part of a more complex program, it need not be interactive and it need
14924not display a message but just return the count. These considerations
14925simplify the definition a little.
14926
14927On the other hand, @code{count-words-in-defun} will be used within a
14928buffer that contains function definitions. Consequently, it is
14929reasonable to ask that the function determine whether it is called
14930when point is within a function definition, and if it is, to return
14931the count for that definition. This adds complexity to the
14932definition, but saves us from needing to pass arguments to the
14933function.
14934
14935@need 1250
14936These considerations lead us to prepare the following template:
14937
14938@smallexample
14939@group
14940(defun count-words-in-defun ()
14941 "@var{documentation}@dots{}"
14942 (@var{set up}@dots{}
14943 (@var{while loop}@dots{})
14944 @var{return count})
14945@end group
14946@end smallexample
14947
14948@noindent
14949As usual, our job is to fill in the slots.
14950
14951First, the set up.
14952
14953We are presuming that this function will be called within a buffer
14954containing function definitions. Point will either be within a
14955function definition or not. For @code{count-words-in-defun} to work,
14956point must move to the beginning of the definition, a counter must
14957start at zero, and the counting loop must stop when point reaches the
14958end of the definition.
14959
14960The @code{beginning-of-defun} function searches backwards for an
14961opening delimiter such as a @samp{(} at the beginning of a line, and
14962moves point to that position, or else to the limit of the search. In
14963practice, this means that @code{beginning-of-defun} moves point to the
14964beginning of an enclosing or preceding function definition, or else to
14965the beginning of the buffer. We can use @code{beginning-of-defun} to
14966place point where we wish to start.
14967
14968The @code{while} loop requires a counter to keep track of the words or
14969symbols being counted. A @code{let} expression can be used to create
14970a local variable for this purpose, and bind it to an initial value of zero.
14971
14972The @code{end-of-defun} function works like @code{beginning-of-defun}
14973except that it moves point to the end of the definition.
14974@code{end-of-defun} can be used as part of an expression that
14975determines the position of the end of the definition.
14976
14977The set up for @code{count-words-in-defun} takes shape rapidly: first
14978we move point to the beginning of the definition, then we create a
14979local variable to hold the count, and finally, we record the position
14980of the end of the definition so the @code{while} loop will know when to stop
14981looping.
14982
14983@need 1250
14984The code looks like this:
14985
14986@smallexample
14987@group
14988(beginning-of-defun)
14989(let ((count 0)
14990 (end (save-excursion (end-of-defun) (point))))
14991@end group
14992@end smallexample
14993
14994@noindent
14995The code is simple. The only slight complication is likely to concern
14996@code{end}: it is bound to the position of the end of the definition
14997by a @code{save-excursion} expression that returns the value of point
14998after @code{end-of-defun} temporarily moves it to the end of the
14999definition.
15000
15001The second part of the @code{count-words-in-defun}, after the set up,
15002is the @code{while} loop.
15003
15004The loop must contain an expression that jumps point forward word by
15005word and symbol by symbol, and another expression that counts the
15006jumps. The true-or-false-test for the @code{while} loop should test
15007true so long as point should jump forward, and false when point is at
15008the end of the definition. We have already redefined the regular
15009expression for this (@pxref{Syntax}), so the loop is straightforward:
15010
15011@smallexample
15012@group
15013(while (and (< (point) end)
15014 (re-search-forward
15015 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*" end t)
15016 (setq count (1+ count)))
15017@end group
15018@end smallexample
15019
15020The third part of the function definition returns the count of words
15021and symbols. This part is the last expression within the body of the
15022@code{let} expression, and can be, very simply, the local variable
15023@code{count}, which when evaluated returns the count.
15024
15025@need 1250
15026Put together, the @code{count-words-in-defun} definition looks like this:
15027
15028@findex count-words-in-defun
15029@smallexample
15030@group
15031(defun count-words-in-defun ()
15032 "Return the number of words and symbols in a defun."
15033 (beginning-of-defun)
15034 (let ((count 0)
15035 (end (save-excursion (end-of-defun) (point))))
15036@end group
15037@group
15038 (while
15039 (and (< (point) end)
15040 (re-search-forward
15041 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
15042 end t))
15043 (setq count (1+ count)))
15044 count))
15045@end group
15046@end smallexample
15047
15048How to test this? The function is not interactive, but it is easy to
15049put a wrapper around the function to make it interactive; we can use
15050almost the same code as for the recursive version of
ea4f7750 15051@code{@value{COUNT-WORDS}}:
8cda6f8f
GM
15052
15053@smallexample
15054@group
15055;;; @r{Interactive version.}
15056(defun count-words-defun ()
15057 "Number of words and symbols in a function definition."
15058 (interactive)
15059 (message
15060 "Counting words and symbols in function definition ... ")
15061@end group
15062@group
15063 (let ((count (count-words-in-defun)))
15064 (cond
15065 ((zerop count)
15066 (message
15067 "The definition does NOT have any words or symbols."))
15068@end group
15069@group
15070 ((= 1 count)
15071 (message
15072 "The definition has 1 word or symbol."))
15073 (t
15074 (message
15075 "The definition has %d words or symbols." count)))))
15076@end group
15077@end smallexample
15078
15079@need 800
15080@noindent
15081Let's re-use @kbd{C-c =} as a convenient keybinding:
15082
15083@smallexample
15084(global-set-key "\C-c=" 'count-words-defun)
15085@end smallexample
15086
15087Now we can try out @code{count-words-defun}: install both
15088@code{count-words-in-defun} and @code{count-words-defun}, and set the
15089keybinding, and then place the cursor within the following definition:
15090
15091@smallexample
15092@group
15093(defun multiply-by-seven (number)
15094 "Multiply NUMBER by seven."
15095 (* 7 number))
15096 @result{} 10
15097@end group
15098@end smallexample
15099
15100@noindent
15101Success! The definition has 10 words and symbols.
15102
15103The next problem is to count the numbers of words and symbols in
15104several definitions within a single file.
15105
15106@node Several defuns, Find a File, count-words-in-defun, Words in a defun
15107@section Count Several @code{defuns} Within a File
15108
15109A file such as @file{simple.el} may have a hundred or more function
15110definitions within it. Our long term goal is to collect statistics on
15111many files, but as a first step, our immediate goal is to collect
15112statistics on one file.
15113
15114The information will be a series of numbers, each number being the
15115length of a function definition. We can store the numbers in a list.
15116
15117We know that we will want to incorporate the information regarding one
15118file with information about many other files; this means that the
15119function for counting definition lengths within one file need only
15120return the list of lengths. It need not and should not display any
15121messages.
15122
15123The word count commands contain one expression to jump point forward
15124word by word and another expression to count the jumps. The function
15125to return the lengths of definitions can be designed to work the same
15126way, with one expression to jump point forward definition by
15127definition and another expression to construct the lengths' list.
15128
15129This statement of the problem makes it elementary to write the
15130function definition. Clearly, we will start the count at the
15131beginning of the file, so the first command will be @code{(goto-char
15132(point-min))}. Next, we start the @code{while} loop; and the
15133true-or-false test of the loop can be a regular expression search for
15134the next function definition---so long as the search succeeds, point
15135is moved forward and then the body of the loop is evaluated. The body
15136needs an expression that constructs the lengths' list. @code{cons},
15137the list construction command, can be used to create the list. That
15138is almost all there is to it.
15139
15140@need 800
15141Here is what this fragment of code looks like:
15142
15143@smallexample
15144@group
15145(goto-char (point-min))
15146(while (re-search-forward "^(defun" nil t)
15147 (setq lengths-list
15148 (cons (count-words-in-defun) lengths-list)))
15149@end group
15150@end smallexample
15151
15152What we have left out is the mechanism for finding the file that
15153contains the function definitions.
15154
15155In previous examples, we either used this, the Info file, or we
15156switched back and forth to some other buffer, such as the
15157@file{*scratch*} buffer.
15158
15159Finding a file is a new process that we have not yet discussed.
15160
15161@node Find a File, lengths-list-file, Several defuns, Words in a defun
15162@comment node-name, next, previous, up
15163@section Find a File
15164@cindex Find a File
15165
15166To find a file in Emacs, you use the @kbd{C-x C-f} (@code{find-file})
15167command. This command is almost, but not quite right for the lengths
15168problem.
15169
15170@need 1200
15171Let's look at the source for @code{find-file}:
15172
15173@smallexample
15174@group
15175(defun find-file (filename)
15176 "Edit file FILENAME.
15177Switch to a buffer visiting file FILENAME,
15178creating one if none already exists."
15179 (interactive "FFind file: ")
15180 (switch-to-buffer (find-file-noselect filename)))
15181@end group
15182@end smallexample
15183
15184@noindent
15185(The most recent version of the @code{find-file} function definition
15186permits you to specify optional wildcards to visit multiple files; that
15187makes the definition more complex and we will not discuss it here,
15188since it is not relevant. You can see its source using either
15189@kbd{M-.} (@code{find-tag}) or @kbd{C-h f} (@code{describe-function}).)
15190
15191@ignore
15192In Emacs 22
15193(defun find-file (filename &optional wildcards)
15194 "Edit file FILENAME.
15195Switch to a buffer visiting file FILENAME,
15196creating one if none already exists.
15197Interactively, the default if you just type RET is the current directory,
15198but the visited file name is available through the minibuffer history:
15199type M-n to pull it into the minibuffer.
15200
15201Interactively, or if WILDCARDS is non-nil in a call from Lisp,
15202expand wildcards (if any) and visit multiple files. You can
15203suppress wildcard expansion by setting `find-file-wildcards' to nil.
15204
15205To visit a file without any kind of conversion and without
15206automatically choosing a major mode, use \\[find-file-literally]."
15207 (interactive (find-file-read-args "Find file: " nil))
15208 (let ((value (find-file-noselect filename nil nil wildcards)))
15209 (if (listp value)
15210 (mapcar 'switch-to-buffer (nreverse value))
15211 (switch-to-buffer value))))
15212@end ignore
15213
15214The definition I am showing possesses short but complete documentation
15215and an interactive specification that prompts you for a file name when
15216you use the command interactively. The body of the definition
15217contains two functions, @code{find-file-noselect} and
15218@code{switch-to-buffer}.
15219
15220According to its documentation as shown by @kbd{C-h f} (the
15221@code{describe-function} command), the @code{find-file-noselect}
15222function reads the named file into a buffer and returns the buffer.
15223(Its most recent version includes an optional wildcards argument,
15224too, as well as another to read a file literally and an other you
15225suppress warning messages. These optional arguments are irrelevant.)
15226
15227However, the @code{find-file-noselect} function does not select the
15228buffer in which it puts the file. Emacs does not switch its attention
15229(or yours if you are using @code{find-file-noselect}) to the selected
15230buffer. That is what @code{switch-to-buffer} does: it switches the
15231buffer to which Emacs attention is directed; and it switches the
15232buffer displayed in the window to the new buffer. We have discussed
15233buffer switching elsewhere. (@xref{Switching Buffers}.)
15234
15235In this histogram project, we do not need to display each file on the
15236screen as the program determines the length of each definition within
15237it. Instead of employing @code{switch-to-buffer}, we can work with
15238@code{set-buffer}, which redirects the attention of the computer
15239program to a different buffer but does not redisplay it on the screen.
15240So instead of calling on @code{find-file} to do the job, we must write
15241our own expression.
15242
15243The task is easy: use @code{find-file-noselect} and @code{set-buffer}.
15244
15245@node lengths-list-file, Several files, Find a File, Words in a defun
15246@section @code{lengths-list-file} in Detail
15247
15248The core of the @code{lengths-list-file} function is a @code{while}
15249loop containing a function to move point forward `defun by defun' and
15250a function to count the number of words and symbols in each defun.
15251This core must be surrounded by functions that do various other tasks,
15252including finding the file, and ensuring that point starts out at the
15253beginning of the file. The function definition looks like this:
15254@findex lengths-list-file
15255
15256@smallexample
15257@group
15258(defun lengths-list-file (filename)
15259 "Return list of definitions' lengths within FILE.
15260The returned list is a list of numbers.
15261Each number is the number of words or
15262symbols in one function definition."
15263@end group
15264@group
15265 (message "Working on `%s' ... " filename)
15266 (save-excursion
15267 (let ((buffer (find-file-noselect filename))
15268 (lengths-list))
15269 (set-buffer buffer)
15270 (setq buffer-read-only t)
15271 (widen)
15272 (goto-char (point-min))
15273 (while (re-search-forward "^(defun" nil t)
15274 (setq lengths-list
15275 (cons (count-words-in-defun) lengths-list)))
15276 (kill-buffer buffer)
15277 lengths-list)))
15278@end group
15279@end smallexample
15280
15281@noindent
15282The function is passed one argument, the name of the file on which it
15283will work. It has four lines of documentation, but no interactive
15284specification. Since people worry that a computer is broken if they
15285don't see anything going on, the first line of the body is a
15286message.
15287
15288The next line contains a @code{save-excursion} that returns Emacs'
15289attention to the current buffer when the function completes. This is
15290useful in case you embed this function in another function that
15291presumes point is restored to the original buffer.
15292
15293In the varlist of the @code{let} expression, Emacs finds the file and
15294binds the local variable @code{buffer} to the buffer containing the
15295file. At the same time, Emacs creates @code{lengths-list} as a local
15296variable.
15297
15298Next, Emacs switches its attention to the buffer.
15299
15300In the following line, Emacs makes the buffer read-only. Ideally,
15301this line is not necessary. None of the functions for counting words
15302and symbols in a function definition should change the buffer.
15303Besides, the buffer is not going to be saved, even if it were changed.
15304This line is entirely the consequence of great, perhaps excessive,
15305caution. The reason for the caution is that this function and those
15306it calls work on the sources for Emacs and it is inconvenient if they
15307are inadvertently modified. It goes without saying that I did not
15308realize a need for this line until an experiment went awry and started
15309to modify my Emacs source files @dots{}
15310
15311Next comes a call to widen the buffer if it is narrowed. This
15312function is usually not needed---Emacs creates a fresh buffer if none
15313already exists; but if a buffer visiting the file already exists Emacs
15314returns that one. In this case, the buffer may be narrowed and must
15315be widened. If we wanted to be fully `user-friendly', we would
15316arrange to save the restriction and the location of point, but we
15317won't.
15318
15319The @code{(goto-char (point-min))} expression moves point to the
15320beginning of the buffer.
15321
15322Then comes a @code{while} loop in which the `work' of the function is
15323carried out. In the loop, Emacs determines the length of each
15324definition and constructs a lengths' list containing the information.
15325
15326Emacs kills the buffer after working through it. This is to save
15327space inside of Emacs. My version of GNU Emacs 19 contained over 300
15328source files of interest; GNU Emacs 22 contains over a thousand source
15329files. Another function will apply @code{lengths-list-file} to each
15330of the files.
15331
15332Finally, the last expression within the @code{let} expression is the
15333@code{lengths-list} variable; its value is returned as the value of
15334the whole function.
15335
15336You can try this function by installing it in the usual fashion. Then
15337place your cursor after the following expression and type @kbd{C-x
15338C-e} (@code{eval-last-sexp}).
15339
15340@c !!! 22.1.1 lisp sources location here
15341@smallexample
15342(lengths-list-file
15343 "/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el")
15344@end smallexample
15345
15346@noindent
15347(You may need to change the pathname of the file; the one here is for
15348GNU Emacs version 22.1.1. To change the expression, copy it to
15349the @file{*scratch*} buffer and edit it.
15350
15351@need 1200
15352@noindent
15353(Also, to see the full length of the list, rather than a truncated
15354version, you may have to evaluate the following:
15355
15356@smallexample
15357(custom-set-variables '(eval-expression-print-length nil))
15358@end smallexample
15359
15360@noindent
15361(@xref{defcustom, , Specifying Variables using @code{defcustom}}.
15362Then evaluate the @code{lengths-list-file} expression.)
15363
15364@need 1200
15365The lengths' list for @file{debug.el} takes less than a second to
15366produce and looks like this in GNU Emacs 22:
15367
15368@smallexample
15369(83 113 105 144 289 22 30 97 48 89 25 52 52 88 28 29 77 49 43 290 232 587)
15370@end smallexample
15371
15372@need 1500
15373(Using my old machine, the version 19 lengths' list for @file{debug.el}
15374took seven seconds to produce and looked like this:
15375
15376@smallexample
15377(75 41 80 62 20 45 44 68 45 12 34 235)
15378@end smallexample
15379
15380(The newer version of @file{debug.el} contains more defuns than the
15381earlier one; and my new machine is much faster than the old one.)
15382
15383Note that the length of the last definition in the file is first in
15384the list.
15385
15386@node Several files, Several files recursively, lengths-list-file, Words in a defun
15387@section Count Words in @code{defuns} in Different Files
15388
15389In the previous section, we created a function that returns a list of
15390the lengths of each definition in a file. Now, we want to define a
15391function to return a master list of the lengths of the definitions in
15392a list of files.
15393
15394Working on each of a list of files is a repetitious act, so we can use
15395either a @code{while} loop or recursion.
15396
15397@menu
15398* lengths-list-many-files:: Return a list of the lengths of defuns.
15399* append:: Attach one list to another.
15400@end menu
15401
15402@node lengths-list-many-files, append, Several files, Several files
15403@ifnottex
15404@unnumberedsubsec Determine the lengths of @code{defuns}
15405@end ifnottex
15406
15407The design using a @code{while} loop is routine. The argument passed
15408the function is a list of files. As we saw earlier (@pxref{Loop
15409Example}), you can write a @code{while} loop so that the body of the
15410loop is evaluated if such a list contains elements, but to exit the
15411loop if the list is empty. For this design to work, the body of the
15412loop must contain an expression that shortens the list each time the
15413body is evaluated, so that eventually the list is empty. The usual
15414technique is to set the value of the list to the value of the @sc{cdr}
15415of the list each time the body is evaluated.
15416
15417@need 800
15418The template looks like this:
15419
15420@smallexample
15421@group
15422(while @var{test-whether-list-is-empty}
15423 @var{body}@dots{}
15424 @var{set-list-to-cdr-of-list})
15425@end group
15426@end smallexample
15427
15428Also, we remember that a @code{while} loop returns @code{nil} (the
15429result of evaluating the true-or-false-test), not the result of any
15430evaluation within its body. (The evaluations within the body of the
15431loop are done for their side effects.) However, the expression that
15432sets the lengths' list is part of the body---and that is the value
15433that we want returned by the function as a whole. To do this, we
15434enclose the @code{while} loop within a @code{let} expression, and
15435arrange that the last element of the @code{let} expression contains
15436the value of the lengths' list. (@xref{Incrementing Example, , Loop
15437Example with an Incrementing Counter}.)
15438
15439@findex lengths-list-many-files
15440@need 1250
15441These considerations lead us directly to the function itself:
15442
15443@smallexample
15444@group
15445;;; @r{Use @code{while} loop.}
15446(defun lengths-list-many-files (list-of-files)
15447 "Return list of lengths of defuns in LIST-OF-FILES."
15448@end group
15449@group
15450 (let (lengths-list)
15451
15452;;; @r{true-or-false-test}
15453 (while list-of-files
15454 (setq lengths-list
15455 (append
15456 lengths-list
15457
15458;;; @r{Generate a lengths' list.}
15459 (lengths-list-file
15460 (expand-file-name (car list-of-files)))))
15461@end group
15462
15463@group
15464;;; @r{Make files' list shorter.}
15465 (setq list-of-files (cdr list-of-files)))
15466
15467;;; @r{Return final value of lengths' list.}
15468 lengths-list))
15469@end group
15470@end smallexample
15471
15472@code{expand-file-name} is a built-in function that converts a file
15473name to the absolute, long, path name form. The function employs the
15474name of the directory in which the function is called.
15475
15476@c !!! 22.1.1 lisp sources location here
15477@need 1500
15478Thus, if @code{expand-file-name} is called on @code{debug.el} when
15479Emacs is visiting the
15480@file{/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/} directory,
15481
15482@smallexample
15483debug.el
15484@end smallexample
15485
15486@need 800
15487@noindent
15488becomes
15489
15490@c !!! 22.1.1 lisp sources location here
15491@smallexample
15492/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el
15493@end smallexample
15494
15495The only other new element of this function definition is the as yet
15496unstudied function @code{append}, which merits a short section for
15497itself.
15498
15499@node append, , lengths-list-many-files, Several files
15500@subsection The @code{append} Function
15501
15502@need 800
15503The @code{append} function attaches one list to another. Thus,
15504
15505@smallexample
15506(append '(1 2 3 4) '(5 6 7 8))
15507@end smallexample
15508
15509@need 800
15510@noindent
15511produces the list
15512
15513@smallexample
15514(1 2 3 4 5 6 7 8)
15515@end smallexample
15516
15517This is exactly how we want to attach two lengths' lists produced by
15518@code{lengths-list-file} to each other. The results contrast with
15519@code{cons},
15520
15521@smallexample
15522(cons '(1 2 3 4) '(5 6 7 8))
15523@end smallexample
15524
15525@need 1250
15526@noindent
15527which constructs a new list in which the first argument to @code{cons}
15528becomes the first element of the new list:
15529
15530@smallexample
15531((1 2 3 4) 5 6 7 8)
15532@end smallexample
15533
15534@node Several files recursively, Prepare the data, Several files, Words in a defun
15535@section Recursively Count Words in Different Files
15536
15537Besides a @code{while} loop, you can work on each of a list of files
15538with recursion. A recursive version of @code{lengths-list-many-files}
15539is short and simple.
15540
15541The recursive function has the usual parts: the `do-again-test', the
15542`next-step-expression', and the recursive call. The `do-again-test'
15543determines whether the function should call itself again, which it
15544will do if the @code{list-of-files} contains any remaining elements;
15545the `next-step-expression' resets the @code{list-of-files} to the
15546@sc{cdr} of itself, so eventually the list will be empty; and the
15547recursive call calls itself on the shorter list. The complete
15548function is shorter than this description!
15549@findex recursive-lengths-list-many-files
15550
15551@smallexample
15552@group
15553(defun recursive-lengths-list-many-files (list-of-files)
15554 "Return list of lengths of each defun in LIST-OF-FILES."
15555 (if list-of-files ; @r{do-again-test}
15556 (append
15557 (lengths-list-file
15558 (expand-file-name (car list-of-files)))
15559 (recursive-lengths-list-many-files
15560 (cdr list-of-files)))))
15561@end group
15562@end smallexample
15563
15564@noindent
15565In a sentence, the function returns the lengths' list for the first of
15566the @code{list-of-files} appended to the result of calling itself on
15567the rest of the @code{list-of-files}.
15568
15569Here is a test of @code{recursive-lengths-list-many-files}, along with
15570the results of running @code{lengths-list-file} on each of the files
15571individually.
15572
15573Install @code{recursive-lengths-list-many-files} and
15574@code{lengths-list-file}, if necessary, and then evaluate the
15575following expressions. You may need to change the files' pathnames;
15576those here work when this Info file and the Emacs sources are located
15577in their customary places. To change the expressions, copy them to
15578the @file{*scratch*} buffer, edit them, and then evaluate them.
15579
15580The results are shown after the @samp{@result{}}. (These results are
15581for files from Emacs version 22.1.1; files from other versions of
15582Emacs may produce different results.)
15583
15584@c !!! 22.1.1 lisp sources location here
15585@smallexample
15586@group
15587(cd "/usr/local/share/emacs/22.1.1/")
15588
15589(lengths-list-file "./lisp/macros.el")
15590 @result{} (283 263 480 90)
15591@end group
15592
15593@group
15594(lengths-list-file "./lisp/mail/mailalias.el")
15595 @result{} (38 32 29 95 178 180 321 218 324)
15596@end group
15597
15598@group
15599(lengths-list-file "./lisp/makesum.el")
15600 @result{} (85 181)
15601@end group
15602
15603@group
15604 (recursive-lengths-list-many-files
15605 '("./lisp/macros.el"
15606 "./lisp/mail/mailalias.el"
15607 "./lisp/makesum.el"))
15608 @result{} (283 263 480 90 38 32 29 95 178 180 321 218 324 85 181)
15609@end group
15610@end smallexample
15611
15612The @code{recursive-lengths-list-many-files} function produces the
15613output we want.
15614
15615The next step is to prepare the data in the list for display in a graph.
15616
15617@node Prepare the data, , Several files recursively, Words in a defun
15618@section Prepare the Data for Display in a Graph
15619
15620The @code{recursive-lengths-list-many-files} function returns a list
15621of numbers. Each number records the length of a function definition.
15622What we need to do now is transform this data into a list of numbers
15623suitable for generating a graph. The new list will tell how many
15624functions definitions contain less than 10 words and
15625symbols, how many contain between 10 and 19 words and symbols, how
15626many contain between 20 and 29 words and symbols, and so on.
15627
15628In brief, we need to go through the lengths' list produced by the
15629@code{recursive-lengths-list-many-files} function and count the number
15630of defuns within each range of lengths, and produce a list of those
15631numbers.
15632
15633@menu
15634* Data for Display in Detail::
15635* Sorting:: Sorting lists.
15636* Files List:: Making a list of files.
15637* Counting function definitions::
15638@end menu
15639
15640@node Data for Display in Detail, Sorting, Prepare the data, Prepare the data
15641@ifnottex
15642@unnumberedsubsec The Data for Display in Detail
15643@end ifnottex
15644
15645Based on what we have done before, we can readily foresee that it
15646should not be too hard to write a function that `@sc{cdr}s' down the
15647lengths' list, looks at each element, determines which length range it
15648is in, and increments a counter for that range.
15649
15650However, before beginning to write such a function, we should consider
15651the advantages of sorting the lengths' list first, so the numbers are
15652ordered from smallest to largest. First, sorting will make it easier
15653to count the numbers in each range, since two adjacent numbers will
15654either be in the same length range or in adjacent ranges. Second, by
15655inspecting a sorted list, we can discover the highest and lowest
15656number, and thereby determine the largest and smallest length range
15657that we will need.
15658
15659@node Sorting, Files List, Data for Display in Detail, Prepare the data
15660@subsection Sorting Lists
15661@findex sort
15662
15663Emacs contains a function to sort lists, called (as you might guess)
15664@code{sort}. The @code{sort} function takes two arguments, the list
15665to be sorted, and a predicate that determines whether the first of
15666two list elements is ``less'' than the second.
15667
15668As we saw earlier (@pxref{Wrong Type of Argument, , Using the Wrong
15669Type Object as an Argument}), a predicate is a function that
15670determines whether some property is true or false. The @code{sort}
15671function will reorder a list according to whatever property the
15672predicate uses; this means that @code{sort} can be used to sort
15673non-numeric lists by non-numeric criteria---it can, for example,
15674alphabetize a list.
15675
15676@need 1250
15677The @code{<} function is used when sorting a numeric list. For example,
15678
15679@smallexample
15680(sort '(4 8 21 17 33 7 21 7) '<)
15681@end smallexample
15682
15683@need 800
15684@noindent
15685produces this:
15686
15687@smallexample
15688(4 7 7 8 17 21 21 33)
15689@end smallexample
15690
15691@noindent
15692(Note that in this example, both the arguments are quoted so that the
15693symbols are not evaluated before being passed to @code{sort} as
15694arguments.)
15695
15696Sorting the list returned by the
15697@code{recursive-lengths-list-many-files} function is straightforward;
15698it uses the @code{<} function:
15699
15700@ignore
157012006 Oct 29
15702In GNU Emacs 22, eval
15703(progn
15704 (cd "/usr/local/share/emacs/22.0.50/")
15705 (sort
15706 (recursive-lengths-list-many-files
15707 '("./lisp/macros.el"
15708 "./lisp/mail/mailalias.el"
15709 "./lisp/makesum.el"))
15710 '<))
15711
15712@end ignore
15713
15714@smallexample
15715@group
15716(sort
15717 (recursive-lengths-list-many-files
15718 '("./lisp/macros.el"
15719 "./lisp/mailalias.el"
15720 "./lisp/makesum.el"))
15721 '<)
15722@end group
15723@end smallexample
15724
15725@need 800
15726@noindent
15727which produces:
15728
15729@smallexample
15730(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
15731@end smallexample
15732
15733@noindent
15734(Note that in this example, the first argument to @code{sort} is not
15735quoted, since the expression must be evaluated so as to produce the
15736list that is passed to @code{sort}.)
15737
15738@node Files List, Counting function definitions, Sorting, Prepare the data
15739@subsection Making a List of Files
15740
15741The @code{recursive-lengths-list-many-files} function requires a list
15742of files as its argument. For our test examples, we constructed such
15743a list by hand; but the Emacs Lisp source directory is too large for
15744us to do for that. Instead, we will write a function to do the job
15745for us. In this function, we will use both a @code{while} loop and a
15746recursive call.
15747
15748@findex directory-files
15749We did not have to write a function like this for older versions of
15750GNU Emacs, since they placed all the @samp{.el} files in one
15751directory. Instead, we were able to use the @code{directory-files}
15752function, which lists the names of files that match a specified
15753pattern within a single directory.
15754
15755However, recent versions of Emacs place Emacs Lisp files in
15756sub-directories of the top level @file{lisp} directory. This
15757re-arrangement eases navigation. For example, all the mail related
15758files are in a @file{lisp} sub-directory called @file{mail}. But at
15759the same time, this arrangement forces us to create a file listing
15760function that descends into the sub-directories.
15761
15762@findex files-in-below-directory
15763We can create this function, called @code{files-in-below-directory},
15764using familiar functions such as @code{car}, @code{nthcdr}, and
15765@code{substring} in conjunction with an existing function called
15766@code{directory-files-and-attributes}. This latter function not only
15767lists all the filenames in a directory, including the names
15768of sub-directories, but also their attributes.
15769
15770To restate our goal: to create a function that will enable us
15771to feed filenames to @code{recursive-lengths-list-many-files}
15772as a list that looks like this (but with more elements):
15773
15774@smallexample
15775@group
15776("./lisp/macros.el"
15777 "./lisp/mail/rmail.el"
15778 "./lisp/makesum.el")
15779@end group
15780@end smallexample
15781
15782The @code{directory-files-and-attributes} function returns a list of
15783lists. Each of the lists within the main list consists of 13
15784elements. The first element is a string that contains the name of the
15785file -- which, in GNU/Linux, may be a `directory file', that is to
15786say, a file with the special attributes of a directory. The second
15787element of the list is @code{t} for a directory, a string
15788for symbolic link (the string is the name linked to), or @code{nil}.
15789
15790For example, the first @samp{.el} file in the @file{lisp/} directory
15791is @file{abbrev.el}. Its name is
15792@file{/usr/local/share/emacs/22.1.1/lisp/abbrev.el} and it is not a
15793directory or a symbolic link.
15794
15795@need 1000
15796This is how @code{directory-files-and-attributes} lists that file and
15797its attributes:
15798
15799@smallexample
15800@group
15801("abbrev.el"
15802nil
158031
158041000
15805100
15806@end group
15807@group
15808(17733 259)
15809(17491 28834)
15810(17596 62124)
1581113157
15812"-rw-rw-r--"
15813@end group
15814@group
15815nil
158162971624
15817773)
15818@end group
15819@end smallexample
15820
15821@need 1200
15822On the other hand, @file{mail/} is a directory within the @file{lisp/}
15823directory. The beginning of its listing looks like this:
15824
15825@smallexample
15826@group
15827("mail"
15828t
15829@dots{}
15830)
15831@end group
15832@end smallexample
15833
15834(To learn about the different attributes, look at the documentation of
15835@code{file-attributes}. Bear in mind that the @code{file-attributes}
15836function does not list the filename, so its first element is
15837@code{directory-files-and-attributes}'s second element.)
15838
15839We will want our new function, @code{files-in-below-directory}, to
15840list the @samp{.el} files in the directory it is told to check, and in
15841any directories below that directory.
15842
15843This gives us a hint on how to construct
15844@code{files-in-below-directory}: within a directory, the function
15845should add @samp{.el} filenames to a list; and if, within a directory,
15846the function comes upon a sub-directory, it should go into that
15847sub-directory and repeat its actions.
15848
15849However, we should note that every directory contains a name that
15850refers to itself, called @file{.}, (``dot'') and a name that refers to
15851its parent directory, called @file{..} (``double dot''). (In
15852@file{/}, the root directory, @file{..} refers to itself, since
15853@file{/} has no parent.) Clearly, we do not want our
15854@code{files-in-below-directory} function to enter those directories,
15855since they always lead us, directly or indirectly, to the current
15856directory.
15857
15858Consequently, our @code{files-in-below-directory} function must do
15859several tasks:
15860
15861@itemize @bullet
15862@item
15863Check to see whether it is looking at a filename that ends in
15864@samp{.el}; and if so, add its name to a list.
15865
15866@item
15867Check to see whether it is looking at a filename that is the name of a
15868directory; and if so,
15869
15870@itemize @minus
15871@item
15872Check to see whether it is looking at @file{.} or @file{..}; and if
15873so skip it.
15874
15875@item
15876Or else, go into that directory and repeat the process.
15877@end itemize
15878@end itemize
15879
15880Let's write a function definition to do these tasks. We will use a
15881@code{while} loop to move from one filename to another within a
15882directory, checking what needs to be done; and we will use a recursive
15883call to repeat the actions on each sub-directory. The recursive
15884pattern is `accumulate'
15885(@pxref{Accumulate, , Recursive Pattern: @emph{accumulate}}),
15886using @code{append} as the combiner.
15887
15888@ignore
15889(directory-files "/usr/local/src/emacs/lisp/" t "\\.el$")
15890(shell-command "find /usr/local/src/emacs/lisp/ -name '*.el'")
15891
15892(directory-files "/usr/local/share/emacs/22.1.1/lisp/" t "\\.el$")
15893(shell-command "find /usr/local/share/emacs/22.1.1/lisp/ -name '*.el'")
15894@end ignore
15895
15896@c /usr/local/share/emacs/22.1.1/lisp/
15897
15898@need 800
15899Here is the function:
15900
15901@smallexample
15902@group
15903(defun files-in-below-directory (directory)
15904 "List the .el files in DIRECTORY and in its sub-directories."
15905 ;; Although the function will be used non-interactively,
15906 ;; it will be easier to test if we make it interactive.
15907 ;; The directory will have a name such as
15908 ;; "/usr/local/share/emacs/22.1.1/lisp/"
15909 (interactive "DDirectory name: ")
15910@end group
15911@group
15912 (let (el-files-list
15913 (current-directory-list
15914 (directory-files-and-attributes directory t)))
15915 ;; while we are in the current directory
15916 (while current-directory-list
15917@end group
15918@group
15919 (cond
15920 ;; check to see whether filename ends in `.el'
15921 ;; and if so, append its name to a list.
15922 ((equal ".el" (substring (car (car current-directory-list)) -3))
15923 (setq el-files-list
15924 (cons (car (car current-directory-list)) el-files-list)))
15925@end group
15926@group
15927 ;; check whether filename is that of a directory
15928 ((eq t (car (cdr (car current-directory-list))))
15929 ;; decide whether to skip or recurse
15930 (if
15931 (equal "."
15932 (substring (car (car current-directory-list)) -1))
15933 ;; then do nothing since filename is that of
15934 ;; current directory or parent, "." or ".."
15935 ()
15936@end group
15937@group
15938 ;; else descend into the directory and repeat the process
15939 (setq el-files-list
15940 (append
15941 (files-in-below-directory
15942 (car (car current-directory-list)))
15943 el-files-list)))))
15944 ;; move to the next filename in the list; this also
15945 ;; shortens the list so the while loop eventually comes to an end
15946 (setq current-directory-list (cdr current-directory-list)))
15947 ;; return the filenames
15948 el-files-list))
15949@end group
15950@end smallexample
15951
15952@c (files-in-below-directory "/usr/local/src/emacs/lisp/")
15953@c (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
15954
15955The @code{files-in-below-directory} @code{directory-files} function
15956takes one argument, the name of a directory.
15957
15958@need 1250
15959Thus, on my system,
15960
15961@c (length (files-in-below-directory "/usr/local/src/emacs/lisp/"))
15962
15963@c !!! 22.1.1 lisp sources location here
15964@smallexample
15965@group
15966(length
15967 (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/"))
15968@end group
15969@end smallexample
15970
15971@noindent
15972tells me that in and below my Lisp sources directory are 1031
15973@samp{.el} files.
15974
15975@code{files-in-below-directory} returns a list in reverse alphabetical
15976order. An expression to sort the list in alphabetical order looks
15977like this:
15978
15979@smallexample
15980@group
15981(sort
15982 (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
15983 'string-lessp)
15984@end group
15985@end smallexample
15986
15987@ignore
15988(defun test ()
15989 "Test how long it takes to find lengths of all sorted elisp defuns."
15990 (insert "\n" (current-time-string) "\n")
15991 (sit-for 0)
15992 (sort
15993 (recursive-lengths-list-many-files
15994 (files-in-below-directory "/usr/local/src/emacs/lisp/"))
15995 '<)
15996 (insert (format "%s" (current-time-string))))
15997@end ignore
15998
15999@node Counting function definitions, , Files List, Prepare the data
16000@subsection Counting function definitions
16001
16002Our immediate goal is to generate a list that tells us how many
16003function definitions contain fewer than 10 words and symbols, how many
16004contain between 10 and 19 words and symbols, how many contain between
1600520 and 29 words and symbols, and so on.
16006
16007With a sorted list of numbers, this is easy: count how many elements
16008of the list are smaller than 10, then, after moving past the numbers
16009just counted, count how many are smaller than 20, then, after moving
16010past the numbers just counted, count how many are smaller than 30, and
16011so on. Each of the numbers, 10, 20, 30, 40, and the like, is one
16012larger than the top of that range. We can call the list of such
16013numbers the @code{top-of-ranges} list.
16014
16015@need 1200
16016If we wished, we could generate this list automatically, but it is
16017simpler to write a list manually. Here it is:
16018@vindex top-of-ranges
16019
16020@smallexample
16021@group
16022(defvar top-of-ranges
16023 '(10 20 30 40 50
16024 60 70 80 90 100
16025 110 120 130 140 150
16026 160 170 180 190 200
16027 210 220 230 240 250
16028 260 270 280 290 300)
16029 "List specifying ranges for `defuns-per-range'.")
16030@end group
16031@end smallexample
16032
16033To change the ranges, we edit this list.
16034
16035Next, we need to write the function that creates the list of the
16036number of definitions within each range. Clearly, this function must
16037take the @code{sorted-lengths} and the @code{top-of-ranges} lists
16038as arguments.
16039
16040The @code{defuns-per-range} function must do two things again and
16041again: it must count the number of definitions within a range
16042specified by the current top-of-range value; and it must shift to the
16043next higher value in the @code{top-of-ranges} list after counting the
16044number of definitions in the current range. Since each of these
16045actions is repetitive, we can use @code{while} loops for the job.
16046One loop counts the number of definitions in the range defined by the
16047current top-of-range value, and the other loop selects each of the
16048top-of-range values in turn.
16049
16050Several entries of the @code{sorted-lengths} list are counted for each
16051range; this means that the loop for the @code{sorted-lengths} list
16052will be inside the loop for the @code{top-of-ranges} list, like a
16053small gear inside a big gear.
16054
16055The inner loop counts the number of definitions within the range. It
16056is a simple counting loop of the type we have seen before.
16057(@xref{Incrementing Loop, , A loop with an incrementing counter}.)
16058The true-or-false test of the loop tests whether the value from the
16059@code{sorted-lengths} list is smaller than the current value of the
16060top of the range. If it is, the function increments the counter and
16061tests the next value from the @code{sorted-lengths} list.
16062
16063@need 1250
16064The inner loop looks like this:
16065
16066@smallexample
16067@group
16068(while @var{length-element-smaller-than-top-of-range}
16069 (setq number-within-range (1+ number-within-range))
16070 (setq sorted-lengths (cdr sorted-lengths)))
16071@end group
16072@end smallexample
16073
16074The outer loop must start with the lowest value of the
16075@code{top-of-ranges} list, and then be set to each of the succeeding
16076higher values in turn. This can be done with a loop like this:
16077
16078@smallexample
16079@group
16080(while top-of-ranges
16081 @var{body-of-loop}@dots{}
16082 (setq top-of-ranges (cdr top-of-ranges)))
16083@end group
16084@end smallexample
16085
16086@need 1200
16087Put together, the two loops look like this:
16088
16089@smallexample
16090@group
16091(while top-of-ranges
16092
16093 ;; @r{Count the number of elements within the current range.}
16094 (while @var{length-element-smaller-than-top-of-range}
16095 (setq number-within-range (1+ number-within-range))
16096 (setq sorted-lengths (cdr sorted-lengths)))
16097
16098 ;; @r{Move to next range.}
16099 (setq top-of-ranges (cdr top-of-ranges)))
16100@end group
16101@end smallexample
16102
16103In addition, in each circuit of the outer loop, Emacs should record
16104the number of definitions within that range (the value of
16105@code{number-within-range}) in a list. We can use @code{cons} for
16106this purpose. (@xref{cons, , @code{cons}}.)
16107
16108The @code{cons} function works fine, except that the list it
16109constructs will contain the number of definitions for the highest
16110range at its beginning and the number of definitions for the lowest
16111range at its end. This is because @code{cons} attaches new elements
16112of the list to the beginning of the list, and since the two loops are
16113working their way through the lengths' list from the lower end first,
16114the @code{defuns-per-range-list} will end up largest number first.
16115But we will want to print our graph with smallest values first and the
16116larger later. The solution is to reverse the order of the
16117@code{defuns-per-range-list}. We can do this using the
16118@code{nreverse} function, which reverses the order of a list.
16119@findex nreverse
16120
16121@need 800
16122For example,
16123
16124@smallexample
16125(nreverse '(1 2 3 4))
16126@end smallexample
16127
16128@need 800
16129@noindent
16130produces:
16131
16132@smallexample
16133(4 3 2 1)
16134@end smallexample
16135
16136Note that the @code{nreverse} function is ``destructive''---that is,
16137it changes the list to which it is applied; this contrasts with the
16138@code{car} and @code{cdr} functions, which are non-destructive. In
16139this case, we do not want the original @code{defuns-per-range-list},
16140so it does not matter that it is destroyed. (The @code{reverse}
16141function provides a reversed copy of a list, leaving the original list
16142as is.)
16143@findex reverse
16144
16145@need 1250
16146Put all together, the @code{defuns-per-range} looks like this:
16147
16148@smallexample
16149@group
16150(defun defuns-per-range (sorted-lengths top-of-ranges)
16151 "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
16152 (let ((top-of-range (car top-of-ranges))
16153 (number-within-range 0)
16154 defuns-per-range-list)
16155@end group
16156
16157@group
16158 ;; @r{Outer loop.}
16159 (while top-of-ranges
16160@end group
16161
16162@group
16163 ;; @r{Inner loop.}
16164 (while (and
16165 ;; @r{Need number for numeric test.}
16166 (car sorted-lengths)
16167 (< (car sorted-lengths) top-of-range))
16168@end group
16169
16170@group
16171 ;; @r{Count number of definitions within current range.}
16172 (setq number-within-range (1+ number-within-range))
16173 (setq sorted-lengths (cdr sorted-lengths)))
16174
16175 ;; @r{Exit inner loop but remain within outer loop.}
16176@end group
16177
16178@group
16179 (setq defuns-per-range-list
16180 (cons number-within-range defuns-per-range-list))
16181 (setq number-within-range 0) ; @r{Reset count to zero.}
16182@end group
16183
16184@group
16185 ;; @r{Move to next range.}
16186 (setq top-of-ranges (cdr top-of-ranges))
16187 ;; @r{Specify next top of range value.}
16188 (setq top-of-range (car top-of-ranges)))
16189@end group
16190
16191@group
16192 ;; @r{Exit outer loop and count the number of defuns larger than}
16193 ;; @r{ the largest top-of-range value.}
16194 (setq defuns-per-range-list
16195 (cons
16196 (length sorted-lengths)
16197 defuns-per-range-list))
16198@end group
16199
16200@group
16201 ;; @r{Return a list of the number of definitions within each range,}
16202 ;; @r{ smallest to largest.}
16203 (nreverse defuns-per-range-list)))
16204@end group
16205@end smallexample
16206
16207@need 1200
16208@noindent
16209The function is straightforward except for one subtle feature. The
16210true-or-false test of the inner loop looks like this:
16211
16212@smallexample
16213@group
16214(and (car sorted-lengths)
16215 (< (car sorted-lengths) top-of-range))
16216@end group
16217@end smallexample
16218
16219@need 800
16220@noindent
16221instead of like this:
16222
16223@smallexample
16224(< (car sorted-lengths) top-of-range)
16225@end smallexample
16226
16227The purpose of the test is to determine whether the first item in the
16228@code{sorted-lengths} list is less than the value of the top of the
16229range.
16230
16231The simple version of the test works fine unless the
16232@code{sorted-lengths} list has a @code{nil} value. In that case, the
16233@code{(car sorted-lengths)} expression function returns
16234@code{nil}. The @code{<} function cannot compare a number to
16235@code{nil}, which is an empty list, so Emacs signals an error and
16236stops the function from attempting to continue to execute.
16237
16238The @code{sorted-lengths} list always becomes @code{nil} when the
16239counter reaches the end of the list. This means that any attempt to
16240use the @code{defuns-per-range} function with the simple version of
16241the test will fail.
16242
16243We solve the problem by using the @code{(car sorted-lengths)}
16244expression in conjunction with the @code{and} expression. The
16245@code{(car sorted-lengths)} expression returns a non-@code{nil}
16246value so long as the list has at least one number within it, but
16247returns @code{nil} if the list is empty. The @code{and} expression
16248first evaluates the @code{(car sorted-lengths)} expression, and
16249if it is @code{nil}, returns false @emph{without} evaluating the
16250@code{<} expression. But if the @code{(car sorted-lengths)}
16251expression returns a non-@code{nil} value, the @code{and} expression
16252evaluates the @code{<} expression, and returns that value as the value
16253of the @code{and} expression.
16254
16255@c colon in printed section title causes problem in Info cross reference
16256This way, we avoid an error.
16257@iftex
16258@noindent
16259(For information about @code{and}, see
16260@ref{kill-new function, , The @code{kill-new} function}.)
16261@end iftex
16262@ifinfo
16263@noindent
16264(@xref{kill-new function, , The @code{kill-new} function}, for
16265information about @code{and}.)
16266@end ifinfo
16267
16268Here is a short test of the @code{defuns-per-range} function. First,
16269evaluate the expression that binds (a shortened)
16270@code{top-of-ranges} list to the list of values, then evaluate the
16271expression for binding the @code{sorted-lengths} list, and then
16272evaluate the @code{defuns-per-range} function.
16273
16274@smallexample
16275@group
16276;; @r{(Shorter list than we will use later.)}
16277(setq top-of-ranges
16278 '(110 120 130 140 150
16279 160 170 180 190 200))
16280
16281(setq sorted-lengths
16282 '(85 86 110 116 122 129 154 176 179 200 265 300 300))
16283
16284(defuns-per-range sorted-lengths top-of-ranges)
16285@end group
16286@end smallexample
16287
16288@need 800
16289@noindent
16290The list returned looks like this:
16291
16292@smallexample
16293(2 2 2 0 0 1 0 2 0 0 4)
16294@end smallexample
16295
16296@noindent
16297Indeed, there are two elements of the @code{sorted-lengths} list
16298smaller than 110, two elements between 110 and 119, two elements
16299between 120 and 129, and so on. There are four elements with a value
16300of 200 or larger.
16301
16302@c The next step is to turn this numbers' list into a graph.
16303@node Readying a Graph, Emacs Initialization, Words in a defun, Top
16304@chapter Readying a Graph
16305@cindex Readying a graph
16306@cindex Graph prototype
16307@cindex Prototype graph
16308@cindex Body of graph
16309
16310Our goal is to construct a graph showing the numbers of function
16311definitions of various lengths in the Emacs lisp sources.
16312
16313As a practical matter, if you were creating a graph, you would
16314probably use a program such as @code{gnuplot} to do the job.
16315(@code{gnuplot} is nicely integrated into GNU Emacs.) In this case,
16316however, we create one from scratch, and in the process we will
16317re-acquaint ourselves with some of what we learned before and learn
16318more.
16319
16320In this chapter, we will first write a simple graph printing function.
16321This first definition will be a @dfn{prototype}, a rapidly written
16322function that enables us to reconnoiter this unknown graph-making
16323territory. We will discover dragons, or find that they are myth.
16324After scouting the terrain, we will feel more confident and enhance
16325the function to label the axes automatically.
16326
16327@menu
16328* Columns of a graph::
16329* graph-body-print:: How to print the body of a graph.
16330* recursive-graph-body-print::
16331* Printed Axes::
16332* Line Graph Exercise::
16333@end menu
16334
16335@node Columns of a graph, graph-body-print, Readying a Graph, Readying a Graph
16336@ifnottex
16337@unnumberedsec Printing the Columns of a Graph
16338@end ifnottex
16339
16340Since Emacs is designed to be flexible and work with all kinds of
16341terminals, including character-only terminals, the graph will need to
16342be made from one of the `typewriter' symbols. An asterisk will do; as
16343we enhance the graph-printing function, we can make the choice of
16344symbol a user option.
16345
16346We can call this function @code{graph-body-print}; it will take a
16347@code{numbers-list} as its only argument. At this stage, we will not
16348label the graph, but only print its body.
16349
16350The @code{graph-body-print} function inserts a vertical column of
16351asterisks for each element in the @code{numbers-list}. The height of
16352each line is determined by the value of that element of the
16353@code{numbers-list}.
16354
16355Inserting columns is a repetitive act; that means that this function can
16356be written either with a @code{while} loop or recursively.
16357
16358Our first challenge is to discover how to print a column of asterisks.
16359Usually, in Emacs, we print characters onto a screen horizontally,
16360line by line, by typing. We have two routes we can follow: write our
16361own column-insertion function or discover whether one exists in Emacs.
16362
16363To see whether there is one in Emacs, we can use the @kbd{M-x apropos}
16364command. This command is like the @kbd{C-h a} (@code{command-apropos})
16365command, except that the latter finds only those functions that are
16366commands. The @kbd{M-x apropos} command lists all symbols that match
16367a regular expression, including functions that are not interactive.
16368@findex apropos
16369
16370What we want to look for is some command that prints or inserts
16371columns. Very likely, the name of the function will contain either
16372the word `print' or the word `insert' or the word `column'.
16373Therefore, we can simply type @kbd{M-x apropos RET
16374print\|insert\|column RET} and look at the result. On my system, this
16375command once too takes quite some time, and then produced a list of 79
16376functions and variables. Now it does not take much time at all and
16377produces a list of 211 functions and variables. Scanning down the
16378list, the only function that looks as if it might do the job is
16379@code{insert-rectangle}.
16380
16381@need 1200
16382Indeed, this is the function we want; its documentation says:
16383
16384@smallexample
16385@group
16386insert-rectangle:
16387Insert text of RECTANGLE with upper left corner at point.
16388RECTANGLE's first line is inserted at point,
16389its second line is inserted at a point vertically under point, etc.
16390RECTANGLE should be a list of strings.
16391After this command, the mark is at the upper left corner
16392and point is at the lower right corner.
16393@end group
16394@end smallexample
16395
16396We can run a quick test, to make sure it does what we expect of it.
16397
16398Here is the result of placing the cursor after the
16399@code{insert-rectangle} expression and typing @kbd{C-u C-x C-e}
16400(@code{eval-last-sexp}). The function inserts the strings
16401@samp{"first"}, @samp{"second"}, and @samp{"third"} at and below
16402point. Also the function returns @code{nil}.
16403
16404@smallexample
16405@group
16406(insert-rectangle '("first" "second" "third"))first
16407 second
16408 thirdnil
16409@end group
16410@end smallexample
16411
16412@noindent
16413Of course, we won't be inserting the text of the
16414@code{insert-rectangle} expression itself into the buffer in which we
16415are making the graph, but will call the function from our program. We
16416shall, however, have to make sure that point is in the buffer at the
16417place where the @code{insert-rectangle} function will insert its
16418column of strings.
16419
16420If you are reading this in Info, you can see how this works by
16421switching to another buffer, such as the @file{*scratch*} buffer,
16422placing point somewhere in the buffer, typing @kbd{M-:}, typing the
16423@code{insert-rectangle} expression into the minibuffer at the prompt,
16424and then typing @key{RET}. This causes Emacs to evaluate the
16425expression in the minibuffer, but to use as the value of point the
16426position of point in the @file{*scratch*} buffer. (@kbd{M-:} is the
16427keybinding for @code{eval-expression}. Also, @code{nil} does not
16428appear in the @file{*scratch*} buffer since the expression is
16429evaluated in the minibuffer.)
16430
16431We find when we do this that point ends up at the end of the last
16432inserted line---that is to say, this function moves point as a
16433side-effect. If we were to repeat the command, with point at this
16434position, the next insertion would be below and to the right of the
16435previous insertion. We don't want this! If we are going to make a
16436bar graph, the columns need to be beside each other.
16437
16438So we discover that each cycle of the column-inserting @code{while}
16439loop must reposition point to the place we want it, and that place
16440will be at the top, not the bottom, of the column. Moreover, we
16441remember that when we print a graph, we do not expect all the columns
16442to be the same height. This means that the top of each column may be
16443at a different height from the previous one. We cannot simply
16444reposition point to the same line each time, but moved over to the
16445right---or perhaps we can@dots{}
16446
16447We are planning to make the columns of the bar graph out of asterisks.
16448The number of asterisks in the column is the number specified by the
16449current element of the @code{numbers-list}. We need to construct a
16450list of asterisks of the right length for each call to
16451@code{insert-rectangle}. If this list consists solely of the requisite
16452number of asterisks, then we will have position point the right number
16453of lines above the base for the graph to print correctly. This could
16454be difficult.
16455
16456Alternatively, if we can figure out some way to pass
16457@code{insert-rectangle} a list of the same length each time, then we
16458can place point on the same line each time, but move it over one
16459column to the right for each new column. If we do this, however, some
16460of the entries in the list passed to @code{insert-rectangle} must be
16461blanks rather than asterisks. For example, if the maximum height of
16462the graph is 5, but the height of the column is 3, then
16463@code{insert-rectangle} requires an argument that looks like this:
16464
16465@smallexample
16466(" " " " "*" "*" "*")
16467@end smallexample
16468
16469This last proposal is not so difficult, so long as we can determine
16470the column height. There are two ways for us to specify the column
16471height: we can arbitrarily state what it will be, which would work
16472fine for graphs of that height; or we can search through the list of
16473numbers and use the maximum height of the list as the maximum height
16474of the graph. If the latter operation were difficult, then the former
16475procedure would be easiest, but there is a function built into Emacs
16476that determines the maximum of its arguments. We can use that
16477function. The function is called @code{max} and it returns the
16478largest of all its arguments, which must be numbers. Thus, for
16479example,
16480
16481@smallexample
16482(max 3 4 6 5 7 3)
16483@end smallexample
16484
16485@noindent
16486returns 7. (A corresponding function called @code{min} returns the
16487smallest of all its arguments.)
16488@findex max
16489@findex min
16490
16491However, we cannot simply call @code{max} on the @code{numbers-list};
16492the @code{max} function expects numbers as its argument, not a list of
16493numbers. Thus, the following expression,
16494
16495@smallexample
16496(max '(3 4 6 5 7 3))
16497@end smallexample
16498
16499@need 800
16500@noindent
16501produces the following error message;
16502
16503@smallexample
16504Wrong type of argument: number-or-marker-p, (3 4 6 5 7 3)
16505@end smallexample
16506
16507@findex apply
16508We need a function that passes a list of arguments to a function.
16509This function is @code{apply}. This function `applies' its first
16510argument (a function) to its remaining arguments, the last of which
16511may be a list.
16512
16513@need 1250
16514For example,
16515
16516@smallexample
16517(apply 'max 3 4 7 3 '(4 8 5))
16518@end smallexample
16519
16520@noindent
16521returns 8.
16522
16523(Incidentally, I don't know how you would learn of this function
16524without a book such as this. It is possible to discover other
16525functions, like @code{search-forward} or @code{insert-rectangle}, by
16526guessing at a part of their names and then using @code{apropos}. Even
16527though its base in metaphor is clear---`apply' its first argument to
16528the rest---I doubt a novice would come up with that particular word
16529when using @code{apropos} or other aid. Of course, I could be wrong;
16530after all, the function was first named by someone who had to invent
16531it.)
16532
16533The second and subsequent arguments to @code{apply} are optional, so
16534we can use @code{apply} to call a function and pass the elements of a
16535list to it, like this, which also returns 8:
16536
16537@smallexample
16538(apply 'max '(4 8 5))
16539@end smallexample
16540
16541This latter way is how we will use @code{apply}. The
16542@code{recursive-lengths-list-many-files} function returns a numbers'
16543list to which we can apply @code{max} (we could also apply @code{max} to
16544the sorted numbers' list; it does not matter whether the list is
16545sorted or not.)
16546
16547@need 800
16548Hence, the operation for finding the maximum height of the graph is this:
16549
16550@smallexample
16551(setq max-graph-height (apply 'max numbers-list))
16552@end smallexample
16553
16554Now we can return to the question of how to create a list of strings
16555for a column of the graph. Told the maximum height of the graph
16556and the number of asterisks that should appear in the column, the
16557function should return a list of strings for the
16558@code{insert-rectangle} command to insert.
16559
16560Each column is made up of asterisks or blanks. Since the function is
16561passed the value of the height of the column and the number of
16562asterisks in the column, the number of blanks can be found by
16563subtracting the number of asterisks from the height of the column.
16564Given the number of blanks and the number of asterisks, two
16565@code{while} loops can be used to construct the list:
16566
16567@smallexample
16568@group
16569;;; @r{First version.}
16570(defun column-of-graph (max-graph-height actual-height)
16571 "Return list of strings that is one column of a graph."
16572 (let ((insert-list nil)
16573 (number-of-top-blanks
16574 (- max-graph-height actual-height)))
16575@end group
16576
16577@group
16578 ;; @r{Fill in asterisks.}
16579 (while (> actual-height 0)
16580 (setq insert-list (cons "*" insert-list))
16581 (setq actual-height (1- actual-height)))
16582@end group
16583
16584@group
16585 ;; @r{Fill in blanks.}
16586 (while (> number-of-top-blanks 0)
16587 (setq insert-list (cons " " insert-list))
16588 (setq number-of-top-blanks
16589 (1- number-of-top-blanks)))
16590@end group
16591
16592@group
16593 ;; @r{Return whole list.}
16594 insert-list))
16595@end group
16596@end smallexample
16597
16598If you install this function and then evaluate the following
16599expression you will see that it returns the list as desired:
16600
16601@smallexample
16602(column-of-graph 5 3)
16603@end smallexample
16604
16605@need 800
16606@noindent
16607returns
16608
16609@smallexample
16610(" " " " "*" "*" "*")
16611@end smallexample
16612
16613As written, @code{column-of-graph} contains a major flaw: the symbols
16614used for the blank and for the marked entries in the column are
16615`hard-coded' as a space and asterisk. This is fine for a prototype,
16616but you, or another user, may wish to use other symbols. For example,
16617in testing the graph function, you many want to use a period in place
16618of the space, to make sure the point is being repositioned properly
16619each time the @code{insert-rectangle} function is called; or you might
16620want to substitute a @samp{+} sign or other symbol for the asterisk.
16621You might even want to make a graph-column that is more than one
16622display column wide. The program should be more flexible. The way to
16623do that is to replace the blank and the asterisk with two variables
16624that we can call @code{graph-blank} and @code{graph-symbol} and define
16625those variables separately.
16626
16627Also, the documentation is not well written. These considerations
16628lead us to the second version of the function:
16629
16630@smallexample
16631@group
16632(defvar graph-symbol "*"
16633 "String used as symbol in graph, usually an asterisk.")
16634@end group
16635
16636@group
16637(defvar graph-blank " "
16638 "String used as blank in graph, usually a blank space.
16639graph-blank must be the same number of columns wide
16640as graph-symbol.")
16641@end group
16642@end smallexample
16643
16644@noindent
16645(For an explanation of @code{defvar}, see
16646@ref{defvar, , Initializing a Variable with @code{defvar}}.)
16647
16648@smallexample
16649@group
16650;;; @r{Second version.}
16651(defun column-of-graph (max-graph-height actual-height)
16652 "Return MAX-GRAPH-HEIGHT strings; ACTUAL-HEIGHT are graph-symbols.
16653
16654@end group
16655@group
16656The graph-symbols are contiguous entries at the end
16657of the list.
16658The list will be inserted as one column of a graph.
16659The strings are either graph-blank or graph-symbol."
16660@end group
16661
16662@group
16663 (let ((insert-list nil)
16664 (number-of-top-blanks
16665 (- max-graph-height actual-height)))
16666@end group
16667
16668@group
16669 ;; @r{Fill in @code{graph-symbols}.}
16670 (while (> actual-height 0)
16671 (setq insert-list (cons graph-symbol insert-list))
16672 (setq actual-height (1- actual-height)))
16673@end group
16674
16675@group
16676 ;; @r{Fill in @code{graph-blanks}.}
16677 (while (> number-of-top-blanks 0)
16678 (setq insert-list (cons graph-blank insert-list))
16679 (setq number-of-top-blanks
16680 (1- number-of-top-blanks)))
16681
16682 ;; @r{Return whole list.}
16683 insert-list))
16684@end group
16685@end smallexample
16686
16687If we wished, we could rewrite @code{column-of-graph} a third time to
16688provide optionally for a line graph as well as for a bar graph. This
16689would not be hard to do. One way to think of a line graph is that it
16690is no more than a bar graph in which the part of each bar that is
16691below the top is blank. To construct a column for a line graph, the
16692function first constructs a list of blanks that is one shorter than
16693the value, then it uses @code{cons} to attach a graph symbol to the
16694list; then it uses @code{cons} again to attach the `top blanks' to
16695the list.
16696
16697It is easy to see how to write such a function, but since we don't
16698need it, we will not do it. But the job could be done, and if it were
16699done, it would be done with @code{column-of-graph}. Even more
16700important, it is worth noting that few changes would have to be made
16701anywhere else. The enhancement, if we ever wish to make it, is
16702simple.
16703
16704Now, finally, we come to our first actual graph printing function.
16705This prints the body of a graph, not the labels for the vertical and
16706horizontal axes, so we can call this @code{graph-body-print}.
16707
16708@node graph-body-print, recursive-graph-body-print, Columns of a graph, Readying a Graph
16709@section The @code{graph-body-print} Function
16710@findex graph-body-print
16711
16712After our preparation in the preceding section, the
16713@code{graph-body-print} function is straightforward. The function
16714will print column after column of asterisks and blanks, using the
16715elements of a numbers' list to specify the number of asterisks in each
16716column. This is a repetitive act, which means we can use a
16717decrementing @code{while} loop or recursive function for the job. In
16718this section, we will write the definition using a @code{while} loop.
16719
16720The @code{column-of-graph} function requires the height of the graph
16721as an argument, so we should determine and record that as a local variable.
16722
16723This leads us to the following template for the @code{while} loop
16724version of this function:
16725
16726@smallexample
16727@group
16728(defun graph-body-print (numbers-list)
16729 "@var{documentation}@dots{}"
16730 (let ((height @dots{}
16731 @dots{}))
16732@end group
16733
16734@group
16735 (while numbers-list
16736 @var{insert-columns-and-reposition-point}
16737 (setq numbers-list (cdr numbers-list)))))
16738@end group
16739@end smallexample
16740
16741@noindent
16742We need to fill in the slots of the template.
16743
16744Clearly, we can use the @code{(apply 'max numbers-list)} expression to
16745determine the height of the graph.
16746
16747The @code{while} loop will cycle through the @code{numbers-list} one
16748element at a time. As it is shortened by the @code{(setq numbers-list
16749(cdr numbers-list))} expression, the @sc{car} of each instance of the
16750list is the value of the argument for @code{column-of-graph}.
16751
16752At each cycle of the @code{while} loop, the @code{insert-rectangle}
16753function inserts the list returned by @code{column-of-graph}. Since
16754the @code{insert-rectangle} function moves point to the lower right of
16755the inserted rectangle, we need to save the location of point at the
16756time the rectangle is inserted, move back to that position after the
16757rectangle is inserted, and then move horizontally to the next place
16758from which @code{insert-rectangle} is called.
16759
16760If the inserted columns are one character wide, as they will be if
16761single blanks and asterisks are used, the repositioning command is
16762simply @code{(forward-char 1)}; however, the width of a column may be
16763greater than one. This means that the repositioning command should be
16764written @code{(forward-char symbol-width)}. The @code{symbol-width}
16765itself is the length of a @code{graph-blank} and can be found using
16766the expression @code{(length graph-blank)}. The best place to bind
16767the @code{symbol-width} variable to the value of the width of graph
16768column is in the varlist of the @code{let} expression.
16769
16770@need 1250
16771These considerations lead to the following function definition:
16772
16773@smallexample
16774@group
16775(defun graph-body-print (numbers-list)
16776 "Print a bar graph of the NUMBERS-LIST.
16777The numbers-list consists of the Y-axis values."
16778
16779 (let ((height (apply 'max numbers-list))
16780 (symbol-width (length graph-blank))
16781 from-position)
16782@end group
16783
16784@group
16785 (while numbers-list
16786 (setq from-position (point))
16787 (insert-rectangle
16788 (column-of-graph height (car numbers-list)))
16789 (goto-char from-position)
16790 (forward-char symbol-width)
16791@end group
16792@group
16793 ;; @r{Draw graph column by column.}
16794 (sit-for 0)
16795 (setq numbers-list (cdr numbers-list)))
16796@end group
16797@group
16798 ;; @r{Place point for X axis labels.}
16799 (forward-line height)
16800 (insert "\n")
16801))
16802@end group
16803@end smallexample
16804
16805@noindent
16806The one unexpected expression in this function is the
16807@w{@code{(sit-for 0)}} expression in the @code{while} loop. This
16808expression makes the graph printing operation more interesting to
16809watch than it would be otherwise. The expression causes Emacs to
16810`sit' or do nothing for a zero length of time and then redraw the
16811screen. Placed here, it causes Emacs to redraw the screen column by
16812column. Without it, Emacs would not redraw the screen until the
16813function exits.
16814
16815We can test @code{graph-body-print} with a short list of numbers.
16816
16817@enumerate
16818@item
16819Install @code{graph-symbol}, @code{graph-blank},
16820@code{column-of-graph}, which are in
16821@iftex
16822@ref{Readying a Graph, , Readying a Graph},
16823@end iftex
16824@ifinfo
16825@ref{Columns of a graph},
16826@end ifinfo
16827and @code{graph-body-print}.
16828
16829@need 800
16830@item
16831Copy the following expression:
16832
16833@smallexample
16834(graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))
16835@end smallexample
16836
16837@item
16838Switch to the @file{*scratch*} buffer and place the cursor where you
16839want the graph to start.
16840
16841@item
16842Type @kbd{M-:} (@code{eval-expression}).
16843
16844@item
16845Yank the @code{graph-body-print} expression into the minibuffer
16846with @kbd{C-y} (@code{yank)}.
16847
16848@item
16849Press @key{RET} to evaluate the @code{graph-body-print} expression.
16850@end enumerate
16851
16852@need 800
16853Emacs will print a graph like this:
16854
16855@smallexample
16856@group
16857 *
16858 * **
16859 * ****
16860 *** ****
16861 ********* *
16862 ************
16863 *************
16864@end group
16865@end smallexample
16866
16867@node recursive-graph-body-print, Printed Axes, graph-body-print, Readying a Graph
16868@section The @code{recursive-graph-body-print} Function
16869@findex recursive-graph-body-print
16870
16871The @code{graph-body-print} function may also be written recursively.
16872The recursive solution is divided into two parts: an outside `wrapper'
16873that uses a @code{let} expression to determine the values of several
16874variables that need only be found once, such as the maximum height of
16875the graph, and an inside function that is called recursively to print
16876the graph.
16877
16878@need 1250
16879The `wrapper' is uncomplicated:
16880
16881@smallexample
16882@group
16883(defun recursive-graph-body-print (numbers-list)
16884 "Print a bar graph of the NUMBERS-LIST.
16885The numbers-list consists of the Y-axis values."
16886 (let ((height (apply 'max numbers-list))
16887 (symbol-width (length graph-blank))
16888 from-position)
16889 (recursive-graph-body-print-internal
16890 numbers-list
16891 height
16892 symbol-width)))
16893@end group
16894@end smallexample
16895
16896The recursive function is a little more difficult. It has four parts:
16897the `do-again-test', the printing code, the recursive call, and the
16898`next-step-expression'. The `do-again-test' is a @code{when}
16899expression that determines whether the @code{numbers-list} contains
16900any remaining elements; if it does, the function prints one column of
16901the graph using the printing code and calls itself again. The
16902function calls itself again according to the value produced by the
16903`next-step-expression' which causes the call to act on a shorter
16904version of the @code{numbers-list}.
16905
16906@smallexample
16907@group
16908(defun recursive-graph-body-print-internal
16909 (numbers-list height symbol-width)
16910 "Print a bar graph.
16911Used within recursive-graph-body-print function."
16912@end group
16913
16914@group
16915 (when numbers-list
16916 (setq from-position (point))
16917 (insert-rectangle
16918 (column-of-graph height (car numbers-list)))
16919@end group
16920@group
16921 (goto-char from-position)
16922 (forward-char symbol-width)
16923 (sit-for 0) ; @r{Draw graph column by column.}
16924 (recursive-graph-body-print-internal
16925 (cdr numbers-list) height symbol-width)))
16926@end group
16927@end smallexample
16928
16929@need 1250
16930After installation, this expression can be tested; here is a sample:
16931
16932@smallexample
16933(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
16934@end smallexample
16935
16936@need 800
16937Here is what @code{recursive-graph-body-print} produces:
16938
16939@smallexample
16940@group
16941 *
16942 ** *
16943 **** *
16944 **** ***
16945 * *********
16946 ************
16947 *************
16948@end group
16949@end smallexample
16950
16951Either of these two functions, @code{graph-body-print} or
16952@code{recursive-graph-body-print}, create the body of a graph.
16953
16954@node Printed Axes, Line Graph Exercise, recursive-graph-body-print, Readying a Graph
16955@section Need for Printed Axes
16956
16957A graph needs printed axes, so you can orient yourself. For a do-once
16958project, it may be reasonable to draw the axes by hand using Emacs'
16959Picture mode; but a graph drawing function may be used more than once.
16960
16961For this reason, I have written enhancements to the basic
16962@code{print-graph-body} function that automatically print labels for
16963the horizontal and vertical axes. Since the label printing functions
16964do not contain much new material, I have placed their description in
09e80d9f 16965an appendix. @xref{Full Graph, , A Graph with Labeled Axes}.
8cda6f8f
GM
16966
16967@node Line Graph Exercise, , Printed Axes, Readying a Graph
16968@section Exercise
16969
16970Write a line graph version of the graph printing functions.
16971
16972@node Emacs Initialization, Debugging, Readying a Graph, Top
16973@chapter Your @file{.emacs} File
16974@cindex @file{.emacs} file
16975@cindex Customizing your @file{.emacs} file
16976@cindex Initialization file
16977
16978``You don't have to like Emacs to like it'' -- this seemingly
16979paradoxical statement is the secret of GNU Emacs. The plain, `out of
16980the box' Emacs is a generic tool. Most people who use it, customize
16981it to suit themselves.
16982
16983GNU Emacs is mostly written in Emacs Lisp; this means that by writing
16984expressions in Emacs Lisp you can change or extend Emacs.
16985
16986@menu
16987* Default Configuration::
16988* Site-wide Init:: You can write site-wide init files.
16989* defcustom:: Emacs will write code for you.
16990* Beginning a .emacs File:: How to write a @code{.emacs file}.
16991* Text and Auto-fill:: Automatically wrap lines.
16992* Mail Aliases:: Use abbreviations for email addresses.
16993* Indent Tabs Mode:: Don't use tabs with @TeX{}
16994* Keybindings:: Create some personal keybindings.
16995* Keymaps:: More about key binding.
16996* Loading Files:: Load (i.e., evaluate) files automatically.
16997* Autoload:: Make functions available.
16998* Simple Extension:: Define a function; bind it to a key.
16999* X11 Colors:: Colors in X.
17000* Miscellaneous::
17001* Mode Line:: How to customize your mode line.
17002@end menu
17003
17004@node Default Configuration, Site-wide Init, Emacs Initialization, Emacs Initialization
17005@ifnottex
17006@unnumberedsec Emacs' Default Configuration
17007@end ifnottex
17008
17009There are those who appreciate Emacs' default configuration. After
17010all, Emacs starts you in C mode when you edit a C file, starts you in
17011Fortran mode when you edit a Fortran file, and starts you in
17012Fundamental mode when you edit an unadorned file. This all makes
17013sense, if you do not know who is going to use Emacs. Who knows what a
17014person hopes to do with an unadorned file? Fundamental mode is the
17015right default for such a file, just as C mode is the right default for
17016editing C code. (Enough programming languages have syntaxes
17017that enable them to share or nearly share features, so C mode is
6bd6c2fa 17018now provided by CC mode, the `C Collection'.)
8cda6f8f
GM
17019
17020But when you do know who is going to use Emacs---you,
17021yourself---then it makes sense to customize Emacs.
17022
17023For example, I seldom want Fundamental mode when I edit an
17024otherwise undistinguished file; I want Text mode. This is why I
17025customize Emacs: so it suits me.
17026
17027You can customize and extend Emacs by writing or adapting a
17028@file{~/.emacs} file. This is your personal initialization file; its
17029contents, written in Emacs Lisp, tell Emacs what to do.@footnote{You
17030may also add @file{.el} to @file{~/.emacs} and call it a
17031@file{~/.emacs.el} file. In the past, you were forbidden to type the
17032extra keystrokes that the name @file{~/.emacs.el} requires, but now
17033you may. The new format is consistent with the Emacs Lisp file
17034naming conventions; the old format saves typing.}
17035
17036A @file{~/.emacs} file contains Emacs Lisp code. You can write this
17037code yourself; or you can use Emacs' @code{customize} feature to write
17038the code for you. You can combine your own expressions and
17039auto-written Customize expressions in your @file{.emacs} file.
17040
17041(I myself prefer to write my own expressions, except for those,
17042particularly fonts, that I find easier to manipulate using the
17043@code{customize} command. I combine the two methods.)
17044
17045Most of this chapter is about writing expressions yourself. It
17046describes a simple @file{.emacs} file; for more information, see
17047@ref{Init File, , The Init File, emacs, The GNU Emacs Manual}, and
17048@ref{Init File, , The Init File, elisp, The GNU Emacs Lisp Reference
17049Manual}.
17050
17051@node Site-wide Init, defcustom, Default Configuration, Emacs Initialization
17052@section Site-wide Initialization Files
17053
17054@cindex @file{default.el} init file
17055@cindex @file{site-init.el} init file
17056@cindex @file{site-load.el} init file
17057In addition to your personal initialization file, Emacs automatically
17058loads various site-wide initialization files, if they exist. These
17059have the same form as your @file{.emacs} file, but are loaded by
17060everyone.
17061
17062Two site-wide initialization files, @file{site-load.el} and
17063@file{site-init.el}, are loaded into Emacs and then `dumped' if a
17064`dumped' version of Emacs is created, as is most common. (Dumped
17065copies of Emacs load more quickly. However, once a file is loaded and
17066dumped, a change to it does not lead to a change in Emacs unless you
17067load it yourself or re-dump Emacs. @xref{Building Emacs, , Building
17068Emacs, elisp, The GNU Emacs Lisp Reference Manual}, and the
17069@file{INSTALL} file.)
17070
17071Three other site-wide initialization files are loaded automatically
17072each time you start Emacs, if they exist. These are
17073@file{site-start.el}, which is loaded @emph{before} your @file{.emacs}
17074file, and @file{default.el}, and the terminal type file, which are both
17075loaded @emph{after} your @file{.emacs} file.
17076
17077Settings and definitions in your @file{.emacs} file will overwrite
17078conflicting settings and definitions in a @file{site-start.el} file,
17079if it exists; but the settings and definitions in a @file{default.el}
17080or terminal type file will overwrite those in your @file{.emacs} file.
17081(You can prevent interference from a terminal type file by setting
17082@code{term-file-prefix} to @code{nil}. @xref{Simple Extension, , A
17083Simple Extension}.)
17084
17085@c Rewritten to avoid overfull hbox.
17086The @file{INSTALL} file that comes in the distribution contains
17087descriptions of the @file{site-init.el} and @file{site-load.el} files.
17088
17089The @file{loadup.el}, @file{startup.el}, and @file{loaddefs.el} files
17090control loading. These files are in the @file{lisp} directory of the
17091Emacs distribution and are worth perusing.
17092
17093The @file{loaddefs.el} file contains a good many suggestions as to
17094what to put into your own @file{.emacs} file, or into a site-wide
17095initialization file.
17096
17097@node defcustom, Beginning a .emacs File, Site-wide Init, Emacs Initialization
17098@section Specifying Variables using @code{defcustom}
17099@findex defcustom
17100
17101You can specify variables using @code{defcustom} so that you and
17102others can then use Emacs' @code{customize} feature to set their
17103values. (You cannot use @code{customize} to write function
17104definitions; but you can write @code{defuns} in your @file{.emacs}
17105file. Indeed, you can write any Lisp expression in your @file{.emacs}
17106file.)
17107
17108The @code{customize} feature depends on the @code{defcustom} special
17109form. Although you can use @code{defvar} or @code{setq} for variables
17110that users set, the @code{defcustom} special form is designed for the
17111job.
17112
17113You can use your knowledge of @code{defvar} for writing the
17114first three arguments for @code{defcustom}. The first argument to
17115@code{defcustom} is the name of the variable. The second argument is
17116the variable's initial value, if any; and this value is set only if
17117the value has not already been set. The third argument is the
17118documentation.
17119
17120The fourth and subsequent arguments to @code{defcustom} specify types
17121and options; these are not featured in @code{defvar}. (These
17122arguments are optional.)
17123
17124Each of these arguments consists of a keyword followed by a value.
17125Each keyword starts with the colon character @samp{:}.
17126
17127@need 1250
17128For example, the customizable user option variable
17129@code{text-mode-hook} looks like this:
17130
17131@smallexample
17132@group
17133(defcustom text-mode-hook nil
17134 "Normal hook run when entering Text mode and many related modes."
17135 :type 'hook
17136 :options '(turn-on-auto-fill flyspell-mode)
17137 :group 'data)
17138@end group
17139@end smallexample
17140
17141@noindent
17142The name of the variable is @code{text-mode-hook}; it has no default
17143value; and its documentation string tells you what it does.
17144
17145The @code{:type} keyword tells Emacs the kind of data to which
17146@code{text-mode-hook} should be set and how to display the value in a
17147Customization buffer.
17148
17149The @code{:options} keyword specifies a suggested list of values for
17150the variable. Usually, @code{:options} applies to a hook.
17151The list is only a suggestion; it is not exclusive; a person who sets
17152the variable may set it to other values; the list shown following the
17153@code{:options} keyword is intended to offer convenient choices to a
17154user.
17155
17156Finally, the @code{:group} keyword tells the Emacs Customization
17157command in which group the variable is located. This tells where to
17158find it.
17159
17160The @code{defcustom} function recognizes more than a dozen keywords.
17161For more information, see @ref{Customization, , Writing Customization
17162Definitions, elisp, The GNU Emacs Lisp Reference Manual}.
17163
17164Consider @code{text-mode-hook} as an example.
17165
17166There are two ways to customize this variable. You can use the
17167customization command or write the appropriate expressions yourself.
17168
17169@need 800
17170Using the customization command, you can type:
17171
17172@smallexample
17173M-x customize
17174@end smallexample
17175
17176@noindent
17177and find that the group for editing files of data is called `data'.
17178Enter that group. Text Mode Hook is the first member. You can click
17179on its various options, such as @code{turn-on-auto-fill}, to set the
17180values. After you click on the button to
17181
17182@smallexample
17183Save for Future Sessions
17184@end smallexample
17185
17186@noindent
17187Emacs will write an expression into your @file{.emacs} file.
17188It will look like this:
17189
17190@smallexample
17191@group
17192(custom-set-variables
17193 ;; custom-set-variables was added by Custom.
17194 ;; If you edit it by hand, you could mess it up, so be careful.
17195 ;; Your init file should contain only one such instance.
17196 ;; If there is more than one, they won't work right.
17197 '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify))))
17198@end group
17199@end smallexample
17200
17201@noindent
17202(The @code{text-mode-hook-identify} function tells
17203@code{toggle-text-mode-auto-fill} which buffers are in Text mode.
17204It comes on automatically.)
17205
17206The @code{custom-set-variables} function works somewhat differently
17207than a @code{setq}. While I have never learned the differences, I
17208modify the @code{custom-set-variables} expressions in my @file{.emacs}
17209file by hand: I make the changes in what appears to me to be a
17210reasonable manner and have not had any problems. Others prefer to use
17211the Customization command and let Emacs do the work for them.
17212
17213Another @code{custom-set-@dots{}} function is @code{custom-set-faces}.
17214This function sets the various font faces. Over time, I have set a
17215considerable number of faces. Some of the time, I re-set them using
17216@code{customize}; other times, I simply edit the
17217@code{custom-set-faces} expression in my @file{.emacs} file itself.
17218
17219The second way to customize your @code{text-mode-hook} is to set it
17220yourself in your @file{.emacs} file using code that has nothing to do
17221with the @code{custom-set-@dots{}} functions.
17222
17223@need 800
17224When you do this, and later use @code{customize}, you will see a
17225message that says
17226
17227@smallexample
17228CHANGED outside Customize; operating on it here may be unreliable.
17229@end smallexample
17230
17231@need 800
17232This message is only a warning. If you click on the button to
17233
17234@smallexample
17235Save for Future Sessions
17236@end smallexample
17237
17238@noindent
17239Emacs will write a @code{custom-set-@dots{}} expression near the end
17240of your @file{.emacs} file that will be evaluated after your
17241hand-written expression. It will, therefore, overrule your
17242hand-written expression. No harm will be done. When you do this,
17243however, be careful to remember which expression is active; if you
17244forget, you may confuse yourself.
17245
17246So long as you remember where the values are set, you will have no
17247trouble. In any event, the values are always set in your
17248initialization file, which is usually called @file{.emacs}.
17249
17250I myself use @code{customize} for hardly anything. Mostly, I write
17251expressions myself.
17252
17253@findex defsubst
17254@findex defconst
17255Incidentally, to be more complete concerning defines: @code{defsubst}
17256defines an inline function. The syntax is just like that of
17257@code{defun}. @code{defconst} defines a symbol as a constant. The
17258intent is that neither programs nor users should ever change a value
17259set by @code{defconst}. (You can change it; the value set is a
17260variable; but please do not.)
17261
17262@node Beginning a .emacs File, Text and Auto-fill, defcustom, Emacs Initialization
17263@section Beginning a @file{.emacs} File
17264@cindex @file{.emacs} file, beginning of
17265
17266When you start Emacs, it loads your @file{.emacs} file unless you tell
17267it not to by specifying @samp{-q} on the command line. (The
17268@code{emacs -q} command gives you a plain, out-of-the-box Emacs.)
17269
17270A @file{.emacs} file contains Lisp expressions. Often, these are no
17271more than expressions to set values; sometimes they are function
17272definitions.
17273
17274@xref{Init File, , The Init File @file{~/.emacs}, emacs, The GNU Emacs
17275Manual}, for a short description of initialization files.
17276
17277This chapter goes over some of the same ground, but is a walk among
17278extracts from a complete, long-used @file{.emacs} file---my own.
17279
17280The first part of the file consists of comments: reminders to myself.
17281By now, of course, I remember these things, but when I started, I did
17282not.
17283
17284@need 1200
17285@smallexample
17286@group
17287;;;; Bob's .emacs file
17288; Robert J. Chassell
17289; 26 September 1985
17290@end group
17291@end smallexample
17292
17293@noindent
17294Look at that date! I started this file a long time ago. I have been
17295adding to it ever since.
17296
17297@smallexample
17298@group
17299; Each section in this file is introduced by a
17300; line beginning with four semicolons; and each
17301; entry is introduced by a line beginning with
17302; three semicolons.
17303@end group
17304@end smallexample
17305
17306@noindent
17307This describes the usual conventions for comments in Emacs Lisp.
17308Everything on a line that follows a semicolon is a comment. Two,
17309three, and four semicolons are used as subsection and section markers.
17310(@xref{Comments, ,, elisp, The GNU Emacs Lisp Reference Manual}, for
17311more about comments.)
17312
17313@smallexample
17314@group
17315;;;; The Help Key
17316; Control-h is the help key;
17317; after typing control-h, type a letter to
17318; indicate the subject about which you want help.
17319; For an explanation of the help facility,
17320; type control-h two times in a row.
17321@end group
17322@end smallexample
17323
17324@noindent
17325Just remember: type @kbd{C-h} two times for help.
17326
17327@smallexample
17328@group
17329; To find out about any mode, type control-h m
17330; while in that mode. For example, to find out
17331; about mail mode, enter mail mode and then type
17332; control-h m.
17333@end group
17334@end smallexample
17335
17336@noindent
17337`Mode help', as I call this, is very helpful. Usually, it tells you
17338all you need to know.
17339
17340Of course, you don't need to include comments like these in your
17341@file{.emacs} file. I included them in mine because I kept forgetting
17342about Mode help or the conventions for comments---but I was able to
17343remember to look here to remind myself.
17344
17345@node Text and Auto-fill, Mail Aliases, Beginning a .emacs File, Emacs Initialization
17346@section Text and Auto Fill Mode
17347
17348Now we come to the part that `turns on' Text mode and
17349Auto Fill mode.
17350
17351@smallexample
17352@group
17353;;; Text mode and Auto Fill mode
cd61af01
SM
17354;; The next two lines put Emacs into Text mode
17355;; and Auto Fill mode, and are for writers who
17356;; want to start writing prose rather than code.
17357(setq-default major-mode 'text-mode)
8cda6f8f
GM
17358(add-hook 'text-mode-hook 'turn-on-auto-fill)
17359@end group
17360@end smallexample
17361
17362Here is the first part of this @file{.emacs} file that does something
17363besides remind a forgetful human!
17364
17365The first of the two lines in parentheses tells Emacs to turn on Text
17366mode when you find a file, @emph{unless} that file should go into some
17367other mode, such as C mode.
17368
17369@cindex Per-buffer, local variables list
17370@cindex Local variables list, per-buffer,
17371@cindex Automatic mode selection
17372@cindex Mode selection, automatic
17373When Emacs reads a file, it looks at the extension to the file name,
17374if any. (The extension is the part that comes after a @samp{.}.) If
17375the file ends with a @samp{.c} or @samp{.h} extension then Emacs turns
17376on C mode. Also, Emacs looks at first nonblank line of the file; if
17377the line says @w{@samp{-*- C -*-}}, Emacs turns on C mode. Emacs
17378possesses a list of extensions and specifications that it uses
17379automatically. In addition, Emacs looks near the last page for a
17380per-buffer, ``local variables list'', if any.
17381
17382@ifinfo
17383@xref{Choosing Modes, , How Major Modes are Chosen, emacs, The GNU
17384Emacs Manual}.
17385
17386@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
17387Manual}.
17388@end ifinfo
17389@iftex
17390See sections ``How Major Modes are Chosen'' and ``Local Variables in
17391Files'' in @cite{The GNU Emacs Manual}.
17392@end iftex
17393
17394Now, back to the @file{.emacs} file.
17395
17396@need 800
17397Here is the line again; how does it work?
17398
17399@cindex Text Mode turned on
17400@smallexample
4e3b4528 17401(setq major-mode 'text-mode)
8cda6f8f
GM
17402@end smallexample
17403
17404@noindent
17405This line is a short, but complete Emacs Lisp expression.
17406
17407We are already familiar with @code{setq}. It sets the following variable,
4e3b4528
SM
17408@code{major-mode}, to the subsequent value, which is @code{text-mode}.
17409The single quote mark before @code{text-mode} tells Emacs to deal directly
17410with the @code{text-mode} symbol, not with whatever it might stand for.
17411@xref{set & setq, , Setting the Value of a Variable},
17412for a reminder of how @code{setq} works.
17413The main point is that there is no difference between the procedure you
17414use to set a value in your @file{.emacs} file and the procedure you use
17415anywhere else in Emacs.
8cda6f8f
GM
17416
17417@need 800
17418Here is the next line:
17419
17420@cindex Auto Fill mode turned on
17421@findex add-hook
17422@smallexample
17423(add-hook 'text-mode-hook 'turn-on-auto-fill)
17424@end smallexample
17425
17426@noindent
17427In this line, the @code{add-hook} command adds
17428@code{turn-on-auto-fill} to the variable.
17429
17430@code{turn-on-auto-fill} is the name of a program, that, you guessed
17431it!, turns on Auto Fill mode.
17432
17433Every time Emacs turns on Text mode, Emacs runs the commands `hooked'
17434onto Text mode. So every time Emacs turns on Text mode, Emacs also
17435turns on Auto Fill mode.
17436
17437In brief, the first line causes Emacs to enter Text mode when you edit a
17438file, unless the file name extension, a first non-blank line, or local
17439variables to tell Emacs otherwise.
17440
17441Text mode among other actions, sets the syntax table to work
17442conveniently for writers. In Text mode, Emacs considers an apostrophe
17443as part of a word like a letter; but Emacs does not consider a period
17444or a space as part of a word. Thus, @kbd{M-f} moves you over
17445@samp{it's}. On the other hand, in C mode, @kbd{M-f} stops just after
17446the @samp{t} of @samp{it's}.
17447
17448The second line causes Emacs to turn on Auto Fill mode when it turns
17449on Text mode. In Auto Fill mode, Emacs automatically breaks a line
17450that is too wide and brings the excessively wide part of the line down
17451to the next line. Emacs breaks lines between words, not within them.
17452
17453When Auto Fill mode is turned off, lines continue to the right as you
17454type them. Depending on how you set the value of
17455@code{truncate-lines}, the words you type either disappear off the
17456right side of the screen, or else are shown, in a rather ugly and
17457unreadable manner, as a continuation line on the screen.
17458
17459@need 1250
17460In addition, in this part of my @file{.emacs} file, I tell the Emacs
17461fill commands to insert two spaces after a colon:
17462
17463@smallexample
17464(setq colon-double-space t)
17465@end smallexample
17466
17467@node Mail Aliases, Indent Tabs Mode, Text and Auto-fill, Emacs Initialization
17468@section Mail Aliases
17469
17470Here is a @code{setq} that `turns on' mail aliases, along with more
17471reminders.
17472
17473@smallexample
17474@group
17475;;; Mail mode
17476; To enter mail mode, type `C-x m'
17477; To enter RMAIL (for reading mail),
17478; type `M-x rmail'
17479(setq mail-aliases t)
17480@end group
17481@end smallexample
17482
17483@cindex Mail aliases
17484@noindent
17485This @code{setq} command sets the value of the variable
17486@code{mail-aliases} to @code{t}. Since @code{t} means true, the line
17487says, in effect, ``Yes, use mail aliases.''
17488
17489Mail aliases are convenient short names for long email addresses or
17490for lists of email addresses. The file where you keep your `aliases'
17491is @file{~/.mailrc}. You write an alias like this:
17492
17493@smallexample
17494alias geo george@@foobar.wiz.edu
17495@end smallexample
17496
17497@noindent
17498When you write a message to George, address it to @samp{geo}; the
17499mailer will automatically expand @samp{geo} to the full address.
17500
17501@node Indent Tabs Mode, Keybindings, Mail Aliases, Emacs Initialization
17502@section Indent Tabs Mode
17503@cindex Tabs, preventing
17504@findex indent-tabs-mode
17505
17506By default, Emacs inserts tabs in place of multiple spaces when it
17507formats a region. (For example, you might indent many lines of text
17508all at once with the @code{indent-region} command.) Tabs look fine on
17509a terminal or with ordinary printing, but they produce badly indented
17510output when you use @TeX{} or Texinfo since @TeX{} ignores tabs.
17511
17512@need 1250
17513The following turns off Indent Tabs mode:
17514
17515@smallexample
17516@group
17517;;; Prevent Extraneous Tabs
17518(setq-default indent-tabs-mode nil)
17519@end group
17520@end smallexample
17521
17522Note that this line uses @code{setq-default} rather than the
17523@code{setq} command that we have seen before. The @code{setq-default}
17524command sets values only in buffers that do not have their own local
17525values for the variable.
17526
17527@ifinfo
17528@xref{Just Spaces, , Tabs vs. Spaces, emacs, The GNU Emacs Manual}.
17529
17530@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
17531Manual}.
17532@end ifinfo
17533@iftex
17534See sections ``Tabs vs.@: Spaces'' and ``Local Variables in
17535Files'' in @cite{The GNU Emacs Manual}.
17536@end iftex
17537
17538@need 1700
17539@node Keybindings, Keymaps, Indent Tabs Mode, Emacs Initialization
17540@section Some Keybindings
17541
17542Now for some personal keybindings:
17543
17544@smallexample
17545@group
17546;;; Compare windows
17547(global-set-key "\C-cw" 'compare-windows)
17548@end group
17549@end smallexample
17550
17551@findex compare-windows
17552@code{compare-windows} is a nifty command that compares the text in
17553your current window with text in the next window. It makes the
17554comparison by starting at point in each window, moving over text in
17555each window as far as they match. I use this command all the time.
17556
17557This also shows how to set a key globally, for all modes.
17558
17559@cindex Setting a key globally
17560@cindex Global set key
17561@cindex Key setting globally
17562@findex global-set-key
17563The command is @code{global-set-key}. It is followed by the
17564keybinding. In a @file{.emacs} file, the keybinding is written as
17565shown: @code{\C-c} stands for `control-c', which means `press the
17566control key and the @key{c} key at the same time'. The @code{w} means
17567`press the @key{w} key'. The keybinding is surrounded by double
17568quotation marks. In documentation, you would write this as
17569@w{@kbd{C-c w}}. (If you were binding a @key{META} key, such as
17570@kbd{M-c}, rather than a @key{CTRL} key, you would write
17571@w{@code{\M-c}} in your @file{.emacs} file. @xref{Init Rebinding, ,
17572Rebinding Keys in Your Init File, emacs, The GNU Emacs Manual}, for
17573details.)
17574
17575The command invoked by the keys is @code{compare-windows}. Note that
17576@code{compare-windows} is preceded by a single quote; otherwise, Emacs
17577would first try to evaluate the symbol to determine its value.
17578
17579These three things, the double quotation marks, the backslash before
17580the @samp{C}, and the single quote mark are necessary parts of
17581keybinding that I tend to forget. Fortunately, I have come to
17582remember that I should look at my existing @file{.emacs} file, and
17583adapt what is there.
17584
17585As for the keybinding itself: @kbd{C-c w}. This combines the prefix
17586key, @kbd{C-c}, with a single character, in this case, @kbd{w}. This
17587set of keys, @kbd{C-c} followed by a single character, is strictly
17588reserved for individuals' own use. (I call these `own' keys, since
17589these are for my own use.) You should always be able to create such a
17590keybinding for your own use without stomping on someone else's
17591keybinding. If you ever write an extension to Emacs, please avoid
17592taking any of these keys for public use. Create a key like @kbd{C-c
17593C-w} instead. Otherwise, we will run out of `own' keys.
17594
17595@need 1250
17596Here is another keybinding, with a comment:
17597
17598@smallexample
17599@group
17600;;; Keybinding for `occur'
17601; I use occur a lot, so let's bind it to a key:
17602(global-set-key "\C-co" 'occur)
17603@end group
17604@end smallexample
17605
17606@findex occur
17607The @code{occur} command shows all the lines in the current buffer
17608that contain a match for a regular expression. Matching lines are
17609shown in a buffer called @file{*Occur*}. That buffer serves as a menu
17610to jump to occurrences.
17611
17612@findex global-unset-key
17613@cindex Unbinding key
17614@cindex Key unbinding
17615@need 1250
17616Here is how to unbind a key, so it does not
17617work:
17618
17619@smallexample
17620@group
17621;;; Unbind `C-x f'
17622(global-unset-key "\C-xf")
17623@end group
17624@end smallexample
17625
17626There is a reason for this unbinding: I found I inadvertently typed
17627@w{@kbd{C-x f}} when I meant to type @kbd{C-x C-f}. Rather than find a
17628file, as I intended, I accidentally set the width for filled text,
17629almost always to a width I did not want. Since I hardly ever reset my
17630default width, I simply unbound the key.
17631
17632@findex list-buffers, @r{rebound}
17633@findex buffer-menu, @r{bound to key}
17634@need 1250
17635The following rebinds an existing key:
17636
17637@smallexample
17638@group
17639;;; Rebind `C-x C-b' for `buffer-menu'
17640(global-set-key "\C-x\C-b" 'buffer-menu)
17641@end group
17642@end smallexample
17643
17644By default, @kbd{C-x C-b} runs the
17645@code{list-buffers} command. This command lists
17646your buffers in @emph{another} window. Since I
17647almost always want to do something in that
17648window, I prefer the @code{buffer-menu}
17649command, which not only lists the buffers,
17650but moves point into that window.
17651
17652@node Keymaps, Loading Files, Keybindings, Emacs Initialization
17653@section Keymaps
17654@cindex Keymaps
17655@cindex Rebinding keys
17656
17657Emacs uses @dfn{keymaps} to record which keys call which commands.
17658When you use @code{global-set-key} to set the keybinding for a single
17659command in all parts of Emacs, you are specifying the keybinding in
17660@code{current-global-map}.
17661
17662Specific modes, such as C mode or Text mode, have their own keymaps;
17663the mode-specific keymaps override the global map that is shared by
17664all buffers.
17665
17666The @code{global-set-key} function binds, or rebinds, the global
17667keymap. For example, the following binds the key @kbd{C-x C-b} to the
17668function @code{buffer-menu}:
17669
17670@smallexample
17671(global-set-key "\C-x\C-b" 'buffer-menu)
17672@end smallexample
17673
17674Mode-specific keymaps are bound using the @code{define-key} function,
17675which takes a specific keymap as an argument, as well as the key and
17676the command. For example, my @file{.emacs} file contains the
17677following expression to bind the @code{texinfo-insert-@@group} command
17678to @kbd{C-c C-c g}:
17679
17680@smallexample
17681@group
17682(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@@group)
17683@end group
17684@end smallexample
17685
17686@noindent
17687The @code{texinfo-insert-@@group} function itself is a little extension
17688to Texinfo mode that inserts @samp{@@group} into a Texinfo file. I
17689use this command all the time and prefer to type the three strokes
17690@kbd{C-c C-c g} rather than the six strokes @kbd{@@ g r o u p}.
17691(@samp{@@group} and its matching @samp{@@end group} are commands that
17692keep all enclosed text together on one page; many multi-line examples
17693in this book are surrounded by @samp{@@group @dots{} @@end group}.)
17694
17695@need 1250
17696Here is the @code{texinfo-insert-@@group} function definition:
17697
17698@smallexample
17699@group
17700(defun texinfo-insert-@@group ()
17701 "Insert the string @@group in a Texinfo buffer."
17702 (interactive)
17703 (beginning-of-line)
17704 (insert "@@group\n"))
17705@end group
17706@end smallexample
17707
17708(Of course, I could have used Abbrev mode to save typing, rather than
17709write a function to insert a word; but I prefer key strokes consistent
17710with other Texinfo mode key bindings.)
17711
17712You will see numerous @code{define-key} expressions in
17713@file{loaddefs.el} as well as in the various mode libraries, such as
17714@file{cc-mode.el} and @file{lisp-mode.el}.
17715
17716@xref{Key Bindings, , Customizing Key Bindings, emacs, The GNU Emacs
17717Manual}, and @ref{Keymaps, , Keymaps, elisp, The GNU Emacs Lisp
17718Reference Manual}, for more information about keymaps.
17719
17720@node Loading Files, Autoload, Keymaps, Emacs Initialization
17721@section Loading Files
17722@cindex Loading files
17723@c findex load
17724
17725Many people in the GNU Emacs community have written extensions to
17726Emacs. As time goes by, these extensions are often included in new
17727releases. For example, the Calendar and Diary packages are now part
17728of the standard GNU Emacs, as is Calc.
17729
17730You can use a @code{load} command to evaluate a complete file and
17731thereby install all the functions and variables in the file into Emacs.
17732For example:
17733
17734@c (auto-compression-mode t)
17735
17736@smallexample
17737(load "~/emacs/slowsplit")
17738@end smallexample
17739
17740This evaluates, i.e.@: loads, the @file{slowsplit.el} file or if it
17741exists, the faster, byte compiled @file{slowsplit.elc} file from the
17742@file{emacs} sub-directory of your home directory. The file contains
17743the function @code{split-window-quietly}, which John Robinson wrote in
177441989.
17745
17746The @code{split-window-quietly} function splits a window with the
17747minimum of redisplay. I installed it in 1989 because it worked well
17748with the slow 1200 baud terminals I was then using. Nowadays, I only
17749occasionally come across such a slow connection, but I continue to use
17750the function because I like the way it leaves the bottom half of a
17751buffer in the lower of the new windows and the top half in the upper
17752window.
17753
17754@need 1250
17755To replace the key binding for the default
17756@code{split-window-vertically}, you must also unset that key and bind
17757the keys to @code{split-window-quietly}, like this:
17758
17759@smallexample
17760@group
17761(global-unset-key "\C-x2")
17762(global-set-key "\C-x2" 'split-window-quietly)
17763@end group
17764@end smallexample
17765
17766@vindex load-path
17767If you load many extensions, as I do, then instead of specifying the
17768exact location of the extension file, as shown above, you can specify
17769that directory as part of Emacs' @code{load-path}. Then, when Emacs
17770loads a file, it will search that directory as well as its default
17771list of directories. (The default list is specified in @file{paths.h}
17772when Emacs is built.)
17773
17774@need 1250
17775The following command adds your @file{~/emacs} directory to the
17776existing load path:
17777
17778@smallexample
17779@group
17780;;; Emacs Load Path
17781(setq load-path (cons "~/emacs" load-path))
17782@end group
17783@end smallexample
17784
17785Incidentally, @code{load-library} is an interactive interface to the
17786@code{load} function. The complete function looks like this:
17787
17788@findex load-library
17789@smallexample
17790@group
17791(defun load-library (library)
17792 "Load the library named LIBRARY.
17793This is an interface to the function `load'."
17794 (interactive
17795 (list (completing-read "Load library: "
e0e10d9d 17796 (apply-partially 'locate-file-completion-table
f51f97dd
SM
17797 load-path
17798 (get-load-suffixes)))))
8cda6f8f
GM
17799 (load library))
17800@end group
17801@end smallexample
17802
17803The name of the function, @code{load-library}, comes from the use of
17804`library' as a conventional synonym for `file'. The source for the
17805@code{load-library} command is in the @file{files.el} library.
17806
17807Another interactive command that does a slightly different job is
17808@code{load-file}. @xref{Lisp Libraries, , Libraries of Lisp Code for
17809Emacs, emacs, The GNU Emacs Manual}, for information on the
17810distinction between @code{load-library} and this command.
17811
17812@node Autoload, Simple Extension, Loading Files, Emacs Initialization
17813@section Autoloading
17814@findex autoload
17815
17816Instead of installing a function by loading the file that contains it,
17817or by evaluating the function definition, you can make the function
17818available but not actually install it until it is first called. This
17819is called @dfn{autoloading}.
17820
17821When you execute an autoloaded function, Emacs automatically evaluates
17822the file that contains the definition, and then calls the function.
17823
17824Emacs starts quicker with autoloaded functions, since their libraries
17825are not loaded right away; but you need to wait a moment when you
17826first use such a function, while its containing file is evaluated.
17827
17828Rarely used functions are frequently autoloaded. The
17829@file{loaddefs.el} library contains hundreds of autoloaded functions,
17830from @code{bookmark-set} to @code{wordstar-mode}. Of course, you may
17831come to use a `rare' function frequently. When you do, you should
17832load that function's file with a @code{load} expression in your
17833@file{.emacs} file.
17834
17835In my @file{.emacs} file, I load 14 libraries that contain functions
17836that would otherwise be autoloaded. (Actually, it would have been
17837better to include these files in my `dumped' Emacs, but I forgot.
17838@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
17839Reference Manual}, and the @file{INSTALL} file for more about
17840dumping.)
17841
17842You may also want to include autoloaded expressions in your @file{.emacs}
17843file. @code{autoload} is a built-in function that takes up to five
17844arguments, the final three of which are optional. The first argument
17845is the name of the function to be autoloaded; the second is the name
17846of the file to be loaded. The third argument is documentation for the
17847function, and the fourth tells whether the function can be called
17848interactively. The fifth argument tells what type of
17849object---@code{autoload} can handle a keymap or macro as well as a
17850function (the default is a function).
17851
17852@need 800
17853Here is a typical example:
17854
17855@smallexample
17856@group
17857(autoload 'html-helper-mode
17858 "html-helper-mode" "Edit HTML documents" t)
17859@end group
17860@end smallexample
17861
17862@noindent
17863(@code{html-helper-mode} is an older alternative to @code{html-mode},
17864which is a standard part of the distribution.)
17865
17866@noindent
17867This expression autoloads the @code{html-helper-mode} function. It
17868takes it from the @file{html-helper-mode.el} file (or from the byte
a9097c6d
KB
17869compiled version @file{html-helper-mode.elc}, if that exists.) The
17870file must be located in a directory specified by @code{load-path}.
17871The documentation says that this is a mode to help you edit documents
8cda6f8f
GM
17872written in the HyperText Markup Language. You can call this mode
17873interactively by typing @kbd{M-x html-helper-mode}. (You need to
17874duplicate the function's regular documentation in the autoload
17875expression because the regular function is not yet loaded, so its
17876documentation is not available.)
17877
17878@xref{Autoload, , Autoload, elisp, The GNU Emacs Lisp Reference
17879Manual}, for more information.
17880
17881@node Simple Extension, X11 Colors, Autoload, Emacs Initialization
17882@section A Simple Extension: @code{line-to-top-of-window}
17883@findex line-to-top-of-window
17884@cindex Simple extension in @file{.emacs} file
17885
17886Here is a simple extension to Emacs that moves the line point is on to
17887the top of the window. I use this all the time, to make text easier
17888to read.
17889
17890You can put the following code into a separate file and then load it
17891from your @file{.emacs} file, or you can include it within your
17892@file{.emacs} file.
17893
17894@need 1250
17895Here is the definition:
17896
17897@smallexample
17898@group
17899;;; Line to top of window;
17900;;; replace three keystroke sequence C-u 0 C-l
17901(defun line-to-top-of-window ()
17902 "Move the line point is on to top of window."
17903 (interactive)
17904 (recenter 0))
17905@end group
17906@end smallexample
17907
17908@need 1250
17909Now for the keybinding.
17910
17911Nowadays, function keys as well as mouse button events and
17912non-@sc{ascii} characters are written within square brackets, without
17913quotation marks. (In Emacs version 18 and before, you had to write
17914different function key bindings for each different make of terminal.)
17915
17916I bind @code{line-to-top-of-window} to my @key{F6} function key like
17917this:
17918
17919@smallexample
17920(global-set-key [f6] 'line-to-top-of-window)
17921@end smallexample
17922
17923For more information, see @ref{Init Rebinding, , Rebinding Keys in
17924Your Init File, emacs, The GNU Emacs Manual}.
17925
17926@cindex Conditional 'twixt two versions of Emacs
17927@cindex Version of Emacs, choosing
17928@cindex Emacs version, choosing
6dd28193 17929If you run two versions of GNU Emacs, such as versions 22 and 23, and
8cda6f8f
GM
17930use one @file{.emacs} file, you can select which code to evaluate with
17931the following conditional:
17932
17933@smallexample
17934@group
17935(cond
6dd28193 17936 ((= 22 emacs-major-version)
8cda6f8f 17937 ;; evaluate version 22 code
6dd28193
CY
17938 ( @dots{} ))
17939 ((= 23 emacs-major-version)
17940 ;; evaluate version 23 code
8cda6f8f
GM
17941 ( @dots{} )))
17942@end group
17943@end smallexample
17944
17945For example, in contrast to version 20, more recent versions blink
17946their cursors by default. I hate such blinking, as well as other
17947features, so I placed the following in my @file{.emacs}
17948file@footnote{When I start instances of Emacs that do not load my
17949@file{.emacs} file or any site file, I also turn off blinking:
17950
17951@smallexample
17952emacs -q --no-site-file -eval '(blink-cursor-mode nil)'
17953
17954@exdent Or nowadays, using an even more sophisticated set of options,
17955
17956emacs -Q - D
17957@end smallexample
17958}:
17959
17960@smallexample
17961@group
6dd28193
CY
17962(when (>= emacs-major-version 21)
17963 (blink-cursor-mode 0)
17964 ;; Insert newline when you press `C-n' (next-line)
17965 ;; at the end of the buffer
17966 (setq next-line-add-newlines t)
8cda6f8f
GM
17967@end group
17968@group
6dd28193
CY
17969 ;; Turn on image viewing
17970 (auto-image-file-mode t)
8cda6f8f
GM
17971@end group
17972@group
6dd28193
CY
17973 ;; Turn on menu bar (this bar has text)
17974 ;; (Use numeric argument to turn on)
17975 (menu-bar-mode 1)
8cda6f8f
GM
17976@end group
17977@group
6dd28193
CY
17978 ;; Turn off tool bar (this bar has icons)
17979 ;; (Use numeric argument to turn on)
17980 (tool-bar-mode nil)
8cda6f8f 17981@end group
8cda6f8f 17982@group
6dd28193
CY
17983 ;; Turn off tooltip mode for tool bar
17984 ;; (This mode causes icon explanations to pop up)
17985 ;; (Use numeric argument to turn on)
17986 (tooltip-mode nil)
17987 ;; If tooltips turned on, make tips appear promptly
17988 (setq tooltip-delay 0.1) ; default is 0.7 second
17989 )
8cda6f8f
GM
17990@end group
17991@end smallexample
17992
8cda6f8f
GM
17993@node X11 Colors, Miscellaneous, Simple Extension, Emacs Initialization
17994@section X11 Colors
17995
17996You can specify colors when you use Emacs with the MIT X Windowing
17997system.
17998
17999I dislike the default colors and specify my own.
18000
18001@need 1250
18002Here are the expressions in my @file{.emacs}
18003file that set values:
18004
18005@smallexample
18006@group
18007;; Set cursor color
18008(set-cursor-color "white")
18009
18010;; Set mouse color
18011(set-mouse-color "white")
18012
18013;; Set foreground and background
18014(set-foreground-color "white")
18015(set-background-color "darkblue")
18016@end group
18017
18018@group
18019;;; Set highlighting colors for isearch and drag
18020(set-face-foreground 'highlight "white")
18021(set-face-background 'highlight "blue")
18022@end group
18023
18024@group
18025(set-face-foreground 'region "cyan")
18026(set-face-background 'region "blue")
18027@end group
18028
18029@group
18030(set-face-foreground 'secondary-selection "skyblue")
18031(set-face-background 'secondary-selection "darkblue")
18032@end group
18033
18034@group
18035;; Set calendar highlighting colors
18036(setq calendar-load-hook
18037 '(lambda ()
18038 (set-face-foreground 'diary-face "skyblue")
18039 (set-face-background 'holiday-face "slate blue")
18040 (set-face-foreground 'holiday-face "white")))
18041@end group
18042@end smallexample
18043
18044The various shades of blue soothe my eye and prevent me from seeing
18045the screen flicker.
18046
18047Alternatively, I could have set my specifications in various X
18048initialization files. For example, I could set the foreground,
18049background, cursor, and pointer (i.e., mouse) colors in my
18050@file{~/.Xresources} file like this:
18051
18052@smallexample
18053@group
18054Emacs*foreground: white
18055Emacs*background: darkblue
18056Emacs*cursorColor: white
18057Emacs*pointerColor: white
18058@end group
18059@end smallexample
18060
18061In any event, since it is not part of Emacs, I set the root color of
18062my X window in my @file{~/.xinitrc} file, like this@footnote{I also
18063run more modern window managers, such as Enlightenment, Gnome, or KDE;
18064in those cases, I often specify an image rather than a plain color.}:
18065
18066@smallexample
18067xsetroot -solid Navy -fg white &
18068@end smallexample
18069
18070@need 1700
18071@node Miscellaneous, Mode Line, X11 Colors, Emacs Initialization
18072@section Miscellaneous Settings for a @file{.emacs} File
18073
18074@need 1250
18075Here are a few miscellaneous settings:
18076@sp 1
18077
18078@itemize @minus
18079@item
18080Set the shape and color of the mouse cursor:
18081
18082@smallexample
18083@group
18084; Cursor shapes are defined in
18085; `/usr/include/X11/cursorfont.h';
18086; for example, the `target' cursor is number 128;
18087; the `top_left_arrow' cursor is number 132.
18088@end group
18089
18090@group
18091(let ((mpointer (x-get-resource "*mpointer"
18092 "*emacs*mpointer")))
18093 ;; If you have not set your mouse pointer
18094 ;; then set it, otherwise leave as is:
18095 (if (eq mpointer nil)
18096 (setq mpointer "132")) ; top_left_arrow
18097@end group
18098@group
18099 (setq x-pointer-shape (string-to-int mpointer))
18100 (set-mouse-color "white"))
18101@end group
18102@end smallexample
18103
18104@item
18105Or you can set the values of a variety of features in an alist, like
18106this:
18107
18108@smallexample
18109@group
18110(setq-default
18111 default-frame-alist
18112 '((cursor-color . "white")
18113 (mouse-color . "white")
18114 (foreground-color . "white")
18115 (background-color . "DodgerBlue4")
18116 ;; (cursor-type . bar)
18117 (cursor-type . box)
18118@end group
18119@group
18120 (tool-bar-lines . 0)
18121 (menu-bar-lines . 1)
18122 (width . 80)
18123 (height . 58)
18124 (font .
18125 "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO8859-1")
18126 ))
18127@end group
18128@end smallexample
18129
18130@item
18131Convert @kbd{@key{CTRL}-h} into @key{DEL} and @key{DEL}
18132into @kbd{@key{CTRL}-h}.@*
18133(Some older keyboards needed this, although I have not seen the
18134problem recently.)
18135
18136@smallexample
18137@group
18138;; Translate `C-h' to <DEL>.
18139; (keyboard-translate ?\C-h ?\C-?)
18140
18141;; Translate <DEL> to `C-h'.
18142(keyboard-translate ?\C-? ?\C-h)
18143@end group
18144@end smallexample
18145
18146@item Turn off a blinking cursor!
18147
18148@smallexample
18149@group
18150(if (fboundp 'blink-cursor-mode)
18151 (blink-cursor-mode -1))
18152@end group
18153@end smallexample
18154
18155@noindent
18156or start GNU Emacs with the command @code{emacs -nbc}.
18157
18158@need 1250
18159@item When using `grep'@*
18160@samp{-i}@w{ } Ignore case distinctions@*
18161@samp{-n}@w{ } Prefix each line of output with line number@*
18162@samp{-H}@w{ } Print the filename for each match.@*
18163@samp{-e}@w{ } Protect patterns beginning with a hyphen character, @samp{-}
18164
18165@smallexample
18166(setq grep-command "grep -i -nH -e ")
18167@end smallexample
18168
18169@ignore
18170@c Evidently, no longer needed in GNU Emacs 22
18171
18172item Automatically uncompress compressed files when visiting them
18173
18174smallexample
18175(load "uncompress")
18176end smallexample
18177
18178@end ignore
18179
18180@item Find an existing buffer, even if it has a different name@*
18181This avoids problems with symbolic links.
18182
18183@smallexample
18184(setq find-file-existing-other-name t)
18185@end smallexample
18186
18187@item Set your language environment and default input method
18188
18189@smallexample
18190@group
18191(set-language-environment "latin-1")
18192;; Remember you can enable or disable multilingual text input
18193;; with the @code{toggle-input-method'} (@kbd{C-\}) command
18194(setq default-input-method "latin-1-prefix")
18195@end group
18196@end smallexample
18197
18198If you want to write with Chinese `GB' characters, set this instead:
18199
18200@smallexample
18201@group
18202(set-language-environment "Chinese-GB")
18203(setq default-input-method "chinese-tonepy")
18204@end group
18205@end smallexample
18206@end itemize
18207
18208@subsubheading Fixing Unpleasant Key Bindings
18209@cindex Key bindings, fixing
18210@cindex Bindings, key, fixing unpleasant
18211
18212Some systems bind keys unpleasantly. Sometimes, for example, the
18213@key{CTRL} key appears in an awkward spot rather than at the far left
18214of the home row.
18215
18216Usually, when people fix these sorts of keybindings, they do not
18217change their @file{~/.emacs} file. Instead, they bind the proper keys
18218on their consoles with the @code{loadkeys} or @code{install-keymap}
18219commands in their boot script and then include @code{xmodmap} commands
18220in their @file{.xinitrc} or @file{.Xsession} file for X Windows.
18221
18222@need 1250
18223@noindent
18224For a boot script:
18225
18226@smallexample
18227@group
18228loadkeys /usr/share/keymaps/i386/qwerty/emacs2.kmap.gz
18229@exdent or
18230install-keymap emacs2
18231@end group
18232@end smallexample
18233
18234@need 1250
18235@noindent
18236For a @file{.xinitrc} or @file{.Xsession} file when the @key{Caps
18237Lock} key is at the far left of the home row:
18238
18239@smallexample
18240@group
18241# Bind the key labeled `Caps Lock' to `Control'
18242# (Such a broken user interface suggests that keyboard manufacturers
18243# think that computers are typewriters from 1885.)
18244
18245xmodmap -e "clear Lock"
18246xmodmap -e "add Control = Caps_Lock"
18247@end group
18248@end smallexample
18249
18250@need 1250
18251@noindent
18252In a @file{.xinitrc} or @file{.Xsession} file, to convert an @key{ALT}
18253key to a @key{META} key:
18254
18255@smallexample
18256@group
18257# Some ill designed keyboards have a key labeled ALT and no Meta
18258xmodmap -e "keysym Alt_L = Meta_L Alt_L"
18259@end group
18260@end smallexample
18261
18262@need 1700
18263@node Mode Line, , Miscellaneous, Emacs Initialization
18264@section A Modified Mode Line
cd61af01 18265@vindex mode-line-format
8cda6f8f
GM
18266@cindex Mode line format
18267
18268Finally, a feature I really like: a modified mode line.
18269
18270When I work over a network, I forget which machine I am using. Also,
18271I tend to I lose track of where I am, and which line point is on.
18272
18273So I reset my mode line to look like this:
18274
18275@smallexample
18276-:-- foo.texi rattlesnake:/home/bob/ Line 1 (Texinfo Fill) Top
18277@end smallexample
18278
18279I am visiting a file called @file{foo.texi}, on my machine
18280@file{rattlesnake} in my @file{/home/bob} buffer. I am on line 1, in
18281Texinfo mode, and am at the top of the buffer.
18282
18283@need 1200
18284My @file{.emacs} file has a section that looks like this:
18285
18286@smallexample
18287@group
18288;; Set a Mode Line that tells me which machine, which directory,
18289;; and which line I am on, plus the other customary information.
cd61af01 18290(setq-default mode-line-format
8cda6f8f
GM
18291 (quote
18292 (#("-" 0 1
18293 (help-echo
18294 "mouse-1: select window, mouse-2: delete others ..."))
18295 mode-line-mule-info
18296 mode-line-modified
18297 mode-line-frame-identification
18298 " "
18299@end group
18300@group
18301 mode-line-buffer-identification
18302 " "
18303 (:eval (substring
18304 (system-name) 0 (string-match "\\..+" (system-name))))
18305 ":"
18306 default-directory
18307 #(" " 0 1
18308 (help-echo
18309 "mouse-1: select window, mouse-2: delete others ..."))
18310 (line-number-mode " Line %l ")
18311 global-mode-string
18312@end group
18313@group
18314 #(" %[(" 0 6
18315 (help-echo
18316 "mouse-1: select window, mouse-2: delete others ..."))
18317 (:eval (mode-line-mode-name))
18318 mode-line-process
18319 minor-mode-alist
18320 #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
18321 ")%] "
18322 (-3 . "%P")
18323 ;; "-%-"
18324 )))
18325@end group
18326@end smallexample
18327
18328@noindent
18329Here, I redefine the default mode line. Most of the parts are from
18330the original; but I make a few changes. I set the @emph{default} mode
18331line format so as to permit various modes, such as Info, to override
18332it.
18333
18334Many elements in the list are self-explanatory:
18335@code{mode-line-modified} is a variable that tells whether the buffer
18336has been modified, @code{mode-name} tells the name of the mode, and so
18337on. However, the format looks complicated because of two features we
18338have not discussed.
18339
18340@cindex Properties, in mode line example
18341The first string in the mode line is a dash or hyphen, @samp{-}. In
18342the old days, it would have been specified simply as @code{"-"}. But
18343nowadays, Emacs can add properties to a string, such as highlighting
18344or, as in this case, a help feature. If you place your mouse cursor
18345over the hyphen, some help information appears (By default, you must
18346wait seven-tenths of a second before the information appears. You can
18347change that timing by changing the value of @code{tooltip-delay}.)
18348
18349@need 1000
18350The new string format has a special syntax:
18351
18352@smallexample
18353#("-" 0 1 (help-echo "mouse-1: select window, ..."))
18354@end smallexample
18355
18356@noindent
18357The @code{#(} begins a list. The first element of the list is the
18358string itself, just one @samp{-}. The second and third
18359elements specify the range over which the fourth element applies. A
18360range starts @emph{after} a character, so a zero means the range
18361starts just before the first character; a 1 means that the range ends
18362just after the first character. The third element is the property for
18363the range. It consists of a property list, a
18364property name, in this case, @samp{help-echo}, followed by a value, in this
18365case, a string. The second, third, and fourth elements of this new
18366string format can be repeated.
18367
18368@xref{Text Properties, , Text Properties, elisp, The GNU Emacs Lisp
18369Reference Manual}, and see @ref{Mode Line Format, , Mode Line Format,
18370elisp, The GNU Emacs Lisp Reference Manual}, for more information.
18371
18372@code{mode-line-buffer-identification}
18373displays the current buffer name. It is a list
18374beginning @code{(#("%12b" 0 4 @dots{}}.
18375The @code{#(} begins the list.
18376
18377The @samp{"%12b"} displays the current buffer name, using the
18378@code{buffer-name} function with which we are familiar; the `12'
18379specifies the maximum number of characters that will be displayed.
18380When a name has fewer characters, whitespace is added to fill out to
18381this number. (Buffer names can and often should be longer than 12
18382characters; this length works well in a typical 80 column wide
18383window.)
18384
18385@code{:eval} says to evaluate the following form and use the result as
18386a string to display. In this case, the expression displays the first
18387component of the full system name. The end of the first component is
18388a @samp{.} (`period'), so I use the @code{string-match} function to
18389tell me the length of the first component. The substring from the
18390zeroth character to that length is the name of the machine.
18391
18392@need 1250
18393This is the expression:
18394
18395@smallexample
18396@group
18397(:eval (substring
18398 (system-name) 0 (string-match "\\..+" (system-name))))
18399@end group
18400@end smallexample
18401
18402@samp{%[} and @samp{%]} cause a pair of square brackets
18403to appear for each recursive editing level. @samp{%n} says `Narrow'
18404when narrowing is in effect. @samp{%P} tells you the percentage of
18405the buffer that is above the bottom of the window, or `Top', `Bottom',
18406or `All'. (A lower case @samp{p} tell you the percentage above the
18407@emph{top} of the window.) @samp{%-} inserts enough dashes to fill
18408out the line.
18409
18410Remember, ``You don't have to like Emacs to like it'' --- your own
18411Emacs can have different colors, different commands, and different
18412keys than a default Emacs.
18413
18414On the other hand, if you want to bring up a plain `out of the box'
18415Emacs, with no customization, type:
18416
18417@smallexample
18418emacs -q
18419@end smallexample
18420
18421@noindent
18422This will start an Emacs that does @emph{not} load your
18423@file{~/.emacs} initialization file. A plain, default Emacs. Nothing
18424more.
18425
18426@node Debugging, Conclusion, Emacs Initialization, Top
18427@chapter Debugging
18428@cindex debugging
18429
18430GNU Emacs has two debuggers, @code{debug} and @code{edebug}. The
18431first is built into the internals of Emacs and is always with you;
18432the second requires that you instrument a function before you can use it.
18433
18434Both debuggers are described extensively in @ref{Debugging, ,
18435Debugging Lisp Programs, elisp, The GNU Emacs Lisp Reference Manual}.
18436In this chapter, I will walk through a short example of each.
18437
18438@menu
18439* debug:: How to use the built-in debugger.
18440* debug-on-entry:: Start debugging when you call a function.
18441* debug-on-quit:: Start debugging when you quit with @kbd{C-g}.
18442* edebug:: How to use Edebug, a source level debugger.
18443* Debugging Exercises::
18444@end menu
18445
18446@node debug, debug-on-entry, Debugging, Debugging
18447@section @code{debug}
18448@findex debug
18449
18450Suppose you have written a function definition that is intended to
18451return the sum of the numbers 1 through a given number. (This is the
18452@code{triangle} function discussed earlier. @xref{Decrementing
18453Example, , Example with Decrementing Counter}, for a discussion.)
18454@c xref{Decrementing Loop,, Loop with a Decrementing Counter}, for a discussion.)
18455
18456However, your function definition has a bug. You have mistyped
18457@samp{1=} for @samp{1-}. Here is the broken definition:
18458
18459@findex triangle-bugged
18460@smallexample
18461@group
18462(defun triangle-bugged (number)
18463 "Return sum of numbers 1 through NUMBER inclusive."
18464 (let ((total 0))
18465 (while (> number 0)
18466 (setq total (+ total number))
18467 (setq number (1= number))) ; @r{Error here.}
18468 total))
18469@end group
18470@end smallexample
18471
18472If you are reading this in Info, you can evaluate this definition in
18473the normal fashion. You will see @code{triangle-bugged} appear in the
18474echo area.
18475
18476@need 1250
18477Now evaluate the @code{triangle-bugged} function with an
18478argument of 4:
18479
18480@smallexample
18481(triangle-bugged 4)
18482@end smallexample
18483
18484@noindent
18485In a recent GNU Emacs, you will create and enter a @file{*Backtrace*}
18486buffer that says:
18487
18488@noindent
18489@smallexample
18490@group
18491---------- Buffer: *Backtrace* ----------
18492Debugger entered--Lisp error: (void-function 1=)
18493 (1= number)
18494 (setq number (1= number))
18495 (while (> number 0) (setq total (+ total number))
18496 (setq number (1= number)))
18497 (let ((total 0)) (while (> number 0) (setq total ...)
18498 (setq number ...)) total)
18499 triangle-bugged(4)
18500@end group
18501@group
18502 eval((triangle-bugged 4))
18503 eval-last-sexp-1(nil)
18504 eval-last-sexp(nil)
18505 call-interactively(eval-last-sexp)
18506---------- Buffer: *Backtrace* ----------
18507@end group
18508@end smallexample
18509
18510@noindent
18511(I have reformatted this example slightly; the debugger does not fold
18512long lines. As usual, you can quit the debugger by typing @kbd{q} in
18513the @file{*Backtrace*} buffer.)
18514
18515In practice, for a bug as simple as this, the `Lisp error' line will
18516tell you what you need to know to correct the definition. The
18517function @code{1=} is `void'.
18518
18519@ignore
18520@need 800
18521In GNU Emacs 20 and before, you will see:
18522
18523@smallexample
18524Symbol's function definition is void:@: 1=
18525@end smallexample
18526
18527@noindent
18528which has the same meaning as the @file{*Backtrace*} buffer line in
18529version 21.
18530@end ignore
18531
18532However, suppose you are not quite certain what is going on?
18533You can read the complete backtrace.
18534
18535In this case, you need to run a recent GNU Emacs, which automatically
18536starts the debugger that puts you in the @file{*Backtrace*} buffer; or
18537else, you need to start the debugger manually as described below.
18538
18539Read the @file{*Backtrace*} buffer from the bottom up; it tells you
18540what Emacs did that led to the error. Emacs made an interactive call
18541to @kbd{C-x C-e} (@code{eval-last-sexp}), which led to the evaluation
18542of the @code{triangle-bugged} expression. Each line above tells you
18543what the Lisp interpreter evaluated next.
18544
18545@need 1250
18546The third line from the top of the buffer is
18547
18548@smallexample
18549(setq number (1= number))
18550@end smallexample
18551
18552@noindent
18553Emacs tried to evaluate this expression; in order to do so, it tried
18554to evaluate the inner expression shown on the second line from the
18555top:
18556
18557@smallexample
18558(1= number)
18559@end smallexample
18560
18561@need 1250
18562@noindent
18563This is where the error occurred; as the top line says:
18564
18565@smallexample
18566Debugger entered--Lisp error: (void-function 1=)
18567@end smallexample
18568
18569@noindent
18570You can correct the mistake, re-evaluate the function definition, and
18571then run your test again.
18572
18573@node debug-on-entry, debug-on-quit, debug, Debugging
18574@section @code{debug-on-entry}
18575@findex debug-on-entry
18576
18577A recent GNU Emacs starts the debugger automatically when your
18578function has an error.
18579
18580@ignore
18581GNU Emacs version 20 and before did not; it simply
18582presented you with an error message. You had to start the debugger
18583manually.
18584@end ignore
18585
18586Incidentally, you can start the debugger manually for all versions of
18587Emacs; the advantage is that the debugger runs even if you do not have
18588a bug in your code. Sometimes your code will be free of bugs!
18589
18590You can enter the debugger when you call the function by calling
18591@code{debug-on-entry}.
18592
18593@need 1250
18594@noindent
18595Type:
18596
18597@smallexample
18598M-x debug-on-entry RET triangle-bugged RET
18599@end smallexample
18600
18601@need 1250
18602@noindent
18603Now, evaluate the following:
18604
18605@smallexample
18606(triangle-bugged 5)
18607@end smallexample
18608
18609@noindent
18610All versions of Emacs will create a @file{*Backtrace*} buffer and tell
18611you that it is beginning to evaluate the @code{triangle-bugged}
18612function:
18613
18614@smallexample
18615@group
18616---------- Buffer: *Backtrace* ----------
18617Debugger entered--entering a function:
18618* triangle-bugged(5)
18619 eval((triangle-bugged 5))
18620@end group
18621@group
18622 eval-last-sexp-1(nil)
18623 eval-last-sexp(nil)
18624 call-interactively(eval-last-sexp)
18625---------- Buffer: *Backtrace* ----------
18626@end group
18627@end smallexample
18628
18629In the @file{*Backtrace*} buffer, type @kbd{d}. Emacs will evaluate
18630the first expression in @code{triangle-bugged}; the buffer will look
18631like this:
18632
18633@smallexample
18634@group
18635---------- Buffer: *Backtrace* ----------
18636Debugger entered--beginning evaluation of function call form:
18637* (let ((total 0)) (while (> number 0) (setq total ...)
18638 (setq number ...)) total)
18639* triangle-bugged(5)
18640 eval((triangle-bugged 5))
18641@end group
18642@group
18643 eval-last-sexp-1(nil)
18644 eval-last-sexp(nil)
18645 call-interactively(eval-last-sexp)
18646---------- Buffer: *Backtrace* ----------
18647@end group
18648@end smallexample
18649
18650@noindent
18651Now, type @kbd{d} again, eight times, slowly. Each time you type
18652@kbd{d}, Emacs will evaluate another expression in the function
18653definition.
18654
18655@need 1750
18656Eventually, the buffer will look like this:
18657
18658@smallexample
18659@group
18660---------- Buffer: *Backtrace* ----------
18661Debugger entered--beginning evaluation of function call form:
18662* (setq number (1= number))
18663* (while (> number 0) (setq total (+ total number))
18664 (setq number (1= number)))
18665@group
18666@end group
18667* (let ((total 0)) (while (> number 0) (setq total ...)
18668 (setq number ...)) total)
18669* triangle-bugged(5)
18670 eval((triangle-bugged 5))
18671@group
18672@end group
18673 eval-last-sexp-1(nil)
18674 eval-last-sexp(nil)
18675 call-interactively(eval-last-sexp)
18676---------- Buffer: *Backtrace* ----------
18677@end group
18678@end smallexample
18679
18680@need 1500
18681@noindent
18682Finally, after you type @kbd{d} two more times, Emacs will reach the
18683error, and the top two lines of the @file{*Backtrace*} buffer will look
18684like this:
18685
18686@smallexample
18687@group
18688---------- Buffer: *Backtrace* ----------
18689Debugger entered--Lisp error: (void-function 1=)
18690* (1= number)
18691@dots{}
18692---------- Buffer: *Backtrace* ----------
18693@end group
18694@end smallexample
18695
18696By typing @kbd{d}, you were able to step through the function.
18697
18698You can quit a @file{*Backtrace*} buffer by typing @kbd{q} in it; this
18699quits the trace, but does not cancel @code{debug-on-entry}.
18700
18701@findex cancel-debug-on-entry
18702To cancel the effect of @code{debug-on-entry}, call
18703@code{cancel-debug-on-entry} and the name of the function, like this:
18704
18705@smallexample
18706M-x cancel-debug-on-entry RET triangle-bugged RET
18707@end smallexample
18708
18709@noindent
18710(If you are reading this in Info, cancel @code{debug-on-entry} now.)
18711
18712@node debug-on-quit, edebug, debug-on-entry, Debugging
18713@section @code{debug-on-quit} and @code{(debug)}
18714
18715In addition to setting @code{debug-on-error} or calling @code{debug-on-entry},
18716there are two other ways to start @code{debug}.
18717
18718@findex debug-on-quit
18719You can start @code{debug} whenever you type @kbd{C-g}
18720(@code{keyboard-quit}) by setting the variable @code{debug-on-quit} to
18721@code{t}. This is useful for debugging infinite loops.
18722
18723@need 1500
18724@cindex @code{(debug)} in code
18725Or, you can insert a line that says @code{(debug)} into your code
18726where you want the debugger to start, like this:
18727
18728@smallexample
18729@group
18730(defun triangle-bugged (number)
18731 "Return sum of numbers 1 through NUMBER inclusive."
18732 (let ((total 0))
18733 (while (> number 0)
18734 (setq total (+ total number))
18735 (debug) ; @r{Start debugger.}
18736 (setq number (1= number))) ; @r{Error here.}
18737 total))
18738@end group
18739@end smallexample
18740
18741The @code{debug} function is described in detail in @ref{Debugger, ,
18742The Lisp Debugger, elisp, The GNU Emacs Lisp Reference Manual}.
18743
18744@node edebug, Debugging Exercises, debug-on-quit, Debugging
18745@section The @code{edebug} Source Level Debugger
18746@cindex Source level debugger
18747@findex edebug
18748
18749Edebug is a source level debugger. Edebug normally displays the
18750source of the code you are debugging, with an arrow at the left that
18751shows which line you are currently executing.
18752
18753You can walk through the execution of a function, line by line, or run
18754quickly until reaching a @dfn{breakpoint} where execution stops.
18755
18756Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
18757Lisp Reference Manual}.
18758
18759@need 1250
18760Here is a bugged function definition for @code{triangle-recursively}.
18761@xref{Recursive triangle function, , Recursion in place of a counter},
18762for a review of it.
18763
18764@smallexample
18765@group
18766(defun triangle-recursively-bugged (number)
18767 "Return sum of numbers 1 through NUMBER inclusive.
18768Uses recursion."
18769 (if (= number 1)
18770 1
18771 (+ number
18772 (triangle-recursively-bugged
18773 (1= number))))) ; @r{Error here.}
18774@end group
18775@end smallexample
18776
18777@noindent
18778Normally, you would install this definition by positioning your cursor
18779after the function's closing parenthesis and typing @kbd{C-x C-e}
18780(@code{eval-last-sexp}) or else by positioning your cursor within the
18781definition and typing @kbd{C-M-x} (@code{eval-defun}). (By default,
18782the @code{eval-defun} command works only in Emacs Lisp mode or in Lisp
a1539cd7 18783Interaction mode.)
8cda6f8f
GM
18784
18785@need 1500
18786However, to prepare this function definition for Edebug, you must
18787first @dfn{instrument} the code using a different command. You can do
18788this by positioning your cursor within or just after the definition
18789and typing
18790
18791@smallexample
18792M-x edebug-defun RET
18793@end smallexample
18794
18795@noindent
18796This will cause Emacs to load Edebug automatically if it is not
18797already loaded, and properly instrument the function.
18798
18799After instrumenting the function, place your cursor after the
18800following expression and type @kbd{C-x C-e} (@code{eval-last-sexp}):
18801
18802@smallexample
18803(triangle-recursively-bugged 3)
18804@end smallexample
18805
18806@noindent
18807You will be jumped back to the source for
18808@code{triangle-recursively-bugged} and the cursor positioned at the
18809beginning of the @code{if} line of the function. Also, you will see
18810an arrowhead at the left hand side of that line. The arrowhead marks
18811the line where the function is executing. (In the following examples,
18812we show the arrowhead with @samp{=>}; in a windowing system, you may
18813see the arrowhead as a solid triangle in the window `fringe'.)
18814
18815@smallexample
18816=>@point{}(if (= number 1)
18817@end smallexample
18818
18819@noindent
18820@iftex
18821In the example, the location of point is displayed with a star,
18822@samp{@point{}} (in Info, it is displayed as @samp{-!-}).
18823@end iftex
18824@ifnottex
18825In the example, the location of point is displayed as @samp{@point{}}
18826(in a printed book, it is displayed with a five pointed star).
18827@end ifnottex
18828
18829If you now press @key{SPC}, point will move to the next expression to
18830be executed; the line will look like this:
18831
18832@smallexample
18833=>(if @point{}(= number 1)
18834@end smallexample
18835
18836@noindent
18837As you continue to press @key{SPC}, point will move from expression to
18838expression. At the same time, whenever an expression returns a value,
18839that value will be displayed in the echo area. For example, after you
18840move point past @code{number}, you will see the following:
18841
18842@smallexample
18843Result: 3 (#o3, #x3, ?\C-c)
18844@end smallexample
18845
18846@noindent
18847This means the value of @code{number} is 3, which is octal three,
18848hexadecimal three, and @sc{ascii} `control-c' (the third letter of the
18849alphabet, in case you need to know this information).
18850
18851You can continue moving through the code until you reach the line with
18852the error. Before evaluation, that line looks like this:
18853
18854@smallexample
18855=> @point{}(1= number))))) ; @r{Error here.}
18856@end smallexample
18857
18858@need 1250
18859@noindent
18860When you press @key{SPC} once again, you will produce an error message
18861that says:
18862
18863@smallexample
18864Symbol's function definition is void:@: 1=
18865@end smallexample
18866
18867@noindent
18868This is the bug.
18869
18870Press @kbd{q} to quit Edebug.
18871
18872To remove instrumentation from a function definition, simply
18873re-evaluate it with a command that does not instrument it.
18874For example, you could place your cursor after the definition's
18875closing parenthesis and type @kbd{C-x C-e}.
18876
18877Edebug does a great deal more than walk with you through a function.
18878You can set it so it races through on its own, stopping only at an
18879error or at specified stopping points; you can cause it to display the
18880changing values of various expressions; you can find out how many
18881times a function is called, and more.
18882
18883Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
18884Lisp Reference Manual}.
18885
18886@need 1500
18887@node Debugging Exercises, , edebug, Debugging
18888@section Debugging Exercises
18889
18890@itemize @bullet
18891@item
ea4f7750 18892Install the @code{@value{COUNT-WORDS}} function and then cause it to
8cda6f8f
GM
18893enter the built-in debugger when you call it. Run the command on a
18894region containing two words. You will need to press @kbd{d} a
18895remarkable number of times. On your system, is a `hook' called after
18896the command finishes? (For information on hooks, see @ref{Command
18897Overview, , Command Loop Overview, elisp, The GNU Emacs Lisp Reference
18898Manual}.)
18899
18900@item
ea4f7750 18901Copy @code{@value{COUNT-WORDS}} into the @file{*scratch*} buffer,
8cda6f8f
GM
18902instrument the function for Edebug, and walk through its execution.
18903The function does not need to have a bug, although you can introduce
18904one if you wish. If the function lacks a bug, the walk-through
18905completes without problems.
18906
18907@item
18908While running Edebug, type @kbd{?} to see a list of all the Edebug commands.
18909(The @code{global-edebug-prefix} is usually @kbd{C-x X}, i.e.@:
18910@kbd{@key{CTRL}-x} followed by an upper case @kbd{X}; use this prefix
18911for commands made outside of the Edebug debugging buffer.)
18912
18913@item
18914In the Edebug debugging buffer, use the @kbd{p}
18915(@code{edebug-bounce-point}) command to see where in the region the
ea4f7750 18916@code{@value{COUNT-WORDS}} is working.
8cda6f8f
GM
18917
18918@item
18919Move point to some spot further down the function and then type the
18920@kbd{h} (@code{edebug-goto-here}) command to jump to that location.
18921
18922@item
18923Use the @kbd{t} (@code{edebug-trace-mode}) command to cause Edebug to
18924walk through the function on its own; use an upper case @kbd{T} for
18925@code{edebug-Trace-fast-mode}.
18926
18927@item
18928Set a breakpoint, then run Edebug in Trace mode until it reaches the
18929stopping point.
18930@end itemize
18931
18932@node Conclusion, the-the, Debugging, Top
18933@chapter Conclusion
18934
18935We have now reached the end of this Introduction. You have now
18936learned enough about programming in Emacs Lisp to set values, to write
18937simple @file{.emacs} files for yourself and your friends, and write
18938simple customizations and extensions to Emacs.
18939
18940This is a place to stop. Or, if you wish, you can now go onward, and
18941teach yourself.
18942
18943You have learned some of the basic nuts and bolts of programming. But
18944only some. There are a great many more brackets and hinges that are
18945easy to use that we have not touched.
18946
18947A path you can follow right now lies among the sources to GNU Emacs
18948and in
18949@ifnotinfo
18950@cite{The GNU Emacs Lisp Reference Manual}.
18951@end ifnotinfo
18952@ifinfo
18953@ref{Top, , The GNU Emacs Lisp Reference Manual, elisp, The GNU
18954Emacs Lisp Reference Manual}.
18955@end ifinfo
18956
18957The Emacs Lisp sources are an adventure. When you read the sources and
18958come across a function or expression that is unfamiliar, you need to
18959figure out or find out what it does.
18960
18961Go to the Reference Manual. It is a thorough, complete, and fairly
18962easy-to-read description of Emacs Lisp. It is written not only for
18963experts, but for people who know what you know. (The @cite{Reference
18964Manual} comes with the standard GNU Emacs distribution. Like this
18965introduction, it comes as a Texinfo source file, so you can read it
18966on-line and as a typeset, printed book.)
18967
18968Go to the other on-line help that is part of GNU Emacs: the on-line
88c26f5c 18969documentation for all functions and variables, and @code{find-tag},
8cda6f8f
GM
18970the program that takes you to sources.
18971
18972Here is an example of how I explore the sources. Because of its name,
18973@file{simple.el} is the file I looked at first, a long time ago. As
18974it happens some of the functions in @file{simple.el} are complicated,
18975or at least look complicated at first sight. The @code{open-line}
18976function, for example, looks complicated.
18977
18978You may want to walk through this function slowly, as we did with the
18979@code{forward-sentence} function. (@xref{forward-sentence, The
18980@code{forward-sentence} function}.) Or you may want to skip that
18981function and look at another, such as @code{split-line}. You don't
18982need to read all the functions. According to
18983@code{count-words-in-defun}, the @code{split-line} function contains
18984102 words and symbols.
18985
18986Even though it is short, @code{split-line} contains expressions
18987we have not studied: @code{skip-chars-forward}, @code{indent-to},
18988@code{current-column} and @code{insert-and-inherit}.
18989
18990Consider the @code{skip-chars-forward} function. (It is part of the
18991function definition for @code{back-to-indentation}, which is shown in
18992@ref{Review, , Review}.)
18993
18994In GNU Emacs, you can find out more about @code{skip-chars-forward} by
18995typing @kbd{C-h f} (@code{describe-function}) and the name of the
18996function. This gives you the function documentation.
18997
18998You may be able to guess what is done by a well named function such as
18999@code{indent-to}; or you can look it up, too. Incidentally, the
19000@code{describe-function} function itself is in @file{help.el}; it is
19001one of those long, but decipherable functions. You can look up
19002@code{describe-function} using the @kbd{C-h f} command!
19003
19004In this instance, since the code is Lisp, the @file{*Help*} buffer
19005contains the name of the library containing the function's source.
19006You can put point over the name of the library and press the RET key,
19007which in this situation is bound to @code{help-follow}, and be taken
19008directly to the source, in the same way as @kbd{M-.}
19009(@code{find-tag}).
19010
19011The definition for @code{describe-function} illustrates how to
19012customize the @code{interactive} expression without using the standard
19013character codes; and it shows how to create a temporary buffer.
19014
19015(The @code{indent-to} function is written in C rather than Emacs Lisp;
19016it is a `built-in' function. @code{help-follow} takes you to its
19017source as does @code{find-tag}, when properly set up.)
19018
19019You can look at a function's source using @code{find-tag}, which is
19020bound to @kbd{M-.} Finally, you can find out what the Reference
19021Manual has to say by visiting the manual in Info, and typing @kbd{i}
19022(@code{Info-index}) and the name of the function, or by looking up the
19023function in the index to a printed copy of the manual.
19024
19025Similarly, you can find out what is meant by
19026@code{insert-and-inherit}.
19027
19028Other interesting source files include @file{paragraphs.el},
19029@file{loaddefs.el}, and @file{loadup.el}. The @file{paragraphs.el}
19030file includes short, easily understood functions as well as longer
19031ones. The @file{loaddefs.el} file contains the many standard
19032autoloads and many keymaps. I have never looked at it all; only at
19033parts. @file{loadup.el} is the file that loads the standard parts of
19034Emacs; it tells you a great deal about how Emacs is built.
19035(@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
19036Reference Manual}, for more about building.)
19037
19038As I said, you have learned some nuts and bolts; however, and very
19039importantly, we have hardly touched major aspects of programming; I
19040have said nothing about how to sort information, except to use the
19041predefined @code{sort} function; I have said nothing about how to store
19042information, except to use variables and lists; I have said nothing
19043about how to write programs that write programs. These are topics for
19044another, and different kind of book, a different kind of learning.
19045
19046What you have done is learn enough for much practical work with GNU
19047Emacs. What you have done is get started. This is the end of a
19048beginning.
19049
19050@c ================ Appendix ================
19051
19052@node the-the, Kill Ring, Conclusion, Top
19053@appendix The @code{the-the} Function
19054@findex the-the
19055@cindex Duplicated words function
19056@cindex Words, duplicated
19057
19058Sometimes when you you write text, you duplicate words---as with ``you
19059you'' near the beginning of this sentence. I find that most
19060frequently, I duplicate ``the''; hence, I call the function for
19061detecting duplicated words, @code{the-the}.
19062
19063@need 1250
19064As a first step, you could use the following regular expression to
19065search for duplicates:
19066
19067@smallexample
19068\\(\\w+[ \t\n]+\\)\\1
19069@end smallexample
19070
19071@noindent
19072This regexp matches one or more word-constituent characters followed
19073by one or more spaces, tabs, or newlines. However, it does not detect
19074duplicated words on different lines, since the ending of the first
19075word, the end of the line, is different from the ending of the second
19076word, a space. (For more information about regular expressions, see
19077@ref{Regexp Search, , Regular Expression Searches}, as well as
19078@ref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
19079Manual}, and @ref{Regular Expressions, , Regular Expressions, elisp,
19080The GNU Emacs Lisp Reference Manual}.)
19081
19082You might try searching just for duplicated word-constituent
19083characters but that does not work since the pattern detects doubles
19084such as the two occurrences of `th' in `with the'.
19085
19086Another possible regexp searches for word-constituent characters
19087followed by non-word-constituent characters, reduplicated. Here,
19088@w{@samp{\\w+}} matches one or more word-constituent characters and
19089@w{@samp{\\W*}} matches zero or more non-word-constituent characters.
19090
19091@smallexample
19092\\(\\(\\w+\\)\\W*\\)\\1
19093@end smallexample
19094
19095@noindent
19096Again, not useful.
19097
19098Here is the pattern that I use. It is not perfect, but good enough.
19099@w{@samp{\\b}} matches the empty string, provided it is at the beginning
19100or end of a word; @w{@samp{[^@@ \n\t]+}} matches one or more occurrences of
19101any characters that are @emph{not} an @@-sign, space, newline, or tab.
19102
19103@smallexample
19104\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b
19105@end smallexample
19106
19107One can write more complicated expressions, but I found that this
19108expression is good enough, so I use it.
19109
19110Here is the @code{the-the} function, as I include it in my
19111@file{.emacs} file, along with a handy global key binding:
19112
19113@smallexample
19114@group
19115(defun the-the ()
19116 "Search forward for for a duplicated word."
19117 (interactive)
19118 (message "Searching for for duplicated words ...")
19119 (push-mark)
19120@end group
19121@group
19122 ;; This regexp is not perfect
19123 ;; but is fairly good over all:
19124 (if (re-search-forward
19125 "\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
19126 (message "Found duplicated word.")
19127 (message "End of buffer")))
19128@end group
19129
19130@group
19131;; Bind `the-the' to C-c \
19132(global-set-key "\C-c\\" 'the-the)
19133@end group
19134@end smallexample
19135
19136@sp 1
19137Here is test text:
19138
19139@smallexample
19140@group
19141one two two three four five
19142five six seven
19143@end group
19144@end smallexample
19145
19146You can substitute the other regular expressions shown above in the
19147function definition and try each of them on this list.
19148
19149@node Kill Ring, Full Graph, the-the, Top
19150@appendix Handling the Kill Ring
19151@cindex Kill ring handling
19152@cindex Handling the kill ring
19153@cindex Ring, making a list like a
19154
19155The kill ring is a list that is transformed into a ring by the
19156workings of the @code{current-kill} function. The @code{yank} and
19157@code{yank-pop} commands use the @code{current-kill} function.
19158
19159This appendix describes the @code{current-kill} function as well as
19160both the @code{yank} and the @code{yank-pop} commands, but first,
19161consider the workings of the kill ring.
19162
19163@menu
19164* What the Kill Ring Does::
19165* current-kill::
19166* yank:: Paste a copy of a clipped element.
19167* yank-pop:: Insert element pointed to.
19168* ring file::
19169@end menu
19170
19171@node What the Kill Ring Does, current-kill, Kill Ring, Kill Ring
19172@ifnottex
19173@unnumberedsec What the Kill Ring Does
19174@end ifnottex
19175
19176@need 1250
19177The kill ring has a default maximum length of sixty items; this number
19178is too large for an explanation. Instead, set it to four. Please
19179evaluate the following:
19180
19181@smallexample
19182@group
19183(setq old-kill-ring-max kill-ring-max)
19184(setq kill-ring-max 4)
19185@end group
19186@end smallexample
19187
19188@noindent
19189Then, please copy each line of the following indented example into the
19190kill ring. You may kill each line with @kbd{C-k} or mark it and copy
19191it with @kbd{M-w}.
19192
19193@noindent
19194(In a read-only buffer, such as the @file{*info*} buffer, the kill
19195command, @kbd{C-k} (@code{kill-line}), will not remove the text,
19196merely copy it to the kill ring. However, your machine may beep at
19197you. Alternatively, for silence, you may copy the region of each line
19198with the @kbd{M-w} (@code{kill-ring-save}) command. You must mark
19199each line for this command to succeed, but it does not matter at which
19200end you put point or mark.)
19201
19202@need 1250
19203@noindent
19204Please invoke the calls in order, so that five elements attempt to
19205fill the kill ring:
19206
19207@smallexample
19208@group
19209first some text
19210second piece of text
19211third line
19212fourth line of text
19213fifth bit of text
19214@end group
19215@end smallexample
19216
19217@need 1250
19218@noindent
19219Then find the value of @code{kill-ring} by evaluating
19220
19221@smallexample
19222kill-ring
19223@end smallexample
19224
19225@need 800
19226@noindent
19227It is:
19228
19229@smallexample
19230@group
19231("fifth bit of text" "fourth line of text"
19232"third line" "second piece of text")
19233@end group
19234@end smallexample
19235
19236@noindent
19237The first element, @samp{first some text}, was dropped.
19238
19239@need 1250
19240To return to the old value for the length of the kill ring, evaluate:
19241
19242@smallexample
19243(setq kill-ring-max old-kill-ring-max)
19244@end smallexample
19245
19246@node current-kill, yank, What the Kill Ring Does, Kill Ring
19247@comment node-name, next, previous, up
19248@appendixsec The @code{current-kill} Function
19249@findex current-kill
19250
19251The @code{current-kill} function changes the element in the kill ring
19252to which @code{kill-ring-yank-pointer} points. (Also, the
19253@code{kill-new} function sets @code{kill-ring-yank-pointer} to point
867d4bb3 19254to the latest element of the kill ring. The @code{kill-new}
8cda6f8f
GM
19255function is used directly or indirectly by @code{kill-append},
19256@code{copy-region-as-kill}, @code{kill-ring-save}, @code{kill-line},
19257and @code{kill-region}.)
19258
19259@menu
19260* Code for current-kill::
19261* Understanding current-kill::
19262@end menu
19263
19264@node Code for current-kill, Understanding current-kill, current-kill, current-kill
19265@ifnottex
19266@unnumberedsubsec The code for @code{current-kill}
19267@end ifnottex
19268
19269
19270@need 1500
19271The @code{current-kill} function is used by @code{yank} and by
19272@code{yank-pop}. Here is the code for @code{current-kill}:
19273
19274@smallexample
19275@group
19276(defun current-kill (n &optional do-not-move)
19277 "Rotate the yanking point by N places, and then return that kill.
19278If N is zero, `interprogram-paste-function' is set, and calling it
19279returns a string, then that string is added to the front of the
19280kill ring and returned as the latest kill.
19281@end group
19282@group
19283If optional arg DO-NOT-MOVE is non-nil, then don't actually move the
19284yanking point; just return the Nth kill forward."
19285 (let ((interprogram-paste (and (= n 0)
19286 interprogram-paste-function
19287 (funcall interprogram-paste-function))))
19288@end group
19289@group
19290 (if interprogram-paste
19291 (progn
19292 ;; Disable the interprogram cut function when we add the new
19293 ;; text to the kill ring, so Emacs doesn't try to own the
19294 ;; selection, with identical text.
19295 (let ((interprogram-cut-function nil))
19296 (kill-new interprogram-paste))
19297 interprogram-paste)
19298@end group
19299@group
19300 (or kill-ring (error "Kill ring is empty"))
19301 (let ((ARGth-kill-element
19302 (nthcdr (mod (- n (length kill-ring-yank-pointer))
19303 (length kill-ring))
19304 kill-ring)))
19305 (or do-not-move
19306 (setq kill-ring-yank-pointer ARGth-kill-element))
19307 (car ARGth-kill-element)))))
19308@end group
19309@end smallexample
19310
19311Remember also that the @code{kill-new} function sets
867d4bb3 19312@code{kill-ring-yank-pointer} to the latest element of the kill
8cda6f8f
GM
19313ring, which means that all the functions that call it set the value
19314indirectly: @code{kill-append}, @code{copy-region-as-kill},
19315@code{kill-ring-save}, @code{kill-line}, and @code{kill-region}.
19316
19317@need 1500
19318Here is the line in @code{kill-new}, which is explained in
19319@ref{kill-new function, , The @code{kill-new} function}.
19320
19321@smallexample
19322(setq kill-ring-yank-pointer kill-ring)
19323@end smallexample
19324
19325@node Understanding current-kill, , Code for current-kill, current-kill
19326@ifnottex
19327@unnumberedsubsec @code{current-kill} in Outline
19328@end ifnottex
19329
19330The @code{current-kill} function looks complex, but as usual, it can
19331be understood by taking it apart piece by piece. First look at it in
19332skeletal form:
19333
19334@smallexample
19335@group
19336(defun current-kill (n &optional do-not-move)
19337 "Rotate the yanking point by N places, and then return that kill."
19338 (let @var{varlist}
19339 @var{body}@dots{})
19340@end group
19341@end smallexample
19342
19343This function takes two arguments, one of which is optional. It has a
19344documentation string. It is @emph{not} interactive.
19345
19346@menu
19347* Body of current-kill::
19348* Digression concerning error:: How to mislead humans, but not computers.
19349* Determining the Element::
19350@end menu
19351
19352@node Body of current-kill, Digression concerning error, Understanding current-kill, Understanding current-kill
19353@ifnottex
19354@unnumberedsubsubsec The Body of @code{current-kill}
19355@end ifnottex
19356
19357The body of the function definition is a @code{let} expression, which
19358itself has a body as well as a @var{varlist}.
19359
19360The @code{let} expression declares a variable that will be only usable
19361within the bounds of this function. This variable is called
19362@code{interprogram-paste} and is for copying to another program. It
19363is not for copying within this instance of GNU Emacs. Most window
19364systems provide a facility for interprogram pasting. Sadly, that
19365facility usually provides only for the last element. Most windowing
19366systems have not adopted a ring of many possibilities, even though
19367Emacs has provided it for decades.
19368
19369The @code{if} expression has two parts, one if there exists
19370@code{interprogram-paste} and one if not.
19371
19372@need 2000
19373Let us consider the `if not' or else-part of the @code{current-kill}
867d4bb3 19374function. (The then-part uses the @code{kill-new} function, which
8cda6f8f
GM
19375we have already described. @xref{kill-new function, , The
19376@code{kill-new} function}.)
19377
19378@smallexample
19379@group
19380(or kill-ring (error "Kill ring is empty"))
19381(let ((ARGth-kill-element
19382 (nthcdr (mod (- n (length kill-ring-yank-pointer))
19383 (length kill-ring))
19384 kill-ring)))
19385 (or do-not-move
19386 (setq kill-ring-yank-pointer ARGth-kill-element))
19387 (car ARGth-kill-element))
19388@end group
19389@end smallexample
19390
19391@noindent
19392The code first checks whether the kill ring has content; otherwise it
19393signals an error.
19394
19395@need 1000
19396Note that the @code{or} expression is very similar to testing length
19397with an @code{if}:
19398
19399@findex zerop
19400@findex error
19401@smallexample
19402@group
19403(if (zerop (length kill-ring)) ; @r{if-part}
19404 (error "Kill ring is empty")) ; @r{then-part}
19405 ;; No else-part
19406@end group
19407@end smallexample
19408
19409@noindent
19410If there is not anything in the kill ring, its length must be zero and
19411an error message sent to the user: @samp{Kill ring is empty}. The
19412@code{current-kill} function uses an @code{or} expression which is
19413simpler. But an @code{if} expression reminds us what goes on.
19414
19415This @code{if} expression uses the function @code{zerop} which returns
19416true if the value it is testing is zero. When @code{zerop} tests
19417true, the then-part of the @code{if} is evaluated. The then-part is a
19418list starting with the function @code{error}, which is a function that
19419is similar to the @code{message} function
19420(@pxref{message, , The @code{message} Function}) in that
19421it prints a one-line message in the echo area. However, in addition
19422to printing a message, @code{error} also stops evaluation of the
19423function within which it is embedded. This means that the rest of the
19424function will not be evaluated if the length of the kill ring is zero.
19425
19426Then the @code{current-kill} function selects the element to return.
19427The selection depends on the number of places that @code{current-kill}
19428rotates and on where @code{kill-ring-yank-pointer} points.
19429
19430Next, either the optional @code{do-not-move} argument is true or the
19431current value of @code{kill-ring-yank-pointer} is set to point to the
19432list. Finally, another expression returns the first element of the
19433list even if the @code{do-not-move} argument is true.
19434
19435@node Digression concerning error, Determining the Element, Body of current-kill, Understanding current-kill
19436@ifnottex
19437@unnumberedsubsubsec Digression about the word `error'
19438@end ifnottex
19439
19440In my opinion, it is slightly misleading, at least to humans, to use
19441the term `error' as the name of the @code{error} function. A better
19442term would be `cancel'. Strictly speaking, of course, you cannot
19443point to, much less rotate a pointer to a list that has no length, so
19444from the point of view of the computer, the word `error' is correct.
19445But a human expects to attempt this sort of thing, if only to find out
19446whether the kill ring is full or empty. This is an act of
19447exploration.
19448
19449From the human point of view, the act of exploration and discovery is
09e80d9f 19450not necessarily an error, and therefore should not be labeled as one,
8cda6f8f
GM
19451even in the bowels of a computer. As it is, the code in Emacs implies
19452that a human who is acting virtuously, by exploring his or her
19453environment, is making an error. This is bad. Even though the computer
19454takes the same steps as it does when there is an `error', a term such as
19455`cancel' would have a clearer connotation.
19456
19457@node Determining the Element, , Digression concerning error, Understanding current-kill
19458@ifnottex
19459@unnumberedsubsubsec Determining the Element
19460@end ifnottex
19461
19462Among other actions, the else-part of the @code{if} expression sets
19463the value of @code{kill-ring-yank-pointer} to
19464@code{ARGth-kill-element} when the kill ring has something in it and
19465the value of @code{do-not-move} is @code{nil}.
19466
19467@need 800
19468The code looks like this:
19469
19470@smallexample
19471@group
19472(nthcdr (mod (- n (length kill-ring-yank-pointer))
19473 (length kill-ring))
19474 kill-ring)))
19475@end group
19476@end smallexample
19477
19478This needs some examination. Unless it is not supposed to move the
19479pointer, the @code{current-kill} function changes where
19480@code{kill-ring-yank-pointer} points.
19481That is what the
19482@w{@code{(setq kill-ring-yank-pointer ARGth-kill-element))}}
19483expression does. Also, clearly, @code{ARGth-kill-element} is being
19484set to be equal to some @sc{cdr} of the kill ring, using the
19485@code{nthcdr} function that is described in an earlier section.
19486(@xref{copy-region-as-kill}.) How does it do this?
19487
19488As we have seen before (@pxref{nthcdr}), the @code{nthcdr} function
19489works by repeatedly taking the @sc{cdr} of a list---it takes the
19490@sc{cdr} of the @sc{cdr} of the @sc{cdr} @dots{}
19491
19492@need 800
19493The two following expressions produce the same result:
19494
19495@smallexample
19496@group
19497(setq kill-ring-yank-pointer (cdr kill-ring))
19498
19499(setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
19500@end group
19501@end smallexample
19502
19503However, the @code{nthcdr} expression is more complicated. It uses
19504the @code{mod} function to determine which @sc{cdr} to select.
19505
19506(You will remember to look at inner functions first; indeed, we will
19507have to go inside the @code{mod}.)
19508
19509The @code{mod} function returns the value of its first argument modulo
19510the second; that is to say, it returns the remainder after dividing
19511the first argument by the second. The value returned has the same
19512sign as the second argument.
19513
19514@need 800
19515Thus,
19516
19517@smallexample
19518@group
19519(mod 12 4)
19520 @result{} 0 ;; @r{because there is no remainder}
19521(mod 13 4)
19522 @result{} 1
19523@end group
19524@end smallexample
19525
19526@need 1250
19527In this case, the first argument is often smaller than the second.
19528That is fine.
19529
19530@smallexample
19531@group
19532(mod 0 4)
19533 @result{} 0
19534(mod 1 4)
19535 @result{} 1
19536@end group
19537@end smallexample
19538
19539We can guess what the @code{-} function does. It is like @code{+} but
19540subtracts instead of adds; the @code{-} function subtracts its second
19541argument from its first. Also, we already know what the @code{length}
19542function does (@pxref{length}). It returns the length of a list.
19543
19544And @code{n} is the name of the required argument to the
19545@code{current-kill} function.
19546
19547@need 1250
19548So when the first argument to @code{nthcdr} is zero, the @code{nthcdr}
19549expression returns the whole list, as you can see by evaluating the
19550following:
19551
19552@smallexample
19553@group
19554;; kill-ring-yank-pointer @r{and} kill-ring @r{have a length of four}
19555;; @r{and} (mod (- 0 4) 4) @result{} 0
19556(nthcdr (mod (- 0 4) 4)
19557 '("fourth line of text"
19558 "third line"
19559 "second piece of text"
19560 "first some text"))
19561@end group
19562@end smallexample
19563
19564@need 1250
19565When the first argument to the @code{current-kill} function is one,
19566the @code{nthcdr} expression returns the list without its first
19567element.
19568
19569@smallexample
19570@group
19571(nthcdr (mod (- 1 4) 4)
19572 '("fourth line of text"
19573 "third line"
19574 "second piece of text"
19575 "first some text"))
19576@end group
19577@end smallexample
19578
19579@cindex @samp{global variable} defined
19580@cindex @samp{variable, global}, defined
19581Incidentally, both @code{kill-ring} and @code{kill-ring-yank-pointer}
19582are @dfn{global variables}. That means that any expression in Emacs
19583Lisp can access them. They are not like the local variables set by
19584@code{let} or like the symbols in an argument list.
19585Local variables can only be accessed
19586within the @code{let} that defines them or the function that specifies
19587them in an argument list (and within expressions called by them).
19588
19589@ignore
19590@c texi2dvi fails when the name of the section is within ifnottex ...
19591(@xref{Prevent confusion, , @code{let} Prevents Confusion}, and
19592@ref{defun, , The @code{defun} Special Form}.)
19593@end ignore
19594
19595@node yank, yank-pop, current-kill, Kill Ring
19596@comment node-name, next, previous, up
19597@appendixsec @code{yank}
19598@findex yank
19599
19600After learning about @code{current-kill}, the code for the
19601@code{yank} function is almost easy.
19602
19603The @code{yank} function does not use the
19604@code{kill-ring-yank-pointer} variable directly. It calls
19605@code{insert-for-yank} which calls @code{current-kill} which sets the
19606@code{kill-ring-yank-pointer} variable.
19607
19608@need 1250
19609The code looks like this:
19610
19611@c in GNU Emacs 22
19612@smallexample
19613@group
19614(defun yank (&optional arg)
19615 "Reinsert (\"paste\") the last stretch of killed text.
19616More precisely, reinsert the stretch of killed text most recently
19617killed OR yanked. Put point at end, and set mark at beginning.
19618With just \\[universal-argument] as argument, same but put point at
19619beginning (and mark at end). With argument N, reinsert the Nth most
19620recently killed stretch of killed text.
19621
19622When this command inserts killed text into the buffer, it honors
19623`yank-excluded-properties' and `yank-handler' as described in the
19624doc string for `insert-for-yank-1', which see.
19625
19626See also the command \\[yank-pop]."
19627@end group
19628@group
19629 (interactive "*P")
19630 (setq yank-window-start (window-start))
19631 ;; If we don't get all the way thru, make last-command indicate that
19632 ;; for the following command.
19633 (setq this-command t)
19634 (push-mark (point))
19635@end group
19636@group
19637 (insert-for-yank (current-kill (cond
19638 ((listp arg) 0)
19639 ((eq arg '-) -2)
19640 (t (1- arg)))))
19641 (if (consp arg)
19642 ;; This is like exchange-point-and-mark,
19643 ;; but doesn't activate the mark.
19644 ;; It is cleaner to avoid activation, even though the command
19645 ;; loop would deactivate the mark because we inserted text.
19646 (goto-char (prog1 (mark t)
19647 (set-marker (mark-marker) (point) (current-buffer)))))
19648@end group
19649@group
19650 ;; If we do get all the way thru, make this-command indicate that.
19651 (if (eq this-command t)
19652 (setq this-command 'yank))
19653 nil)
19654@end group
19655@end smallexample
19656
19657The key expression is @code{insert-for-yank}, which inserts the string
19658returned by @code{current-kill}, but removes some text properties from
19659it.
19660
19661However, before getting to that expression, the function sets the value
19662of @code{yank-window-start} to the position returned by the
19663@code{(window-start)} expression, the position at which the display
19664currently starts. The @code{yank} function also sets
19665@code{this-command} and pushes the mark.
19666
19667After it yanks the appropriate element, if the optional argument is a
19668@sc{cons} rather than a number or nothing, it puts point at beginning
19669of the yanked text and mark at its end.
19670
19671(The @code{prog1} function is like @code{progn} but returns the value
19672of its first argument rather than the value of its last argument. Its
19673first argument is forced to return the buffer's mark as an integer.
19674You can see the documentation for these functions by placing point
19675over them in this buffer and then typing @kbd{C-h f}
19676(@code{describe-function}) followed by a @kbd{RET}; the default is the
19677function.)
19678
19679The last part of the function tells what to do when it succeeds.
19680
19681@node yank-pop, ring file, yank, Kill Ring
19682@comment node-name, next, previous, up
19683@appendixsec @code{yank-pop}
19684@findex yank-pop
19685
19686After understanding @code{yank} and @code{current-kill}, you know how
19687to approach the @code{yank-pop} function. Leaving out the
19688documentation to save space, it looks like this:
19689
19690@c GNU Emacs 22
19691@smallexample
19692@group
19693(defun yank-pop (&optional arg)
19694 "@dots{}"
19695 (interactive "*p")
19696 (if (not (eq last-command 'yank))
19697 (error "Previous command was not a yank"))
19698@end group
19699@group
19700 (setq this-command 'yank)
19701 (unless arg (setq arg 1))
19702 (let ((inhibit-read-only t)
19703 (before (< (point) (mark t))))
19704@end group
19705@group
19706 (if before
19707 (funcall (or yank-undo-function 'delete-region) (point) (mark t))
19708 (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
19709 (setq yank-undo-function nil)
19710@end group
19711@group
19712 (set-marker (mark-marker) (point) (current-buffer))
19713 (insert-for-yank (current-kill arg))
19714 ;; Set the window start back where it was in the yank command,
19715 ;; if possible.
19716 (set-window-start (selected-window) yank-window-start t)
19717@end group
19718@group
19719 (if before
19720 ;; This is like exchange-point-and-mark,
19721 ;; but doesn't activate the mark.
19722 ;; It is cleaner to avoid activation, even though the command
19723 ;; loop would deactivate the mark because we inserted text.
19724 (goto-char (prog1 (mark t)
19725 (set-marker (mark-marker)
19726 (point)
19727 (current-buffer))))))
19728 nil)
19729@end group
19730@end smallexample
19731
19732The function is interactive with a small @samp{p} so the prefix
19733argument is processed and passed to the function. The command can
19734only be used after a previous yank; otherwise an error message is
19735sent. This check uses the variable @code{last-command} which is set
19736by @code{yank} and is discussed elsewhere.
19737(@xref{copy-region-as-kill}.)
19738
19739The @code{let} clause sets the variable @code{before} to true or false
19740depending whether point is before or after mark and then the region
19741between point and mark is deleted. This is the region that was just
19742inserted by the previous yank and it is this text that will be
19743replaced.
19744
19745@code{funcall} calls its first argument as a function, passing
19746remaining arguments to it. The first argument is whatever the
19747@code{or} expression returns. The two remaining arguments are the
19748positions of point and mark set by the preceding @code{yank} command.
19749
19750There is more, but that is the hardest part.
19751
19752@node ring file, , yank-pop, Kill Ring
19753@comment node-name, next, previous, up
19754@appendixsec The @file{ring.el} File
19755@cindex @file{ring.el} file
19756
19757Interestingly, GNU Emacs posses a file called @file{ring.el} that
19758provides many of the features we just discussed. But functions such
19759as @code{kill-ring-yank-pointer} do not use this library, possibly
19760because they were written earlier.
19761
19762@node Full Graph, Free Software and Free Manuals, Kill Ring, Top
09e80d9f 19763@appendix A Graph with Labeled Axes
8cda6f8f
GM
19764
19765Printed axes help you understand a graph. They convey scale. In an
19766earlier chapter (@pxref{Readying a Graph, , Readying a Graph}), we
19767wrote the code to print the body of a graph. Here we write the code
09e80d9f 19768for printing and labeling vertical and horizontal axes, along with the
8cda6f8f
GM
19769body itself.
19770
19771@menu
09e80d9f 19772* Labeled Example::
8cda6f8f
GM
19773* print-graph Varlist:: @code{let} expression in @code{print-graph}.
19774* print-Y-axis:: Print a label for the vertical axis.
19775* print-X-axis:: Print a horizontal label.
19776* Print Whole Graph:: The function to print a complete graph.
19777@end menu
19778
09e80d9f 19779@node Labeled Example, print-graph Varlist, Full Graph, Full Graph
8cda6f8f 19780@ifnottex
09e80d9f 19781@unnumberedsec Labeled Example Graph
8cda6f8f
GM
19782@end ifnottex
19783
19784Since insertions fill a buffer to the right and below point, the new
19785graph printing function should first print the Y or vertical axis,
19786then the body of the graph, and finally the X or horizontal axis.
19787This sequence lays out for us the contents of the function:
19788
19789@enumerate
19790@item
19791Set up code.
19792
19793@item
19794Print Y axis.
19795
19796@item
19797Print body of graph.
19798
19799@item
19800Print X axis.
19801@end enumerate
19802
19803@need 800
19804Here is an example of how a finished graph should look:
19805
19806@smallexample
19807@group
19808 10 -
19809 *
19810 * *
19811 * **
19812 * ***
19813 5 - * *******
19814 * *** *******
19815 *************
19816 ***************
19817 1 - ****************
19818 | | | |
19819 1 5 10 15
19820@end group
19821@end smallexample
19822
19823@noindent
09e80d9f 19824In this graph, both the vertical and the horizontal axes are labeled
8cda6f8f 19825with numbers. However, in some graphs, the horizontal axis is time
09e80d9f 19826and would be better labeled with months, like this:
8cda6f8f
GM
19827
19828@smallexample
19829@group
19830 5 - *
19831 * ** *
19832 *******
19833 ********** **
19834 1 - **************
19835 | ^ |
19836 Jan June Jan
19837@end group
19838@end smallexample
19839
19840Indeed, with a little thought, we can easily come up with a variety of
09e80d9f 19841vertical and horizontal labeling schemes. Our task could become
8cda6f8f 19842complicated. But complications breed confusion. Rather than permit
09e80d9f 19843this, it is better choose a simple labeling scheme for our first
8cda6f8f
GM
19844effort, and to modify or replace it later.
19845
19846@need 1200
19847These considerations suggest the following outline for the
19848@code{print-graph} function:
19849
19850@smallexample
19851@group
19852(defun print-graph (numbers-list)
19853 "@var{documentation}@dots{}"
19854 (let ((height @dots{}
19855 @dots{}))
19856@end group
19857@group
19858 (print-Y-axis height @dots{} )
19859 (graph-body-print numbers-list)
19860 (print-X-axis @dots{} )))
19861@end group
19862@end smallexample
19863
19864We can work on each part of the @code{print-graph} function definition
19865in turn.
19866
09e80d9f 19867@node print-graph Varlist, print-Y-axis, Labeled Example, Full Graph
8cda6f8f
GM
19868@comment node-name, next, previous, up
19869@appendixsec The @code{print-graph} Varlist
19870@cindex @code{print-graph} varlist
19871
19872In writing the @code{print-graph} function, the first task is to write
19873the varlist in the @code{let} expression. (We will leave aside for the
19874moment any thoughts about making the function interactive or about the
19875contents of its documentation string.)
19876
19877The varlist should set several values. Clearly, the top of the label
19878for the vertical axis must be at least the height of the graph, which
19879means that we must obtain this information here. Note that the
19880@code{print-graph-body} function also requires this information. There
19881is no reason to calculate the height of the graph in two different
19882places, so we should change @code{print-graph-body} from the way we
19883defined it earlier to take advantage of the calculation.
19884
19885Similarly, both the function for printing the X axis labels and the
19886@code{print-graph-body} function need to learn the value of the width of
19887each symbol. We can perform the calculation here and change the
19888definition for @code{print-graph-body} from the way we defined it in the
19889previous chapter.
19890
19891The length of the label for the horizontal axis must be at least as long
19892as the graph. However, this information is used only in the function
19893that prints the horizontal axis, so it does not need to be calculated here.
19894
19895These thoughts lead us directly to the following form for the varlist
19896in the @code{let} for @code{print-graph}:
19897
19898@smallexample
19899@group
19900(let ((height (apply 'max numbers-list)) ; @r{First version.}
19901 (symbol-width (length graph-blank)))
19902@end group
19903@end smallexample
19904
19905@noindent
19906As we shall see, this expression is not quite right.
19907
19908@need 2000
19909@node print-Y-axis, print-X-axis, print-graph Varlist, Full Graph
19910@comment node-name, next, previous, up
19911@appendixsec The @code{print-Y-axis} Function
19912@cindex Axis, print vertical
19913@cindex Y axis printing
19914@cindex Vertical axis printing
19915@cindex Print vertical axis
19916
19917The job of the @code{print-Y-axis} function is to print a label for
19918the vertical axis that looks like this:
19919
19920@smallexample
19921@group
19922 10 -
19923
19924
19925
19926
19927 5 -
19928
19929
19930
19931 1 -
19932@end group
19933@end smallexample
19934
19935@noindent
19936The function should be passed the height of the graph, and then should
19937construct and insert the appropriate numbers and marks.
19938
19939@menu
19940* print-Y-axis in Detail::
19941* Height of label:: What height for the Y axis?
19942* Compute a Remainder:: How to compute the remainder of a division.
19943* Y Axis Element:: Construct a line for the Y axis.
19944* Y-axis-column:: Generate a list of Y axis labels.
19945* print-Y-axis Penultimate:: A not quite final version.
19946@end menu
19947
19948@node print-Y-axis in Detail, Height of label, print-Y-axis, print-Y-axis
19949@ifnottex
19950@unnumberedsubsec The @code{print-Y-axis} Function in Detail
19951@end ifnottex
19952
19953It is easy enough to see in the figure what the Y axis label should
19954look like; but to say in words, and then to write a function
19955definition to do the job is another matter. It is not quite true to
19956say that we want a number and a tic every five lines: there are only
19957three lines between the @samp{1} and the @samp{5} (lines 2, 3, and 4),
19958but four lines between the @samp{5} and the @samp{10} (lines 6, 7, 8,
19959and 9). It is better to say that we want a number and a tic mark on
19960the base line (number 1) and then that we want a number and a tic on
19961the fifth line from the bottom and on every line that is a multiple of
19962five.
19963
19964@node Height of label, Compute a Remainder, print-Y-axis in Detail, print-Y-axis
19965@ifnottex
19966@unnumberedsubsec What height should the label be?
19967@end ifnottex
19968
19969The next issue is what height the label should be? Suppose the maximum
19970height of tallest column of the graph is seven. Should the highest
19971label on the Y axis be @samp{5 -}, and should the graph stick up above
19972the label? Or should the highest label be @samp{7 -}, and mark the peak
19973of the graph? Or should the highest label be @code{10 -}, which is a
19974multiple of five, and be higher than the topmost value of the graph?
19975
19976The latter form is preferred. Most graphs are drawn within rectangles
19977whose sides are an integral number of steps long---5, 10, 15, and so
19978on for a step distance of five. But as soon as we decide to use a
19979step height for the vertical axis, we discover that the simple
19980expression in the varlist for computing the height is wrong. The
19981expression is @code{(apply 'max numbers-list)}. This returns the
19982precise height, not the maximum height plus whatever is necessary to
19983round up to the nearest multiple of five. A more complex expression
19984is required.
19985
19986As usual in cases like this, a complex problem becomes simpler if it is
19987divided into several smaller problems.
19988
19989First, consider the case when the highest value of the graph is an
19990integral multiple of five---when it is 5, 10, 15, or some higher
19991multiple of five. We can use this value as the Y axis height.
19992
19993A fairly simply way to determine whether a number is a multiple of
19994five is to divide it by five and see if the division results in a
19995remainder. If there is no remainder, the number is a multiple of
19996five. Thus, seven divided by five has a remainder of two, and seven
19997is not an integral multiple of five. Put in slightly different
19998language, more reminiscent of the classroom, five goes into seven
19999once, with a remainder of two. However, five goes into ten twice,
20000with no remainder: ten is an integral multiple of five.
20001
20002@node Compute a Remainder, Y Axis Element, Height of label, print-Y-axis
20003@appendixsubsec Side Trip: Compute a Remainder
20004
20005@findex % @r{(remainder function)}
20006@cindex Remainder function, @code{%}
20007In Lisp, the function for computing a remainder is @code{%}. The
20008function returns the remainder of its first argument divided by its
20009second argument. As it happens, @code{%} is a function in Emacs Lisp
20010that you cannot discover using @code{apropos}: you find nothing if you
20011type @kbd{M-x apropos @key{RET} remainder @key{RET}}. The only way to
20012learn of the existence of @code{%} is to read about it in a book such
20013as this or in the Emacs Lisp sources.
20014
20015You can try the @code{%} function by evaluating the following two
20016expressions:
20017
20018@smallexample
20019@group
20020(% 7 5)
20021
20022(% 10 5)
20023@end group
20024@end smallexample
20025
20026@noindent
20027The first expression returns 2 and the second expression returns 0.
20028
20029To test whether the returned value is zero or some other number, we
20030can use the @code{zerop} function. This function returns @code{t} if
20031its argument, which must be a number, is zero.
20032
20033@smallexample
20034@group
20035(zerop (% 7 5))
20036 @result{} nil
20037
20038(zerop (% 10 5))
20039 @result{} t
20040@end group
20041@end smallexample
20042
20043Thus, the following expression will return @code{t} if the height
20044of the graph is evenly divisible by five:
20045
20046@smallexample
20047(zerop (% height 5))
20048@end smallexample
20049
20050@noindent
20051(The value of @code{height}, of course, can be found from @code{(apply
20052'max numbers-list)}.)
20053
20054On the other hand, if the value of @code{height} is not a multiple of
20055five, we want to reset the value to the next higher multiple of five.
20056This is straightforward arithmetic using functions with which we are
20057already familiar. First, we divide the value of @code{height} by five
20058to determine how many times five goes into the number. Thus, five
20059goes into twelve twice. If we add one to this quotient and multiply by
20060five, we will obtain the value of the next multiple of five that is
20061larger than the height. Five goes into twelve twice. Add one to two,
20062and multiply by five; the result is fifteen, which is the next multiple
20063of five that is higher than twelve. The Lisp expression for this is:
20064
20065@smallexample
20066(* (1+ (/ height 5)) 5)
20067@end smallexample
20068
20069@noindent
20070For example, if you evaluate the following, the result is 15:
20071
20072@smallexample
20073(* (1+ (/ 12 5)) 5)
20074@end smallexample
20075
20076All through this discussion, we have been using `five' as the value
20077for spacing labels on the Y axis; but we may want to use some other
20078value. For generality, we should replace `five' with a variable to
20079which we can assign a value. The best name I can think of for this
20080variable is @code{Y-axis-label-spacing}.
20081
20082@need 1250
20083Using this term, and an @code{if} expression, we produce the
20084following:
20085
20086@smallexample
20087@group
20088(if (zerop (% height Y-axis-label-spacing))
20089 height
20090 ;; @r{else}
20091 (* (1+ (/ height Y-axis-label-spacing))
20092 Y-axis-label-spacing))
20093@end group
20094@end smallexample
20095
20096@noindent
20097This expression returns the value of @code{height} itself if the height
20098is an even multiple of the value of the @code{Y-axis-label-spacing} or
20099else it computes and returns a value of @code{height} that is equal to
20100the next higher multiple of the value of the @code{Y-axis-label-spacing}.
20101
20102We can now include this expression in the @code{let} expression of the
20103@code{print-graph} function (after first setting the value of
20104@code{Y-axis-label-spacing}):
20105@vindex Y-axis-label-spacing
20106
20107@smallexample
20108@group
20109(defvar Y-axis-label-spacing 5
20110 "Number of lines from one Y axis label to next.")
20111@end group
20112
20113@group
20114@dots{}
20115(let* ((height (apply 'max numbers-list))
20116 (height-of-top-line
20117 (if (zerop (% height Y-axis-label-spacing))
20118 height
20119@end group
20120@group
20121 ;; @r{else}
20122 (* (1+ (/ height Y-axis-label-spacing))
20123 Y-axis-label-spacing)))
20124 (symbol-width (length graph-blank))))
20125@dots{}
20126@end group
20127@end smallexample
20128
20129@noindent
20130(Note use of the @code{let*} function: the initial value of height is
20131computed once by the @code{(apply 'max numbers-list)} expression and
20132then the resulting value of @code{height} is used to compute its
20133final value. @xref{fwd-para let, , The @code{let*} expression}, for
20134more about @code{let*}.)
20135
20136@node Y Axis Element, Y-axis-column, Compute a Remainder, print-Y-axis
20137@appendixsubsec Construct a Y Axis Element
20138
20139When we print the vertical axis, we want to insert strings such as
20140@w{@samp{5 -}} and @w{@samp{10 - }} every five lines.
20141Moreover, we want the numbers and dashes to line up, so shorter
20142numbers must be padded with leading spaces. If some of the strings
20143use two digit numbers, the strings with single digit numbers must
20144include a leading blank space before the number.
20145
20146@findex number-to-string
20147To figure out the length of the number, the @code{length} function is
20148used. But the @code{length} function works only with a string, not with
20149a number. So the number has to be converted from being a number to
20150being a string. This is done with the @code{number-to-string} function.
20151For example,
20152
20153@smallexample
20154@group
20155(length (number-to-string 35))
20156 @result{} 2
20157
20158(length (number-to-string 100))
20159 @result{} 3
20160@end group
20161@end smallexample
20162
20163@noindent
20164(@code{number-to-string} is also called @code{int-to-string}; you will
20165see this alternative name in various sources.)
20166
20167In addition, in each label, each number is followed by a string such
20168as @w{@samp{ - }}, which we will call the @code{Y-axis-tic} marker.
20169This variable is defined with @code{defvar}:
20170
20171@vindex Y-axis-tic
20172@smallexample
20173@group
20174(defvar Y-axis-tic " - "
20175 "String that follows number in a Y axis label.")
20176@end group
20177@end smallexample
20178
20179The length of the Y label is the sum of the length of the Y axis tic
20180mark and the length of the number of the top of the graph.
20181
20182@smallexample
20183(length (concat (number-to-string height) Y-axis-tic)))
20184@end smallexample
20185
20186This value will be calculated by the @code{print-graph} function in
20187its varlist as @code{full-Y-label-width} and passed on. (Note that we
20188did not think to include this in the varlist when we first proposed it.)
20189
20190To make a complete vertical axis label, a tic mark is concatenated
20191with a number; and the two together may be preceded by one or more
20192spaces depending on how long the number is. The label consists of
20193three parts: the (optional) leading spaces, the number, and the tic
20194mark. The function is passed the value of the number for the specific
20195row, and the value of the width of the top line, which is calculated
20196(just once) by @code{print-graph}.
20197
20198@smallexample
20199@group
20200(defun Y-axis-element (number full-Y-label-width)
20201 "Construct a NUMBERed label element.
20202A numbered element looks like this ` 5 - ',
20203and is padded as needed so all line up with
20204the element for the largest number."
20205@end group
20206@group
20207 (let* ((leading-spaces
20208 (- full-Y-label-width
20209 (length
20210 (concat (number-to-string number)
20211 Y-axis-tic)))))
20212@end group
20213@group
20214 (concat
20215 (make-string leading-spaces ? )
20216 (number-to-string number)
20217 Y-axis-tic)))
20218@end group
20219@end smallexample
20220
20221The @code{Y-axis-element} function concatenates together the leading
20222spaces, if any; the number, as a string; and the tic mark.
20223
20224To figure out how many leading spaces the label will need, the
20225function subtracts the actual length of the label---the length of the
20226number plus the length of the tic mark---from the desired label width.
20227
20228@findex make-string
20229Blank spaces are inserted using the @code{make-string} function. This
20230function takes two arguments: the first tells it how long the string
20231will be and the second is a symbol for the character to insert, in a
20232special format. The format is a question mark followed by a blank
20233space, like this, @samp{? }. @xref{Character Type, , Character Type,
20234elisp, The GNU Emacs Lisp Reference Manual}, for a description of the
20235syntax for characters. (Of course, you might want to replace the
20236blank space by some other character @dots{} You know what to do.)
20237
20238The @code{number-to-string} function is used in the concatenation
20239expression, to convert the number to a string that is concatenated
20240with the leading spaces and the tic mark.
20241
20242@node Y-axis-column, print-Y-axis Penultimate, Y Axis Element, print-Y-axis
20243@appendixsubsec Create a Y Axis Column
20244
20245The preceding functions provide all the tools needed to construct a
20246function that generates a list of numbered and blank strings to insert
20247as the label for the vertical axis:
20248
20249@findex Y-axis-column
20250@smallexample
20251@group
20252(defun Y-axis-column (height width-of-label)
20253 "Construct list of Y axis labels and blank strings.
20254For HEIGHT of line above base and WIDTH-OF-LABEL."
20255 (let (Y-axis)
20256@group
20257@end group
20258 (while (> height 1)
20259 (if (zerop (% height Y-axis-label-spacing))
20260 ;; @r{Insert label.}
20261 (setq Y-axis
20262 (cons
20263 (Y-axis-element height width-of-label)
20264 Y-axis))
20265@group
20266@end group
20267 ;; @r{Else, insert blanks.}
20268 (setq Y-axis
20269 (cons
20270 (make-string width-of-label ? )
20271 Y-axis)))
20272 (setq height (1- height)))
20273 ;; @r{Insert base line.}
20274 (setq Y-axis
20275 (cons (Y-axis-element 1 width-of-label) Y-axis))
20276 (nreverse Y-axis)))
20277@end group
20278@end smallexample
20279
20280In this function, we start with the value of @code{height} and
20281repetitively subtract one from its value. After each subtraction, we
20282test to see whether the value is an integral multiple of the
20283@code{Y-axis-label-spacing}. If it is, we construct a numbered label
20284using the @code{Y-axis-element} function; if not, we construct a
20285blank label using the @code{make-string} function. The base line
20286consists of the number one followed by a tic mark.
20287
20288@need 2000
20289@node print-Y-axis Penultimate, , Y-axis-column, print-Y-axis
20290@appendixsubsec The Not Quite Final Version of @code{print-Y-axis}
20291
20292The list constructed by the @code{Y-axis-column} function is passed to
20293the @code{print-Y-axis} function, which inserts the list as a column.
20294
20295@findex print-Y-axis
20296@smallexample
20297@group
20298(defun print-Y-axis (height full-Y-label-width)
20299 "Insert Y axis using HEIGHT and FULL-Y-LABEL-WIDTH.
20300Height must be the maximum height of the graph.
20301Full width is the width of the highest label element."
20302;; Value of height and full-Y-label-width
20303;; are passed by `print-graph'.
20304@end group
20305@group
20306 (let ((start (point)))
20307 (insert-rectangle
20308 (Y-axis-column height full-Y-label-width))
20309 ;; @r{Place point ready for inserting graph.}
20310 (goto-char start)
20311 ;; @r{Move point forward by value of} full-Y-label-width
20312 (forward-char full-Y-label-width)))
20313@end group
20314@end smallexample
20315
20316The @code{print-Y-axis} uses the @code{insert-rectangle} function to
20317insert the Y axis labels created by the @code{Y-axis-column} function.
20318In addition, it places point at the correct position for printing the body of
20319the graph.
20320
20321You can test @code{print-Y-axis}:
20322
20323@enumerate
20324@item
20325Install
20326
20327@smallexample
20328@group
20329Y-axis-label-spacing
20330Y-axis-tic
20331Y-axis-element
20332Y-axis-column
20333print-Y-axis
20334@end group
20335@end smallexample
20336
20337@item
20338Copy the following expression:
20339
20340@smallexample
20341(print-Y-axis 12 5)
20342@end smallexample
20343
20344@item
20345Switch to the @file{*scratch*} buffer and place the cursor where you
20346want the axis labels to start.
20347
20348@item
20349Type @kbd{M-:} (@code{eval-expression}).
20350
20351@item
20352Yank the @code{graph-body-print} expression into the minibuffer
20353with @kbd{C-y} (@code{yank)}.
20354
20355@item
20356Press @key{RET} to evaluate the expression.
20357@end enumerate
20358
20359Emacs will print labels vertically, the top one being @w{@samp{10 -@w{
20360}}}. (The @code{print-graph} function will pass the value of
20361@code{height-of-top-line}, which in this case will end up as 15,
20362thereby getting rid of what might appear as a bug.)
20363
20364@need 2000
20365@node print-X-axis, Print Whole Graph, print-Y-axis, Full Graph
20366@appendixsec The @code{print-X-axis} Function
20367@cindex Axis, print horizontal
20368@cindex X axis printing
20369@cindex Print horizontal axis
20370@cindex Horizontal axis printing
20371
20372X axis labels are much like Y axis labels, except that the ticks are on a
20373line above the numbers. Labels should look like this:
20374
20375@smallexample
20376@group
20377 | | | |
20378 1 5 10 15
20379@end group
20380@end smallexample
20381
20382The first tic is under the first column of the graph and is preceded by
20383several blank spaces. These spaces provide room in rows above for the Y
20384axis labels. The second, third, fourth, and subsequent ticks are all
20385spaced equally, according to the value of @code{X-axis-label-spacing}.
20386
20387The second row of the X axis consists of numbers, preceded by several
20388blank spaces and also separated according to the value of the variable
20389@code{X-axis-label-spacing}.
20390
20391The value of the variable @code{X-axis-label-spacing} should itself be
20392measured in units of @code{symbol-width}, since you may want to change
20393the width of the symbols that you are using to print the body of the
09e80d9f 20394graph without changing the ways the graph is labeled.
8cda6f8f
GM
20395
20396@menu
20397* Similarities differences:: Much like @code{print-Y-axis}, but not exactly.
20398* X Axis Tic Marks:: Create tic marks for the horizontal axis.
20399@end menu
20400
20401@node Similarities differences, X Axis Tic Marks, print-X-axis, print-X-axis
20402@ifnottex
20403@unnumberedsubsec Similarities and differences
20404@end ifnottex
20405
20406The @code{print-X-axis} function is constructed in more or less the
20407same fashion as the @code{print-Y-axis} function except that it has
20408two lines: the line of tic marks and the numbers. We will write a
20409separate function to print each line and then combine them within the
20410@code{print-X-axis} function.
20411
20412This is a three step process:
20413
20414@enumerate
20415@item
20416Write a function to print the X axis tic marks, @code{print-X-axis-tic-line}.
20417
20418@item
20419Write a function to print the X numbers, @code{print-X-axis-numbered-line}.
20420
20421@item
20422Write a function to print both lines, the @code{print-X-axis} function,
20423using @code{print-X-axis-tic-line} and
20424@code{print-X-axis-numbered-line}.
20425@end enumerate
20426
20427@node X Axis Tic Marks, , Similarities differences, print-X-axis
20428@appendixsubsec X Axis Tic Marks
20429
20430The first function should print the X axis tic marks. We must specify
20431the tic marks themselves and their spacing:
20432
20433@smallexample
20434@group
20435(defvar X-axis-label-spacing
20436 (if (boundp 'graph-blank)
20437 (* 5 (length graph-blank)) 5)
20438 "Number of units from one X axis label to next.")
20439@end group
20440@end smallexample
20441
20442@noindent
20443(Note that the value of @code{graph-blank} is set by another
20444@code{defvar}. The @code{boundp} predicate checks whether it has
20445already been set; @code{boundp} returns @code{nil} if it has not. If
20446@code{graph-blank} were unbound and we did not use this conditional
20447construction, in a recent GNU Emacs, we would enter the debugger and
20448see an error message saying @samp{@w{Debugger entered--Lisp error:}
20449@w{(void-variable graph-blank)}}.)
20450
20451@need 1200
20452Here is the @code{defvar} for @code{X-axis-tic-symbol}:
20453
20454@smallexample
20455@group
20456(defvar X-axis-tic-symbol "|"
20457 "String to insert to point to a column in X axis.")
20458@end group
20459@end smallexample
20460
20461@need 1250
20462The goal is to make a line that looks like this:
20463
20464@smallexample
20465 | | | |
20466@end smallexample
20467
20468The first tic is indented so that it is under the first column, which is
20469indented to provide space for the Y axis labels.
20470
20471A tic element consists of the blank spaces that stretch from one tic to
20472the next plus a tic symbol. The number of blanks is determined by the
20473width of the tic symbol and the @code{X-axis-label-spacing}.
20474
20475@need 1250
20476The code looks like this:
20477
20478@smallexample
20479@group
20480;;; X-axis-tic-element
20481@dots{}
20482(concat
20483 (make-string
20484 ;; @r{Make a string of blanks.}
20485 (- (* symbol-width X-axis-label-spacing)
20486 (length X-axis-tic-symbol))
20487 ? )
20488 ;; @r{Concatenate blanks with tic symbol.}
20489 X-axis-tic-symbol)
20490@dots{}
20491@end group
20492@end smallexample
20493
20494Next, we determine how many blanks are needed to indent the first tic
20495mark to the first column of the graph. This uses the value of
20496@code{full-Y-label-width} passed it by the @code{print-graph} function.
20497
20498@need 1250
20499The code to make @code{X-axis-leading-spaces}
20500looks like this:
20501
20502@smallexample
20503@group
20504;; X-axis-leading-spaces
20505@dots{}
20506(make-string full-Y-label-width ? )
20507@dots{}
20508@end group
20509@end smallexample
20510
20511We also need to determine the length of the horizontal axis, which is
20512the length of the numbers list, and the number of ticks in the horizontal
20513axis:
20514
20515@smallexample
20516@group
20517;; X-length
20518@dots{}
20519(length numbers-list)
20520@end group
20521
20522@group
20523;; tic-width
20524@dots{}
20525(* symbol-width X-axis-label-spacing)
20526@end group
20527
20528@group
20529;; number-of-X-ticks
20530(if (zerop (% (X-length tic-width)))
20531 (/ (X-length tic-width))
20532 (1+ (/ (X-length tic-width))))
20533@end group
20534@end smallexample
20535
20536@need 1250
20537All this leads us directly to the function for printing the X axis tic line:
20538
20539@findex print-X-axis-tic-line
20540@smallexample
20541@group
20542(defun print-X-axis-tic-line
20543 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
20544 "Print ticks for X axis."
20545 (insert X-axis-leading-spaces)
20546 (insert X-axis-tic-symbol) ; @r{Under first column.}
20547@end group
20548@group
20549 ;; @r{Insert second tic in the right spot.}
20550 (insert (concat
20551 (make-string
20552 (- (* symbol-width X-axis-label-spacing)
20553 ;; @r{Insert white space up to second tic symbol.}
20554 (* 2 (length X-axis-tic-symbol)))
20555 ? )
20556 X-axis-tic-symbol))
20557@end group
20558@group
20559 ;; @r{Insert remaining ticks.}
20560 (while (> number-of-X-tics 1)
20561 (insert X-axis-tic-element)
20562 (setq number-of-X-tics (1- number-of-X-tics))))
20563@end group
20564@end smallexample
20565
20566The line of numbers is equally straightforward:
20567
20568@need 1250
20569First, we create a numbered element with blank spaces before each number:
20570
20571@findex X-axis-element
20572@smallexample
20573@group
20574(defun X-axis-element (number)
20575 "Construct a numbered X axis element."
20576 (let ((leading-spaces
20577 (- (* symbol-width X-axis-label-spacing)
20578 (length (number-to-string number)))))
20579 (concat (make-string leading-spaces ? )
20580 (number-to-string number))))
20581@end group
20582@end smallexample
20583
20584Next, we create the function to print the numbered line, starting with
20585the number ``1'' under the first column:
20586
20587@findex print-X-axis-numbered-line
20588@smallexample
20589@group
20590(defun print-X-axis-numbered-line
20591 (number-of-X-tics X-axis-leading-spaces)
20592 "Print line of X-axis numbers"
20593 (let ((number X-axis-label-spacing))
20594 (insert X-axis-leading-spaces)
20595 (insert "1")
20596@end group
20597@group
20598 (insert (concat
20599 (make-string
20600 ;; @r{Insert white space up to next number.}
20601 (- (* symbol-width X-axis-label-spacing) 2)
20602 ? )
20603 (number-to-string number)))
20604@end group
20605@group
20606 ;; @r{Insert remaining numbers.}
20607 (setq number (+ number X-axis-label-spacing))
20608 (while (> number-of-X-tics 1)
20609 (insert (X-axis-element number))
20610 (setq number (+ number X-axis-label-spacing))
20611 (setq number-of-X-tics (1- number-of-X-tics)))))
20612@end group
20613@end smallexample
20614
20615Finally, we need to write the @code{print-X-axis} that uses
20616@code{print-X-axis-tic-line} and
20617@code{print-X-axis-numbered-line}.
20618
20619The function must determine the local values of the variables used by both
20620@code{print-X-axis-tic-line} and @code{print-X-axis-numbered-line}, and
20621then it must call them. Also, it must print the carriage return that
20622separates the two lines.
20623
20624The function consists of a varlist that specifies five local variables,
20625and calls to each of the two line printing functions:
20626
20627@findex print-X-axis
20628@smallexample
20629@group
20630(defun print-X-axis (numbers-list)
20631 "Print X axis labels to length of NUMBERS-LIST."
20632 (let* ((leading-spaces
20633 (make-string full-Y-label-width ? ))
20634@end group
20635@group
20636 ;; symbol-width @r{is provided by} graph-body-print
20637 (tic-width (* symbol-width X-axis-label-spacing))
20638 (X-length (length numbers-list))
20639@end group
20640@group
20641 (X-tic
20642 (concat
20643 (make-string
20644@end group
20645@group
20646 ;; @r{Make a string of blanks.}
20647 (- (* symbol-width X-axis-label-spacing)
20648 (length X-axis-tic-symbol))
20649 ? )
20650@end group
20651@group
20652 ;; @r{Concatenate blanks with tic symbol.}
20653 X-axis-tic-symbol))
20654@end group
20655@group
20656 (tic-number
20657 (if (zerop (% X-length tic-width))
20658 (/ X-length tic-width)
20659 (1+ (/ X-length tic-width)))))
20660@end group
20661@group
20662 (print-X-axis-tic-line tic-number leading-spaces X-tic)
20663 (insert "\n")
20664 (print-X-axis-numbered-line tic-number leading-spaces)))
20665@end group
20666@end smallexample
20667
20668@need 1250
20669You can test @code{print-X-axis}:
20670
20671@enumerate
20672@item
20673Install @code{X-axis-tic-symbol}, @code{X-axis-label-spacing},
20674@code{print-X-axis-tic-line}, as well as @code{X-axis-element},
20675@code{print-X-axis-numbered-line}, and @code{print-X-axis}.
20676
20677@item
20678Copy the following expression:
20679
20680@smallexample
20681@group
20682(progn
20683 (let ((full-Y-label-width 5)
20684 (symbol-width 1))
20685 (print-X-axis
20686 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
20687@end group
20688@end smallexample
20689
20690@item
20691Switch to the @file{*scratch*} buffer and place the cursor where you
20692want the axis labels to start.
20693
20694@item
20695Type @kbd{M-:} (@code{eval-expression}).
20696
20697@item
20698Yank the test expression into the minibuffer
20699with @kbd{C-y} (@code{yank)}.
20700
20701@item
20702Press @key{RET} to evaluate the expression.
20703@end enumerate
20704
20705@need 1250
20706Emacs will print the horizontal axis like this:
20707@sp 1
20708
20709@smallexample
20710@group
20711 | | | | |
20712 1 5 10 15 20
20713@end group
20714@end smallexample
20715
20716@node Print Whole Graph, , print-X-axis, Full Graph
20717@appendixsec Printing the Whole Graph
20718@cindex Printing the whole graph
20719@cindex Whole graph printing
20720@cindex Graph, printing all
20721
20722Now we are nearly ready to print the whole graph.
20723
20724The function to print the graph with the proper labels follows the
09e80d9f 20725outline we created earlier (@pxref{Full Graph, , A Graph with Labeled
8cda6f8f
GM
20726Axes}), but with additions.
20727
20728@need 1250
20729Here is the outline:
20730
20731@smallexample
20732@group
20733(defun print-graph (numbers-list)
20734 "@var{documentation}@dots{}"
20735 (let ((height @dots{}
20736 @dots{}))
20737@end group
20738@group
20739 (print-Y-axis height @dots{} )
20740 (graph-body-print numbers-list)
20741 (print-X-axis @dots{} )))
20742@end group
20743@end smallexample
20744
20745@menu
20746* The final version:: A few changes.
20747* Test print-graph:: Run a short test.
20748* Graphing words in defuns:: Executing the final code.
20749* lambda:: How to write an anonymous function.
20750* mapcar:: Apply a function to elements of a list.
20751* Another Bug:: Yet another bug @dots{} most insidious.
20752* Final printed graph:: The graph itself!
20753@end menu
20754
20755@node The final version, Test print-graph, Print Whole Graph, Print Whole Graph
20756@ifnottex
20757@unnumberedsubsec Changes for the Final Version
20758@end ifnottex
20759
20760The final version is different from what we planned in two ways:
20761first, it contains additional values calculated once in the varlist;
20762second, it carries an option to specify the labels' increment per row.
20763This latter feature turns out to be essential; otherwise, a graph may
20764have more rows than fit on a display or on a sheet of paper.
20765
20766@need 1500
20767This new feature requires a change to the @code{Y-axis-column}
20768function, to add @code{vertical-step} to it. The function looks like
20769this:
20770
20771@findex Y-axis-column @r{Final version.}
20772@smallexample
20773@group
20774;;; @r{Final version.}
20775(defun Y-axis-column
20776 (height width-of-label &optional vertical-step)
20777 "Construct list of labels for Y axis.
20778HEIGHT is maximum height of graph.
20779WIDTH-OF-LABEL is maximum width of label.
20780VERTICAL-STEP, an option, is a positive integer
20781that specifies how much a Y axis label increments
20782for each line. For example, a step of 5 means
20783that each line is five units of the graph."
20784@end group
20785@group
20786 (let (Y-axis
20787 (number-per-line (or vertical-step 1)))
20788 (while (> height 1)
20789 (if (zerop (% height Y-axis-label-spacing))
20790@end group
20791@group
20792 ;; @r{Insert label.}
20793 (setq Y-axis
20794 (cons
20795 (Y-axis-element
20796 (* height number-per-line)
20797 width-of-label)
20798 Y-axis))
20799@end group
20800@group
20801 ;; @r{Else, insert blanks.}
20802 (setq Y-axis
20803 (cons
20804 (make-string width-of-label ? )
20805 Y-axis)))
20806 (setq height (1- height)))
20807@end group
20808@group
20809 ;; @r{Insert base line.}
20810 (setq Y-axis (cons (Y-axis-element
20811 (or vertical-step 1)
20812 width-of-label)
20813 Y-axis))
20814 (nreverse Y-axis)))
20815@end group
20816@end smallexample
20817
20818The values for the maximum height of graph and the width of a symbol
20819are computed by @code{print-graph} in its @code{let} expression; so
20820@code{graph-body-print} must be changed to accept them.
20821
20822@findex graph-body-print @r{Final version.}
20823@smallexample
20824@group
20825;;; @r{Final version.}
20826(defun graph-body-print (numbers-list height symbol-width)
20827 "Print a bar graph of the NUMBERS-LIST.
20828The numbers-list consists of the Y-axis values.
20829HEIGHT is maximum height of graph.
20830SYMBOL-WIDTH is number of each column."
20831@end group
20832@group
20833 (let (from-position)
20834 (while numbers-list
20835 (setq from-position (point))
20836 (insert-rectangle
20837 (column-of-graph height (car numbers-list)))
20838 (goto-char from-position)
20839 (forward-char symbol-width)
20840@end group
20841@group
20842 ;; @r{Draw graph column by column.}
20843 (sit-for 0)
20844 (setq numbers-list (cdr numbers-list)))
20845 ;; @r{Place point for X axis labels.}
20846 (forward-line height)
20847 (insert "\n")))
20848@end group
20849@end smallexample
20850
20851@need 1250
20852Finally, the code for the @code{print-graph} function:
20853
20854@findex print-graph @r{Final version.}
20855@smallexample
20856@group
20857;;; @r{Final version.}
20858(defun print-graph
20859 (numbers-list &optional vertical-step)
09e80d9f 20860 "Print labeled bar graph of the NUMBERS-LIST.
8cda6f8f
GM
20861The numbers-list consists of the Y-axis values.
20862@end group
20863
20864@group
20865Optionally, VERTICAL-STEP, a positive integer,
20866specifies how much a Y axis label increments for
20867each line. For example, a step of 5 means that
20868each row is five units."
20869@end group
20870@group
20871 (let* ((symbol-width (length graph-blank))
20872 ;; @code{height} @r{is both the largest number}
20873 ;; @r{and the number with the most digits.}
20874 (height (apply 'max numbers-list))
20875@end group
20876@group
20877 (height-of-top-line
20878 (if (zerop (% height Y-axis-label-spacing))
20879 height
20880 ;; @r{else}
20881 (* (1+ (/ height Y-axis-label-spacing))
20882 Y-axis-label-spacing)))
20883@end group
20884@group
20885 (vertical-step (or vertical-step 1))
20886 (full-Y-label-width
20887 (length
20888@end group
20889@group
20890 (concat
20891 (number-to-string
20892 (* height-of-top-line vertical-step))
20893 Y-axis-tic))))
20894@end group
20895
20896@group
20897 (print-Y-axis
20898 height-of-top-line full-Y-label-width vertical-step)
20899@end group
20900@group
20901 (graph-body-print
20902 numbers-list height-of-top-line symbol-width)
20903 (print-X-axis numbers-list)))
20904@end group
20905@end smallexample
20906
20907@node Test print-graph, Graphing words in defuns, The final version, Print Whole Graph
20908@appendixsubsec Testing @code{print-graph}
20909
20910@need 1250
20911We can test the @code{print-graph} function with a short list of numbers:
20912
20913@enumerate
20914@item
20915Install the final versions of @code{Y-axis-column},
20916@code{graph-body-print}, and @code{print-graph} (in addition to the
20917rest of the code.)
20918
20919@item
20920Copy the following expression:
20921
20922@smallexample
20923(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
20924@end smallexample
20925
20926@item
20927Switch to the @file{*scratch*} buffer and place the cursor where you
20928want the axis labels to start.
20929
20930@item
20931Type @kbd{M-:} (@code{eval-expression}).
20932
20933@item
20934Yank the test expression into the minibuffer
20935with @kbd{C-y} (@code{yank)}.
20936
20937@item
20938Press @key{RET} to evaluate the expression.
20939@end enumerate
20940
20941@need 1250
20942Emacs will print a graph that looks like this:
20943
20944@smallexample
20945@group
2094610 -
20947
20948
20949 *
20950 ** *
20951 5 - **** *
20952 **** ***
20953 * *********
20954 ************
20955 1 - *************
20956
20957 | | | |
20958 1 5 10 15
20959@end group
20960@end smallexample
20961
20962@need 1200
20963On the other hand, if you pass @code{print-graph} a
20964@code{vertical-step} value of 2, by evaluating this expression:
20965
20966@smallexample
20967(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
20968@end smallexample
20969
20970@need 1250
20971@noindent
20972The graph looks like this:
20973
20974@smallexample
20975@group
2097620 -
20977
20978
20979 *
20980 ** *
2098110 - **** *
20982 **** ***
20983 * *********
20984 ************
20985 2 - *************
20986
20987 | | | |
20988 1 5 10 15
20989@end group
20990@end smallexample
20991
20992@noindent
20993(A question: is the `2' on the bottom of the vertical axis a bug or a
20994feature? If you think it is a bug, and should be a `1' instead, (or
20995even a `0'), you can modify the sources.)
20996
20997@node Graphing words in defuns, lambda, Test print-graph, Print Whole Graph
20998@appendixsubsec Graphing Numbers of Words and Symbols
20999
21000Now for the graph for which all this code was written: a graph that
21001shows how many function definitions contain fewer than 10 words and
21002symbols, how many contain between 10 and 19 words and symbols, how
21003many contain between 20 and 29 words and symbols, and so on.
21004
21005This is a multi-step process. First make sure you have loaded all the
21006requisite code.
21007
21008@need 1500
21009It is a good idea to reset the value of @code{top-of-ranges} in case
21010you have set it to some different value. You can evaluate the
21011following:
21012
21013@smallexample
21014@group
21015(setq top-of-ranges
21016 '(10 20 30 40 50
21017 60 70 80 90 100
21018 110 120 130 140 150
21019 160 170 180 190 200
21020 210 220 230 240 250
21021 260 270 280 290 300)
21022@end group
21023@end smallexample
21024
21025@noindent
21026Next create a list of the number of words and symbols in each range.
21027
21028@need 1500
21029@noindent
21030Evaluate the following:
21031
21032@smallexample
21033@group
21034(setq list-for-graph
21035 (defuns-per-range
21036 (sort
21037 (recursive-lengths-list-many-files
21038 (directory-files "/usr/local/emacs/lisp"
21039 t ".+el$"))
21040 '<)
21041 top-of-ranges))
21042@end group
21043@end smallexample
21044
21045@noindent
21046On my old machine, this took about an hour. It looked though 303 Lisp
21047files in my copy of Emacs version 19.23. After all that computing,
21048the @code{list-for-graph} had this value:
21049
21050@smallexample
21051@group
21052(537 1027 955 785 594 483 349 292 224 199 166 120 116 99
2105390 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
21054@end group
21055@end smallexample
21056
21057@noindent
21058This means that my copy of Emacs had 537 function definitions with
21059fewer than 10 words or symbols in them, 1,027 function definitions
21060with 10 to 19 words or symbols in them, 955 function definitions with
2106120 to 29 words or symbols in them, and so on.
21062
21063Clearly, just by looking at this list we can see that most function
21064definitions contain ten to thirty words and symbols.
21065
21066Now for printing. We do @emph{not} want to print a graph that is
210671,030 lines high @dots{} Instead, we should print a graph that is
21068fewer than twenty-five lines high. A graph that height can be
21069displayed on almost any monitor, and easily printed on a sheet of paper.
21070
21071This means that each value in @code{list-for-graph} must be reduced to
21072one-fiftieth its present value.
21073
21074Here is a short function to do just that, using two functions we have
21075not yet seen, @code{mapcar} and @code{lambda}.
21076
21077@smallexample
21078@group
21079(defun one-fiftieth (full-range)
21080 "Return list, each number one-fiftieth of previous."
21081 (mapcar '(lambda (arg) (/ arg 50)) full-range))
21082@end group
21083@end smallexample
21084
21085@node lambda, mapcar, Graphing words in defuns, Print Whole Graph
21086@appendixsubsec A @code{lambda} Expression: Useful Anonymity
21087@cindex Anonymous function
21088@findex lambda
21089
21090@code{lambda} is the symbol for an anonymous function, a function
21091without a name. Every time you use an anonymous function, you need to
21092include its whole body.
21093
21094@need 1250
21095@noindent
21096Thus,
21097
21098@smallexample
21099(lambda (arg) (/ arg 50))
21100@end smallexample
21101
21102@noindent
21103is a function definition that says `return the value resulting from
21104dividing whatever is passed to me as @code{arg} by 50'.
21105
21106@need 1200
21107Earlier, for example, we had a function @code{multiply-by-seven}; it
21108multiplied its argument by 7. This function is similar, except it
21109divides its argument by 50; and, it has no name. The anonymous
21110equivalent of @code{multiply-by-seven} is:
21111
21112@smallexample
21113(lambda (number) (* 7 number))
21114@end smallexample
21115
21116@noindent
21117(@xref{defun, , The @code{defun} Special Form}.)
21118
21119@need 1250
21120@noindent
21121If we want to multiply 3 by 7, we can write:
21122
21123@c !!! Clear print-postscript-figures if the computer formatting this
21124@c document is too small and cannot handle all the diagrams and figures.
21125@c clear print-postscript-figures
21126@c set print-postscript-figures
21127@c lambda example diagram #1
21128@ifnottex
21129@smallexample
21130@group
21131(multiply-by-seven 3)
21132 \_______________/ ^
21133 | |
21134 function argument
21135@end group
21136@end smallexample
21137@end ifnottex
21138@ifset print-postscript-figures
21139@sp 1
21140@tex
21141@center @image{lambda-1}
21142%%%% old method of including an image
21143% \input /usr/local/lib/tex/inputs/psfig.tex
21144% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-1.eps}}
21145% \catcode`\@=0 %
21146@end tex
21147@sp 1
21148@end ifset
21149@ifclear print-postscript-figures
21150@iftex
21151@smallexample
21152@group
21153(multiply-by-seven 3)
21154 \_______________/ ^
21155 | |
21156 function argument
21157@end group
21158@end smallexample
21159@end iftex
21160@end ifclear
21161
21162@noindent
21163This expression returns 21.
21164
21165@need 1250
21166@noindent
21167Similarly, we can write:
21168
21169@c lambda example diagram #2
21170@ifnottex
21171@smallexample
21172@group
21173((lambda (number) (* 7 number)) 3)
21174 \____________________________/ ^
21175 | |
21176 anonymous function argument
21177@end group
21178@end smallexample
21179@end ifnottex
21180@ifset print-postscript-figures
21181@sp 1
21182@tex
21183@center @image{lambda-2}
21184%%%% old method of including an image
21185% \input /usr/local/lib/tex/inputs/psfig.tex
21186% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-2.eps}}
21187% \catcode`\@=0 %
21188@end tex
21189@sp 1
21190@end ifset
21191@ifclear print-postscript-figures
21192@iftex
21193@smallexample
21194@group
21195((lambda (number) (* 7 number)) 3)
21196 \____________________________/ ^
21197 | |
21198 anonymous function argument
21199@end group
21200@end smallexample
21201@end iftex
21202@end ifclear
21203
21204@need 1250
21205@noindent
21206If we want to divide 100 by 50, we can write:
21207
21208@c lambda example diagram #3
21209@ifnottex
21210@smallexample
21211@group
21212((lambda (arg) (/ arg 50)) 100)
21213 \______________________/ \_/
21214 | |
21215 anonymous function argument
21216@end group
21217@end smallexample
21218@end ifnottex
21219@ifset print-postscript-figures
21220@sp 1
21221@tex
21222@center @image{lambda-3}
21223%%%% old method of including an image
21224% \input /usr/local/lib/tex/inputs/psfig.tex
21225% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-3.eps}}
21226% \catcode`\@=0 %
21227@end tex
21228@sp 1
21229@end ifset
21230@ifclear print-postscript-figures
21231@iftex
21232@smallexample
21233@group
21234((lambda (arg) (/ arg 50)) 100)
21235 \______________________/ \_/
21236 | |
21237 anonymous function argument
21238@end group
21239@end smallexample
21240@end iftex
21241@end ifclear
21242
21243@noindent
21244This expression returns 2. The 100 is passed to the function, which
21245divides that number by 50.
21246
21247@xref{Lambda Expressions, , Lambda Expressions, elisp, The GNU Emacs
21248Lisp Reference Manual}, for more about @code{lambda}. Lisp and lambda
21249expressions derive from the Lambda Calculus.
21250
21251@node mapcar, Another Bug, lambda, Print Whole Graph
21252@appendixsubsec The @code{mapcar} Function
21253@findex mapcar
21254
21255@code{mapcar} is a function that calls its first argument with each
21256element of its second argument, in turn. The second argument must be
21257a sequence.
21258
21259The @samp{map} part of the name comes from the mathematical phrase,
21260`mapping over a domain', meaning to apply a function to each of the
21261elements in a domain. The mathematical phrase is based on the
21262metaphor of a surveyor walking, one step at a time, over an area he is
21263mapping. And @samp{car}, of course, comes from the Lisp notion of the
21264first of a list.
21265
21266@need 1250
21267@noindent
21268For example,
21269
21270@smallexample
21271@group
21272(mapcar '1+ '(2 4 6))
21273 @result{} (3 5 7)
21274@end group
21275@end smallexample
21276
21277@noindent
21278The function @code{1+} which adds one to its argument, is executed on
21279@emph{each} element of the list, and a new list is returned.
21280
21281Contrast this with @code{apply}, which applies its first argument to
21282all the remaining.
21283(@xref{Readying a Graph, , Readying a Graph}, for a explanation of
21284@code{apply}.)
21285
21286@need 1250
21287In the definition of @code{one-fiftieth}, the first argument is the
21288anonymous function:
21289
21290@smallexample
21291(lambda (arg) (/ arg 50))
21292@end smallexample
21293
21294@noindent
21295and the second argument is @code{full-range}, which will be bound to
21296@code{list-for-graph}.
21297
21298@need 1250
21299The whole expression looks like this:
21300
21301@smallexample
21302(mapcar '(lambda (arg) (/ arg 50)) full-range))
21303@end smallexample
21304
21305@xref{Mapping Functions, , Mapping Functions, elisp, The GNU Emacs
21306Lisp Reference Manual}, for more about @code{mapcar}.
21307
21308Using the @code{one-fiftieth} function, we can generate a list in
21309which each element is one-fiftieth the size of the corresponding
21310element in @code{list-for-graph}.
21311
21312@smallexample
21313@group
21314(setq fiftieth-list-for-graph
21315 (one-fiftieth list-for-graph))
21316@end group
21317@end smallexample
21318
21319@need 1250
21320The resulting list looks like this:
21321
21322@smallexample
21323@group
21324(10 20 19 15 11 9 6 5 4 3 3 2 2
213251 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
21326@end group
21327@end smallexample
21328
21329@noindent
21330This, we are almost ready to print! (We also notice the loss of
21331information: many of the higher ranges are 0, meaning that fewer than
2133250 defuns had that many words or symbols---but not necessarily meaning
21333that none had that many words or symbols.)
21334
21335@node Another Bug, Final printed graph, mapcar, Print Whole Graph
21336@appendixsubsec Another Bug @dots{} Most Insidious
21337@cindex Bug, most insidious type
21338@cindex Insidious type of bug
21339
21340I said `almost ready to print'! Of course, there is a bug in the
21341@code{print-graph} function @dots{} It has a @code{vertical-step}
21342option, but not a @code{horizontal-step} option. The
21343@code{top-of-range} scale goes from 10 to 300 by tens. But the
21344@code{print-graph} function will print only by ones.
21345
21346This is a classic example of what some consider the most insidious
21347type of bug, the bug of omission. This is not the kind of bug you can
21348find by studying the code, for it is not in the code; it is an omitted
21349feature. Your best actions are to try your program early and often;
21350and try to arrange, as much as you can, to write code that is easy to
21351understand and easy to change. Try to be aware, whenever you can,
21352that whatever you have written, @emph{will} be rewritten, if not soon,
21353eventually. A hard maxim to follow.
21354
21355It is the @code{print-X-axis-numbered-line} function that needs the
21356work; and then the @code{print-X-axis} and the @code{print-graph}
21357functions need to be adapted. Not much needs to be done; there is one
21358nicety: the numbers ought to line up under the tic marks. This takes
21359a little thought.
21360
21361@need 1250
21362Here is the corrected @code{print-X-axis-numbered-line}:
21363
21364@smallexample
21365@group
21366(defun print-X-axis-numbered-line
21367 (number-of-X-tics X-axis-leading-spaces
21368 &optional horizontal-step)
21369 "Print line of X-axis numbers"
21370 (let ((number X-axis-label-spacing)
21371 (horizontal-step (or horizontal-step 1)))
21372@end group
21373@group
21374 (insert X-axis-leading-spaces)
21375 ;; @r{Delete extra leading spaces.}
21376 (delete-char
21377 (- (1-
21378 (length (number-to-string horizontal-step)))))
21379 (insert (concat
21380 (make-string
21381@end group
21382@group
21383 ;; @r{Insert white space.}
21384 (- (* symbol-width
21385 X-axis-label-spacing)
21386 (1-
21387 (length
21388 (number-to-string horizontal-step)))
21389 2)
21390 ? )
21391 (number-to-string
21392 (* number horizontal-step))))
21393@end group
21394@group
21395 ;; @r{Insert remaining numbers.}
21396 (setq number (+ number X-axis-label-spacing))
21397 (while (> number-of-X-tics 1)
21398 (insert (X-axis-element
21399 (* number horizontal-step)))
21400 (setq number (+ number X-axis-label-spacing))
21401 (setq number-of-X-tics (1- number-of-X-tics)))))
21402@end group
21403@end smallexample
21404
21405@need 1500
21406If you are reading this in Info, you can see the new versions of
21407@code{print-X-axis} @code{print-graph} and evaluate them. If you are
21408reading this in a printed book, you can see the changed lines here
21409(the full text is too much to print).
21410
21411@iftex
21412@smallexample
21413@group
21414(defun print-X-axis (numbers-list horizontal-step)
21415 @dots{}
21416 (print-X-axis-numbered-line
21417 tic-number leading-spaces horizontal-step))
21418@end group
21419@end smallexample
21420
21421@smallexample
21422@group
21423(defun print-graph
21424 (numbers-list
21425 &optional vertical-step horizontal-step)
21426 @dots{}
21427 (print-X-axis numbers-list horizontal-step))
21428@end group
21429@end smallexample
21430@end iftex
21431
21432@ifnottex
21433@smallexample
21434@group
21435(defun print-X-axis (numbers-list horizontal-step)
21436 "Print X axis labels to length of NUMBERS-LIST.
21437Optionally, HORIZONTAL-STEP, a positive integer,
21438specifies how much an X axis label increments for
21439each column."
21440@end group
21441@group
21442;; Value of symbol-width and full-Y-label-width
21443;; are passed by `print-graph'.
21444 (let* ((leading-spaces
21445 (make-string full-Y-label-width ? ))
21446 ;; symbol-width @r{is provided by} graph-body-print
21447 (tic-width (* symbol-width X-axis-label-spacing))
21448 (X-length (length numbers-list))
21449@end group
21450@group
21451 (X-tic
21452 (concat
21453 (make-string
21454 ;; @r{Make a string of blanks.}
21455 (- (* symbol-width X-axis-label-spacing)
21456 (length X-axis-tic-symbol))
21457 ? )
21458@end group
21459@group
21460 ;; @r{Concatenate blanks with tic symbol.}
21461 X-axis-tic-symbol))
21462 (tic-number
21463 (if (zerop (% X-length tic-width))
21464 (/ X-length tic-width)
21465 (1+ (/ X-length tic-width)))))
21466@end group
21467
21468@group
21469 (print-X-axis-tic-line
21470 tic-number leading-spaces X-tic)
21471 (insert "\n")
21472 (print-X-axis-numbered-line
21473 tic-number leading-spaces horizontal-step)))
21474@end group
21475@end smallexample
21476
21477@smallexample
21478@group
21479(defun print-graph
21480 (numbers-list &optional vertical-step horizontal-step)
09e80d9f 21481 "Print labeled bar graph of the NUMBERS-LIST.
8cda6f8f
GM
21482The numbers-list consists of the Y-axis values.
21483@end group
21484
21485@group
21486Optionally, VERTICAL-STEP, a positive integer,
21487specifies how much a Y axis label increments for
21488each line. For example, a step of 5 means that
21489each row is five units.
21490@end group
21491
21492@group
21493Optionally, HORIZONTAL-STEP, a positive integer,
21494specifies how much an X axis label increments for
21495each column."
21496 (let* ((symbol-width (length graph-blank))
21497 ;; @code{height} @r{is both the largest number}
21498 ;; @r{and the number with the most digits.}
21499 (height (apply 'max numbers-list))
21500@end group
21501@group
21502 (height-of-top-line
21503 (if (zerop (% height Y-axis-label-spacing))
21504 height
21505 ;; @r{else}
21506 (* (1+ (/ height Y-axis-label-spacing))
21507 Y-axis-label-spacing)))
21508@end group
21509@group
21510 (vertical-step (or vertical-step 1))
21511 (full-Y-label-width
21512 (length
21513 (concat
21514 (number-to-string
21515 (* height-of-top-line vertical-step))
21516 Y-axis-tic))))
21517@end group
21518@group
21519 (print-Y-axis
21520 height-of-top-line full-Y-label-width vertical-step)
21521 (graph-body-print
21522 numbers-list height-of-top-line symbol-width)
21523 (print-X-axis numbers-list horizontal-step)))
21524@end group
21525@end smallexample
21526@end ifnottex
21527
21528@c qqq
21529@ignore
21530Graphing Definitions Re-listed
21531
21532@need 1250
21533Here are all the graphing definitions in their final form:
21534
21535@smallexample
21536@group
21537(defvar top-of-ranges
21538 '(10 20 30 40 50
21539 60 70 80 90 100
21540 110 120 130 140 150
21541 160 170 180 190 200
21542 210 220 230 240 250)
21543 "List specifying ranges for `defuns-per-range'.")
21544@end group
21545
21546@group
21547(defvar graph-symbol "*"
21548 "String used as symbol in graph, usually an asterisk.")
21549@end group
21550
21551@group
21552(defvar graph-blank " "
21553 "String used as blank in graph, usually a blank space.
21554graph-blank must be the same number of columns wide
21555as graph-symbol.")
21556@end group
21557
21558@group
21559(defvar Y-axis-tic " - "
21560 "String that follows number in a Y axis label.")
21561@end group
21562
21563@group
21564(defvar Y-axis-label-spacing 5
21565 "Number of lines from one Y axis label to next.")
21566@end group
21567
21568@group
21569(defvar X-axis-tic-symbol "|"
21570 "String to insert to point to a column in X axis.")
21571@end group
21572
21573@group
21574(defvar X-axis-label-spacing
21575 (if (boundp 'graph-blank)
21576 (* 5 (length graph-blank)) 5)
21577 "Number of units from one X axis label to next.")
21578@end group
21579@end smallexample
21580
21581@smallexample
21582@group
21583(defun count-words-in-defun ()
21584 "Return the number of words and symbols in a defun."
21585 (beginning-of-defun)
21586 (let ((count 0)
21587 (end (save-excursion (end-of-defun) (point))))
21588@end group
21589
21590@group
21591 (while
21592 (and (< (point) end)
21593 (re-search-forward
21594 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
21595 end t))
21596 (setq count (1+ count)))
21597 count))
21598@end group
21599@end smallexample
21600
21601@smallexample
21602@group
21603(defun lengths-list-file (filename)
21604 "Return list of definitions' lengths within FILE.
21605The returned list is a list of numbers.
21606Each number is the number of words or
21607symbols in one function definition."
21608@end group
21609
21610@group
21611 (message "Working on `%s' ... " filename)
21612 (save-excursion
21613 (let ((buffer (find-file-noselect filename))
21614 (lengths-list))
21615 (set-buffer buffer)
21616 (setq buffer-read-only t)
21617 (widen)
21618 (goto-char (point-min))
21619@end group
21620
21621@group
21622 (while (re-search-forward "^(defun" nil t)
21623 (setq lengths-list
21624 (cons (count-words-in-defun) lengths-list)))
21625 (kill-buffer buffer)
21626 lengths-list)))
21627@end group
21628@end smallexample
21629
21630@smallexample
21631@group
21632(defun lengths-list-many-files (list-of-files)
21633 "Return list of lengths of defuns in LIST-OF-FILES."
21634 (let (lengths-list)
21635;;; @r{true-or-false-test}
21636 (while list-of-files
21637 (setq lengths-list
21638 (append
21639 lengths-list
21640@end group
21641@group
21642;;; @r{Generate a lengths' list.}
21643 (lengths-list-file
21644 (expand-file-name (car list-of-files)))))
21645;;; @r{Make files' list shorter.}
21646 (setq list-of-files (cdr list-of-files)))
21647;;; @r{Return final value of lengths' list.}
21648 lengths-list))
21649@end group
21650@end smallexample
21651
21652@smallexample
21653@group
21654(defun defuns-per-range (sorted-lengths top-of-ranges)
21655 "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
21656 (let ((top-of-range (car top-of-ranges))
21657 (number-within-range 0)
21658 defuns-per-range-list)
21659@end group
21660
21661@group
21662 ;; @r{Outer loop.}
21663 (while top-of-ranges
21664
21665 ;; @r{Inner loop.}
21666 (while (and
21667 ;; @r{Need number for numeric test.}
21668 (car sorted-lengths)
21669 (< (car sorted-lengths) top-of-range))
21670
21671 ;; @r{Count number of definitions within current range.}
21672 (setq number-within-range (1+ number-within-range))
21673 (setq sorted-lengths (cdr sorted-lengths)))
21674@end group
21675
21676@group
21677 ;; @r{Exit inner loop but remain within outer loop.}
21678
21679 (setq defuns-per-range-list
21680 (cons number-within-range defuns-per-range-list))
21681 (setq number-within-range 0) ; @r{Reset count to zero.}
21682
21683 ;; @r{Move to next range.}
21684 (setq top-of-ranges (cdr top-of-ranges))
21685 ;; @r{Specify next top of range value.}
21686 (setq top-of-range (car top-of-ranges)))
21687@end group
21688
21689@group
21690 ;; @r{Exit outer loop and count the number of defuns larger than}
21691 ;; @r{ the largest top-of-range value.}
21692 (setq defuns-per-range-list
21693 (cons
21694 (length sorted-lengths)
21695 defuns-per-range-list))
21696
21697 ;; @r{Return a list of the number of definitions within each range,}
21698 ;; @r{ smallest to largest.}
21699 (nreverse defuns-per-range-list)))
21700@end group
21701@end smallexample
21702
21703@smallexample
21704@group
21705(defun column-of-graph (max-graph-height actual-height)
21706 "Return list of MAX-GRAPH-HEIGHT strings;
21707ACTUAL-HEIGHT are graph-symbols.
21708The graph-symbols are contiguous entries at the end
21709of the list.
21710The list will be inserted as one column of a graph.
21711The strings are either graph-blank or graph-symbol."
21712@end group
21713
21714@group
21715 (let ((insert-list nil)
21716 (number-of-top-blanks
21717 (- max-graph-height actual-height)))
21718
21719 ;; @r{Fill in @code{graph-symbols}.}
21720 (while (> actual-height 0)
21721 (setq insert-list (cons graph-symbol insert-list))
21722 (setq actual-height (1- actual-height)))
21723@end group
21724
21725@group
21726 ;; @r{Fill in @code{graph-blanks}.}
21727 (while (> number-of-top-blanks 0)
21728 (setq insert-list (cons graph-blank insert-list))
21729 (setq number-of-top-blanks
21730 (1- number-of-top-blanks)))
21731
21732 ;; @r{Return whole list.}
21733 insert-list))
21734@end group
21735@end smallexample
21736
21737@smallexample
21738@group
21739(defun Y-axis-element (number full-Y-label-width)
21740 "Construct a NUMBERed label element.
21741A numbered element looks like this ` 5 - ',
21742and is padded as needed so all line up with
21743the element for the largest number."
21744@end group
21745@group
21746 (let* ((leading-spaces
21747 (- full-Y-label-width
21748 (length
21749 (concat (number-to-string number)
21750 Y-axis-tic)))))
21751@end group
21752@group
21753 (concat
21754 (make-string leading-spaces ? )
21755 (number-to-string number)
21756 Y-axis-tic)))
21757@end group
21758@end smallexample
21759
21760@smallexample
21761@group
21762(defun print-Y-axis
21763 (height full-Y-label-width &optional vertical-step)
21764 "Insert Y axis by HEIGHT and FULL-Y-LABEL-WIDTH.
21765Height must be the maximum height of the graph.
21766Full width is the width of the highest label element.
21767Optionally, print according to VERTICAL-STEP."
21768@end group
21769@group
21770;; Value of height and full-Y-label-width
21771;; are passed by `print-graph'.
21772 (let ((start (point)))
21773 (insert-rectangle
21774 (Y-axis-column height full-Y-label-width vertical-step))
21775@end group
21776@group
21777 ;; @r{Place point ready for inserting graph.}
21778 (goto-char start)
21779 ;; @r{Move point forward by value of} full-Y-label-width
21780 (forward-char full-Y-label-width)))
21781@end group
21782@end smallexample
21783
21784@smallexample
21785@group
21786(defun print-X-axis-tic-line
21787 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
21788 "Print ticks for X axis."
21789 (insert X-axis-leading-spaces)
21790 (insert X-axis-tic-symbol) ; @r{Under first column.}
21791@end group
21792@group
21793 ;; @r{Insert second tic in the right spot.}
21794 (insert (concat
21795 (make-string
21796 (- (* symbol-width X-axis-label-spacing)
21797 ;; @r{Insert white space up to second tic symbol.}
21798 (* 2 (length X-axis-tic-symbol)))
21799 ? )
21800 X-axis-tic-symbol))
21801@end group
21802@group
21803 ;; @r{Insert remaining ticks.}
21804 (while (> number-of-X-tics 1)
21805 (insert X-axis-tic-element)
21806 (setq number-of-X-tics (1- number-of-X-tics))))
21807@end group
21808@end smallexample
21809
21810@smallexample
21811@group
21812(defun X-axis-element (number)
21813 "Construct a numbered X axis element."
21814 (let ((leading-spaces
21815 (- (* symbol-width X-axis-label-spacing)
21816 (length (number-to-string number)))))
21817 (concat (make-string leading-spaces ? )
21818 (number-to-string number))))
21819@end group
21820@end smallexample
21821
21822@smallexample
21823@group
21824(defun graph-body-print (numbers-list height symbol-width)
21825 "Print a bar graph of the NUMBERS-LIST.
21826The numbers-list consists of the Y-axis values.
21827HEIGHT is maximum height of graph.
21828SYMBOL-WIDTH is number of each column."
21829@end group
21830@group
21831 (let (from-position)
21832 (while numbers-list
21833 (setq from-position (point))
21834 (insert-rectangle
21835 (column-of-graph height (car numbers-list)))
21836 (goto-char from-position)
21837 (forward-char symbol-width)
21838@end group
21839@group
21840 ;; @r{Draw graph column by column.}
21841 (sit-for 0)
21842 (setq numbers-list (cdr numbers-list)))
21843 ;; @r{Place point for X axis labels.}
21844 (forward-line height)
21845 (insert "\n")))
21846@end group
21847@end smallexample
21848
21849@smallexample
21850@group
21851(defun Y-axis-column
21852 (height width-of-label &optional vertical-step)
21853 "Construct list of labels for Y axis.
21854HEIGHT is maximum height of graph.
21855WIDTH-OF-LABEL is maximum width of label.
21856@end group
21857@group
21858VERTICAL-STEP, an option, is a positive integer
21859that specifies how much a Y axis label increments
21860for each line. For example, a step of 5 means
21861that each line is five units of the graph."
21862 (let (Y-axis
21863 (number-per-line (or vertical-step 1)))
21864@end group
21865@group
21866 (while (> height 1)
21867 (if (zerop (% height Y-axis-label-spacing))
21868 ;; @r{Insert label.}
21869 (setq Y-axis
21870 (cons
21871 (Y-axis-element
21872 (* height number-per-line)
21873 width-of-label)
21874 Y-axis))
21875@end group
21876@group
21877 ;; @r{Else, insert blanks.}
21878 (setq Y-axis
21879 (cons
21880 (make-string width-of-label ? )
21881 Y-axis)))
21882 (setq height (1- height)))
21883@end group
21884@group
21885 ;; @r{Insert base line.}
21886 (setq Y-axis (cons (Y-axis-element
21887 (or vertical-step 1)
21888 width-of-label)
21889 Y-axis))
21890 (nreverse Y-axis)))
21891@end group
21892@end smallexample
21893
21894@smallexample
21895@group
21896(defun print-X-axis-numbered-line
21897 (number-of-X-tics X-axis-leading-spaces
21898 &optional horizontal-step)
21899 "Print line of X-axis numbers"
21900 (let ((number X-axis-label-spacing)
21901 (horizontal-step (or horizontal-step 1)))
21902@end group
21903@group
21904 (insert X-axis-leading-spaces)
21905 ;; line up number
21906 (delete-char (- (1- (length (number-to-string horizontal-step)))))
21907 (insert (concat
21908 (make-string
21909 ;; @r{Insert white space up to next number.}
21910 (- (* symbol-width X-axis-label-spacing)
21911 (1- (length (number-to-string horizontal-step)))
21912 2)
21913 ? )
21914 (number-to-string (* number horizontal-step))))
21915@end group
21916@group
21917 ;; @r{Insert remaining numbers.}
21918 (setq number (+ number X-axis-label-spacing))
21919 (while (> number-of-X-tics 1)
21920 (insert (X-axis-element (* number horizontal-step)))
21921 (setq number (+ number X-axis-label-spacing))
21922 (setq number-of-X-tics (1- number-of-X-tics)))))
21923@end group
21924@end smallexample
21925
21926@smallexample
21927@group
21928(defun print-X-axis (numbers-list horizontal-step)
21929 "Print X axis labels to length of NUMBERS-LIST.
21930Optionally, HORIZONTAL-STEP, a positive integer,
21931specifies how much an X axis label increments for
21932each column."
21933@end group
21934@group
21935;; Value of symbol-width and full-Y-label-width
21936;; are passed by `print-graph'.
21937 (let* ((leading-spaces
21938 (make-string full-Y-label-width ? ))
21939 ;; symbol-width @r{is provided by} graph-body-print
21940 (tic-width (* symbol-width X-axis-label-spacing))
21941 (X-length (length numbers-list))
21942@end group
21943@group
21944 (X-tic
21945 (concat
21946 (make-string
21947 ;; @r{Make a string of blanks.}
21948 (- (* symbol-width X-axis-label-spacing)
21949 (length X-axis-tic-symbol))
21950 ? )
21951@end group
21952@group
21953 ;; @r{Concatenate blanks with tic symbol.}
21954 X-axis-tic-symbol))
21955 (tic-number
21956 (if (zerop (% X-length tic-width))
21957 (/ X-length tic-width)
21958 (1+ (/ X-length tic-width)))))
21959@end group
21960
21961@group
21962 (print-X-axis-tic-line
21963 tic-number leading-spaces X-tic)
21964 (insert "\n")
21965 (print-X-axis-numbered-line
21966 tic-number leading-spaces horizontal-step)))
21967@end group
21968@end smallexample
21969
21970@smallexample
21971@group
21972(defun one-fiftieth (full-range)
21973 "Return list, each number of which is 1/50th previous."
21974 (mapcar '(lambda (arg) (/ arg 50)) full-range))
21975@end group
21976@end smallexample
21977
21978@smallexample
21979@group
21980(defun print-graph
21981 (numbers-list &optional vertical-step horizontal-step)
09e80d9f 21982 "Print labeled bar graph of the NUMBERS-LIST.
8cda6f8f
GM
21983The numbers-list consists of the Y-axis values.
21984@end group
21985
21986@group
21987Optionally, VERTICAL-STEP, a positive integer,
21988specifies how much a Y axis label increments for
21989each line. For example, a step of 5 means that
21990each row is five units.
21991@end group
21992
21993@group
21994Optionally, HORIZONTAL-STEP, a positive integer,
21995specifies how much an X axis label increments for
21996each column."
21997 (let* ((symbol-width (length graph-blank))
21998 ;; @code{height} @r{is both the largest number}
21999 ;; @r{and the number with the most digits.}
22000 (height (apply 'max numbers-list))
22001@end group
22002@group
22003 (height-of-top-line
22004 (if (zerop (% height Y-axis-label-spacing))
22005 height
22006 ;; @r{else}
22007 (* (1+ (/ height Y-axis-label-spacing))
22008 Y-axis-label-spacing)))
22009@end group
22010@group
22011 (vertical-step (or vertical-step 1))
22012 (full-Y-label-width
22013 (length
22014 (concat
22015 (number-to-string
22016 (* height-of-top-line vertical-step))
22017 Y-axis-tic))))
22018@end group
22019@group
22020
22021 (print-Y-axis
22022 height-of-top-line full-Y-label-width vertical-step)
22023 (graph-body-print
22024 numbers-list height-of-top-line symbol-width)
22025 (print-X-axis numbers-list horizontal-step)))
22026@end group
22027@end smallexample
22028@c qqq
22029@end ignore
22030
22031@page
22032@node Final printed graph, , Another Bug, Print Whole Graph
22033@appendixsubsec The Printed Graph
22034
22035When made and installed, you can call the @code{print-graph} command
22036like this:
22037@sp 1
22038
22039@smallexample
22040@group
22041(print-graph fiftieth-list-for-graph 50 10)
22042@end group
22043@end smallexample
22044@sp 1
22045
22046@noindent
22047Here is the graph:
22048@sp 2
22049
22050@smallexample
22051@group
220521000 - *
22053 **
22054 **
22055 **
22056 **
22057 750 - ***
22058 ***
22059 ***
22060 ***
22061 ****
22062 500 - *****
22063 ******
22064 ******
22065 ******
22066 *******
22067 250 - ********
22068 ********* *
22069 *********** *
22070 ************* *
22071 50 - ***************** * *
22072 | | | | | | | |
22073 10 50 100 150 200 250 300 350
22074@end group
22075@end smallexample
22076
22077@sp 2
22078
22079@noindent
22080The largest group of functions contain 10 -- 19 words and symbols each.
22081
22082@node Free Software and Free Manuals, GNU Free Documentation License, Full Graph, Top
22083@appendix Free Software and Free Manuals
22084
22085@strong{by Richard M. Stallman}
22086@sp 1
22087
22088The biggest deficiency in free operating systems is not in the
22089software---it is the lack of good free manuals that we can include in
22090these systems. Many of our most important programs do not come with
22091full manuals. Documentation is an essential part of any software
22092package; when an important free software package does not come with a
22093free manual, that is a major gap. We have many such gaps today.
22094
22095Once upon a time, many years ago, I thought I would learn Perl. I got
22096a copy of a free manual, but I found it hard to read. When I asked
22097Perl users about alternatives, they told me that there were better
22098introductory manuals---but those were not free.
22099
22100Why was this? The authors of the good manuals had written them for
22101O'Reilly Associates, which published them with restrictive terms---no
22102copying, no modification, source files not available---which exclude
22103them from the free software community.
22104
22105That wasn't the first time this sort of thing has happened, and (to
22106our community's great loss) it was far from the last. Proprietary
22107manual publishers have enticed a great many authors to restrict their
22108manuals since then. Many times I have heard a GNU user eagerly tell me
22109about a manual that he is writing, with which he expects to help the
22110GNU project---and then had my hopes dashed, as he proceeded to explain
22111that he had signed a contract with a publisher that would restrict it
22112so that we cannot use it.
22113
22114Given that writing good English is a rare skill among programmers, we
22115can ill afford to lose manuals this way.
22116
8cda6f8f
GM
22117Free documentation, like free software, is a matter of freedom, not
22118price. The problem with these manuals was not that O'Reilly Associates
31b62755
GM
22119charged a price for printed copies---that in itself is fine. The Free
22120Software Foundation @uref{http://shop.fsf.org, sells printed copies} of
22121free @uref{http://www.gnu.org/doc/doc.html, GNU manuals}, too.
8cda6f8f
GM
22122But GNU manuals are available in source code form, while these manuals
22123are available only on paper. GNU manuals come with permission to copy
22124and modify; the Perl manuals do not. These restrictions are the
22125problems.
22126
22127The criterion for a free manual is pretty much the same as for free
22128software: it is a matter of giving all users certain
22129freedoms. Redistribution (including commercial redistribution) must be
22130permitted, so that the manual can accompany every copy of the program,
22131on-line or on paper. Permission for modification is crucial too.
22132
22133As a general rule, I don't believe that it is essential for people to
22134have permission to modify all sorts of articles and books. The issues
22135for writings are not necessarily the same as those for software. For
22136example, I don't think you or I are obliged to give permission to
22137modify articles like this one, which describe our actions and our
22138views.
22139
22140But there is a particular reason why the freedom to modify is crucial
22141for documentation for free software. When people exercise their right
22142to modify the software, and add or change its features, if they are
22143conscientious they will change the manual too---so they can provide
22144accurate and usable documentation with the modified program. A manual
22145which forbids programmers to be conscientious and finish the job, or
22146more precisely requires them to write a new manual from scratch if
22147they change the program, does not fill our community's needs.
22148
22149While a blanket prohibition on modification is unacceptable, some
22150kinds of limits on the method of modification pose no problem. For
22151example, requirements to preserve the original author's copyright
22152notice, the distribution terms, or the list of authors, are ok. It is
22153also no problem to require modified versions to include notice that
22154they were modified, even to have entire sections that may not be
22155deleted or changed, as long as these sections deal with nontechnical
22156topics. (Some GNU manuals have them.)
22157
22158These kinds of restrictions are not a problem because, as a practical
22159matter, they don't stop the conscientious programmer from adapting the
22160manual to fit the modified program. In other words, they don't block
22161the free software community from making full use of the manual.
22162
22163However, it must be possible to modify all the technical content of
22164the manual, and then distribute the result in all the usual media,
22165through all the usual channels; otherwise, the restrictions do block
22166the community, the manual is not free, and so we need another manual.
22167
22168Unfortunately, it is often hard to find someone to write another
22169manual when a proprietary manual exists. The obstacle is that many
22170users think that a proprietary manual is good enough---so they don't
22171see the need to write a free manual. They do not see that the free
22172operating system has a gap that needs filling.
22173
22174Why do users think that proprietary manuals are good enough? Some have
22175not considered the issue. I hope this article will do something to
22176change that.
22177
22178Other users consider proprietary manuals acceptable for the same
22179reason so many people consider proprietary software acceptable: they
22180judge in purely practical terms, not using freedom as a
22181criterion. These people are entitled to their opinions, but since
22182those opinions spring from values which do not include freedom, they
22183are no guide for those of us who do value freedom.
22184
22185Please spread the word about this issue. We continue to lose manuals
22186to proprietary publishing. If we spread the word that proprietary
22187manuals are not sufficient, perhaps the next person who wants to help
22188GNU by writing documentation will realize, before it is too late, that
22189he must above all make it free.
22190
22191We can also encourage commercial publishers to sell free, copylefted
22192manuals instead of proprietary ones. One way you can help this is to
22193check the distribution terms of a manual before you buy it, and prefer
22194copylefted manuals to non-copylefted ones.
22195
22196@sp 2
22197@noindent
22198Note: The Free Software Foundation maintains a page on its Web site
22199that lists free books available from other publishers:@*
22200@uref{http://www.gnu.org/doc/other-free-books.html}
22201
22202@node GNU Free Documentation License, Index, Free Software and Free Manuals, Top
22203@appendix GNU Free Documentation License
22204
22205@cindex FDL, GNU Free Documentation License
e41dfb1e 22206@include doclicense.texi
8cda6f8f
GM
22207
22208@node Index, About the Author, GNU Free Documentation License, Top
22209@comment node-name, next, previous, up
22210@unnumbered Index
22211
22212@ignore
22213MENU ENTRY: NODE NAME.
22214@end ignore
22215
22216@printindex cp
22217
22218@iftex
22219@c Place biographical information on right-hand (verso) page
22220
22221@tex
a9097c6d 22222\par\vfill\supereject
8cda6f8f 22223\ifodd\pageno
8cda6f8f
GM
22224 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
22225 \global\oddheadline={\hfil} \global\oddfootline={\hfil}
a9097c6d 22226 %\page\hbox{}\page
8cda6f8f 22227\else
a9097c6d 22228% \par\vfill\supereject
8cda6f8f
GM
22229 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
22230 \global\oddheadline={\hfil} \global\oddfootline={\hfil}
a9097c6d
KB
22231 %\page\hbox{}%\page
22232 %\page\hbox{}%\page
8cda6f8f
GM
22233\fi
22234@end tex
22235
a9097c6d 22236@c page
8cda6f8f
GM
22237@w{ }
22238
22239@c ================ Biographical information ================
22240
22241@w{ }
22242@sp 8
22243@center About the Author
22244@sp 1
22245@end iftex
22246
22247@ifnottex
22248@node About the Author, , Index, Top
22249@unnumbered About the Author
22250@end ifnottex
22251
22252@quotation
22253Robert J. Chassell has worked with GNU Emacs since 1985. He writes
22254and edits, teaches Emacs and Emacs Lisp, and speaks throughout the
22255world on software freedom. Chassell was a founding Director and
22256Treasurer of the Free Software Foundation, Inc. He is co-author of
22257the @cite{Texinfo} manual, and has edited more than a dozen other
22258books. He graduated from Cambridge University, in England. He has an
22259abiding interest in social and economic history and flies his own
22260airplane.
22261@end quotation
22262
a9097c6d
KB
22263@c @page
22264@c @w{ }
22265@c
22266@c @c Prevent page number on blank verso, so eject it first.
22267@c @tex
22268@c \par\vfill\supereject
22269@c @end tex
22270
22271@c @iftex
22272@c @headings off
22273@c @evenheading @thispage @| @| @thistitle
22274@c @oddheading @| @| @thispage
22275@c @end iftex
8cda6f8f
GM
22276
22277@bye