Add 2012 to FSF copyright years for Emacs files (do not merge to trunk)
[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
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
231Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001,
49f70d46 232 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
88c26f5c 233 Free Software Foundation, Inc.
8cda6f8f
GM
234@sp 1
235
236@iftex
237Published by the:@*
238
239GNU Press, @hfill @uref{http://www.gnupress.org}@*
240a division of the @hfill General: @email{press@@gnu.org}@*
241Free Software Foundation, Inc. @hfill Orders:@w{ } @email{sales@@gnu.org}@*
24251 Franklin Street, Fifth Floor @hfill Tel: +1 (617) 542-5942@*
243Boston, MA 02110-1301 USA @hfill Fax: +1 (617) 542-2652@*
244@end iftex
245
246@ifnottex
247Published by the:
248
249@example
250GNU Press, Website: http://www.gnupress.org
251a division of the General: press@@gnu.org
252Free Software Foundation, Inc. Orders: sales@@gnu.org
25351 Franklin Street, Fifth Floor Tel: +1 (617) 542-5942
254Boston, MA 02110-1301 USA Fax: +1 (617) 542-2652
255@end example
256@end ifnottex
257
258@sp 1
259@c Printed copies are available for $30 each.@*
260ISBN 1-882114-43-4
261
262Permission is granted to copy, distribute and/or modify this document
e41dfb1e 263under the terms of the GNU Free Documentation License, Version 1.3 or
8cda6f8f
GM
264any later version published by the Free Software Foundation; there
265being no Invariant Section, with the Front-Cover Texts being ``A GNU
266Manual'', and with the Back-Cover Texts as in (a) below. A copy of
267the license is included in the section entitled ``GNU Free
268Documentation License''.
269
868a6b71
RC
270(a) The FSF's Back-Cover Text is: ``You have the freedom to
271copy and modify this GNU manual. Buying copies from the FSF
272supports it in developing GNU and promoting software freedom.''
8cda6f8f
GM
273@end copying
274
275@c half title; two lines here, so do not use `shorttitlepage'
276@tex
277{\begingroup%
278 \hbox{}\vskip 1.5in \chaprm \centerline{An Introduction to}%
279 \endgroup}%
280{\begingroup\hbox{}\vskip 0.25in \chaprm%
281 \centerline{Programming in Emacs Lisp}%
282 \endgroup\page\hbox{}\page}
283@end tex
284
285@titlepage
286@sp 6
287@center @titlefont{An Introduction to}
288@sp 2
289@center @titlefont{Programming in Emacs Lisp}
290@sp 2
291@center Revised Third Edition
292@sp 4
293@center by Robert J. Chassell
294
295@page
296@vskip 0pt plus 1filll
297@insertcopying
298@end titlepage
299
300@iftex
301@headings off
302@evenheading @thispage @| @| @thischapter
303@oddheading @thissection @| @| @thispage
304@end iftex
305
306@ifnothtml
307@c Keep T.O.C. short by tightening up for largebook
308@ifset largebook
309@tex
310\global\parskip 2pt plus 1pt
311\global\advance\baselineskip by -1pt
312@end tex
313@end ifset
314@end ifnothtml
315
316@shortcontents
317@contents
318
319@ifnottex
320@node Top, Preface, (dir), (dir)
321@top An Introduction to Programming in Emacs Lisp
322
323@insertcopying
324
325This master menu first lists each chapter and index; then it lists
326every node in every chapter.
327@end ifnottex
328
329@c >>>> Set pageno appropriately <<<<
330
331@c The first page of the Preface is a roman numeral; it is the first
332@c right handed page after the Table of Contents; hence the following
333@c setting must be for an odd negative number.
334
a9097c6d
KB
335@c iftex
336@c global@pageno = -11
337@c end iftex
8cda6f8f
GM
338
339@menu
340* Preface:: What to look for.
341* List Processing:: What is Lisp?
342* Practicing Evaluation:: Running several programs.
343* Writing Defuns:: How to write function definitions.
344* Buffer Walk Through:: Exploring a few buffer-related functions.
345* More Complex:: A few, even more complex functions.
346* Narrowing & Widening:: Restricting your and Emacs attention to
347 a region.
348* car cdr & cons:: Fundamental functions in Lisp.
349* Cutting & Storing Text:: Removing text and saving it.
350* List Implementation:: How lists are implemented in the computer.
351* Yanking:: Pasting stored text.
352* Loops & Recursion:: How to repeat a process.
353* Regexp Search:: Regular expression searches.
354* Counting Words:: A review of repetition and regexps.
355* Words in a defun:: Counting words in a @code{defun}.
356* Readying a Graph:: A prototype graph printing function.
357* Emacs Initialization:: How to write a @file{.emacs} file.
358* Debugging:: How to run the Emacs Lisp debuggers.
359* Conclusion:: Now you have the basics.
360* the-the:: An appendix: how to find reduplicated words.
361* Kill Ring:: An appendix: how the kill ring works.
362* Full Graph:: How to create a graph with labelled axes.
363* Free Software and Free Manuals::
364* GNU Free Documentation License::
365* Index::
366* About the Author::
367
368@detailmenu
369 --- The Detailed Node Listing ---
370
371Preface
372
373* Why:: Why learn Emacs Lisp?
374* On Reading this Text:: Read, gain familiarity, pick up habits....
375* Who You Are:: For whom this is written.
376* Lisp History::
377* Note for Novices:: You can read this as a novice.
378* Thank You::
379
380List Processing
381
382* Lisp Lists:: What are lists?
383* Run a Program:: Any list in Lisp is a program ready to run.
384* Making Errors:: Generating an error message.
385* Names & Definitions:: Names of symbols and function definitions.
386* Lisp Interpreter:: What the Lisp interpreter does.
387* Evaluation:: Running a program.
388* Variables:: Returning a value from a variable.
389* Arguments:: Passing information to a function.
390* set & setq:: Setting the value of a variable.
391* Summary:: The major points.
392* Error Message Exercises::
393
394Lisp Lists
395
396* Numbers Lists:: List have numbers, other lists, in them.
397* Lisp Atoms:: Elemental entities.
398* Whitespace in Lists:: Formatting lists to be readable.
399* Typing Lists:: How GNU Emacs helps you type lists.
400
401The Lisp Interpreter
402
403* Complications:: Variables, Special forms, Lists within.
404* Byte Compiling:: Specially processing code for speed.
405
406Evaluation
407
408* How the Interpreter Acts:: Returns and Side Effects...
409* Evaluating Inner Lists:: Lists within lists...
410
411Variables
412
413* fill-column Example::
414* Void Function:: The error message for a symbol
415 without a function.
416* Void Variable:: The error message for a symbol without a value.
417
418Arguments
419
420* Data types:: Types of data passed to a function.
421* Args as Variable or List:: An argument can be the value
422 of a variable or list.
423* Variable Number of Arguments:: Some functions may take a
424 variable number of arguments.
425* Wrong Type of Argument:: Passing an argument of the wrong type
426 to a function.
427* message:: A useful function for sending messages.
428
429Setting the Value of a Variable
430
431* Using set:: Setting values.
432* Using setq:: Setting a quoted value.
433* Counting:: Using @code{setq} to count.
434
435Practicing Evaluation
436
437* How to Evaluate:: Typing editing commands or @kbd{C-x C-e}
438 causes evaluation.
439* Buffer Names:: Buffers and files are different.
440* Getting Buffers:: Getting a buffer itself, not merely its name.
441* Switching Buffers:: How to change to another buffer.
442* Buffer Size & Locations:: Where point is located and the size of
443 the buffer.
444* Evaluation Exercise::
445
446How To Write Function Definitions
447
448* Primitive Functions::
449* defun:: The @code{defun} special form.
450* Install:: Install a function definition.
451* Interactive:: Making a function interactive.
452* Interactive Options:: Different options for @code{interactive}.
453* Permanent Installation:: Installing code permanently.
454* let:: Creating and initializing local variables.
455* if:: What if?
456* else:: If--then--else expressions.
457* Truth & Falsehood:: What Lisp considers false and true.
458* save-excursion:: Keeping track of point, mark, and buffer.
459* Review::
460* defun Exercises::
461
462Install a Function Definition
463
464* Effect of installation::
465* Change a defun:: How to change a function definition.
466
467Make a Function Interactive
468
469* Interactive multiply-by-seven:: An overview.
470* multiply-by-seven in detail:: The interactive version.
471
472@code{let}
473
474* Prevent confusion::
475* Parts of let Expression::
476* Sample let Expression::
477* Uninitialized let Variables::
478
479The @code{if} Special Form
480
481* if in more detail::
482* type-of-animal in detail:: An example of an @code{if} expression.
483
484Truth and Falsehood in Emacs Lisp
485
486* nil explained:: @code{nil} has two meanings.
487
488@code{save-excursion}
489
490* Point and mark:: A review of various locations.
491* Template for save-excursion::
492
493A Few Buffer--Related Functions
494
495* Finding More:: How to find more information.
496* simplified-beginning-of-buffer:: Shows @code{goto-char},
497 @code{point-min}, and @code{push-mark}.
498* mark-whole-buffer:: Almost the same as @code{beginning-of-buffer}.
499* append-to-buffer:: Uses @code{save-excursion} and
500 @code{insert-buffer-substring}.
501* Buffer Related Review:: Review.
502* Buffer Exercises::
503
504The Definition of @code{mark-whole-buffer}
505
506* mark-whole-buffer overview::
507* Body of mark-whole-buffer:: Only three lines of code.
508
509The Definition of @code{append-to-buffer}
510
511* append-to-buffer overview::
512* append interactive:: A two part interactive expression.
513* append-to-buffer body:: Incorporates a @code{let} expression.
514* append save-excursion:: How the @code{save-excursion} works.
515
516A Few More Complex Functions
517
518* copy-to-buffer:: With @code{set-buffer}, @code{get-buffer-create}.
519* insert-buffer:: Read-only, and with @code{or}.
520* beginning-of-buffer:: Shows @code{goto-char},
521 @code{point-min}, and @code{push-mark}.
522* Second Buffer Related Review::
523* optional Exercise::
524
525The Definition of @code{insert-buffer}
526
527* insert-buffer code::
528* insert-buffer interactive:: When you can read, but not write.
529* insert-buffer body:: The body has an @code{or} and a @code{let}.
530* if & or:: Using an @code{if} instead of an @code{or}.
531* Insert or:: How the @code{or} expression works.
532* Insert let:: Two @code{save-excursion} expressions.
533* New insert-buffer::
534
535The Interactive Expression in @code{insert-buffer}
536
537* Read-only buffer:: When a buffer cannot be modified.
538* b for interactive:: An existing buffer or else its name.
539
540Complete Definition of @code{beginning-of-buffer}
541
542* Optional Arguments::
543* beginning-of-buffer opt arg:: Example with optional argument.
544* beginning-of-buffer complete::
545
546@code{beginning-of-buffer} with an Argument
547
548* Disentangle beginning-of-buffer::
549* Large buffer case::
550* Small buffer case::
551
552Narrowing and Widening
553
554* Narrowing advantages:: The advantages of narrowing
555* save-restriction:: The @code{save-restriction} special form.
556* what-line:: The number of the line that point is on.
557* narrow Exercise::
558
559@code{car}, @code{cdr}, @code{cons}: Fundamental Functions
560
561* Strange Names:: An historical aside: why the strange names?
562* car & cdr:: Functions for extracting part of a list.
563* cons:: Constructing a list.
564* nthcdr:: Calling @code{cdr} repeatedly.
565* nth::
566* setcar:: Changing the first element of a list.
567* setcdr:: Changing the rest of a list.
568* cons Exercise::
569
570@code{cons}
571
572* Build a list::
573* length:: How to find the length of a list.
574
575Cutting and Storing Text
576
577* Storing Text:: Text is stored in a list.
578* zap-to-char:: Cutting out text up to a character.
579* kill-region:: Cutting text out of a region.
580* copy-region-as-kill:: A definition for copying text.
581* Digression into C:: Minor note on C programming language macros.
582* defvar:: How to give a variable an initial value.
583* cons & search-fwd Review::
584* search Exercises::
585
586@code{zap-to-char}
587
588* Complete zap-to-char:: The complete implementation.
589* zap-to-char interactive:: A three part interactive expression.
590* zap-to-char body:: A short overview.
591* search-forward:: How to search for a string.
592* progn:: The @code{progn} special form.
593* Summing up zap-to-char:: Using @code{point} and @code{search-forward}.
594
595@code{kill-region}
596
597* Complete kill-region:: The function definition.
598* condition-case:: Dealing with a problem.
599* Lisp macro::
600
601@code{copy-region-as-kill}
602
603* Complete copy-region-as-kill:: The complete function definition.
604* copy-region-as-kill body:: The body of @code{copy-region-as-kill}.
605
606The Body of @code{copy-region-as-kill}
607
608* last-command & this-command::
609* kill-append function::
610* kill-new function::
611
612Initializing a Variable with @code{defvar}
613
614* See variable current value::
615* defvar and asterisk::
616
617How Lists are Implemented
618
619* Lists diagrammed::
620* Symbols as Chest:: Exploring a powerful metaphor.
621* List Exercise::
622
623Yanking Text Back
624
625* Kill Ring Overview::
626* kill-ring-yank-pointer:: The kill ring is a list.
627* yank nthcdr Exercises:: The @code{kill-ring-yank-pointer} variable.
628
629Loops and Recursion
630
631* while:: Causing a stretch of code to repeat.
632* dolist dotimes::
633* Recursion:: Causing a function to call itself.
634* Looping exercise::
635
636@code{while}
637
638* Looping with while:: Repeat so long as test returns true.
639* Loop Example:: A @code{while} loop that uses a list.
640* print-elements-of-list:: Uses @code{while}, @code{car}, @code{cdr}.
641* Incrementing Loop:: A loop with an incrementing counter.
642* Incrementing Loop Details::
643* Decrementing Loop:: A loop with a decrementing counter.
644
645Details of an Incrementing Loop
646
647* Incrementing Example:: Counting pebbles in a triangle.
648* Inc Example parts:: The parts of the function definition.
649* Inc Example altogether:: Putting the function definition together.
650
651Loop with a Decrementing Counter
652
653* Decrementing Example:: More pebbles on the beach.
654* Dec Example parts:: The parts of the function definition.
655* Dec Example altogether:: Putting the function definition together.
656
657Save your time: @code{dolist} and @code{dotimes}
658
659* dolist::
660* dotimes::
661
662Recursion
663
664* Building Robots:: Same model, different serial number ...
665* Recursive Definition Parts:: Walk until you stop ...
666* Recursion with list:: Using a list as the test whether to recurse.
667* Recursive triangle function::
668* Recursion with cond::
669* Recursive Patterns:: Often used templates.
670* No Deferment:: Don't store up work ...
671* No deferment solution::
672
673Recursion in Place of a Counter
674
675* Recursive Example arg of 1 or 2::
676* Recursive Example arg of 3 or 4::
677
678Recursive Patterns
679
680* Every::
681* Accumulate::
682* Keep::
683
684Regular Expression Searches
685
686* sentence-end:: The regular expression for @code{sentence-end}.
687* re-search-forward:: Very similar to @code{search-forward}.
688* forward-sentence:: A straightforward example of regexp search.
689* forward-paragraph:: A somewhat complex example.
690* etags:: How to create your own @file{TAGS} table.
691* Regexp Review::
692* re-search Exercises::
693
694@code{forward-sentence}
695
696* Complete forward-sentence::
697* fwd-sentence while loops:: Two @code{while} loops.
698* fwd-sentence re-search:: A regular expression search.
699
700@code{forward-paragraph}: a Goldmine of Functions
701
702* forward-paragraph in brief:: Key parts of the function definition.
703* fwd-para let:: The @code{let*} expression.
704* fwd-para while:: The forward motion @code{while} loop.
705
706Counting: Repetition and Regexps
707
708* Why Count Words::
709* count-words-region:: Use a regexp, but find a problem.
710* recursive-count-words:: Start with case of no words in region.
711* Counting Exercise::
712
713The @code{count-words-region} Function
714
715* Design count-words-region:: The definition using a @code{while} loop.
716* Whitespace Bug:: The Whitespace Bug in @code{count-words-region}.
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?
723* count-words-in-defun:: Very like @code{count-words}.
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
796A Graph with Labelled Axes
797
798* Labelled Example::
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
890Much of this introduction is dedicated to walk-throughs or guided tours
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.
1026(On many modern keyboards the @key{META} key is labelled
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
1034along with the key that is labelled @key{ALT} and, at the same time,
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
1404signposts to a traveller in a strange country; deciphering them can be
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
2043punctuations) from the beginning of the string.
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
4752@key{RET}}. (On some keyboards, the @key{META} key is labelled
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
8203 ;; the text to the kill ring without signally an error, but
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,
13659LaTeX, Pascal, Perl, Postscript, Python, TeX, Texinfo, makefiles, and
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::
13832* count-words-region:: Use a regexp, but find a problem.
13833* recursive-count-words:: Start with case of no words in region.
13834* Counting Exercise::
13835@end menu
13836
13837@node Why Count Words, count-words-region, Counting Words, Counting Words
13838@ifnottex
13839@unnumberedsec Counting words
13840@end ifnottex
13841
13842The standard Emacs distribution contains a function for counting the
13843number of lines within a region. However, there is no corresponding
13844function for counting words.
13845
13846Certain types of writing ask you to count words. Thus, if you write
13847an essay, you may be limited to 800 words; if you write a novel, you
13848may discipline yourself to write 1000 words a day. It seems odd to me
13849that Emacs lacks a word count command. Perhaps people use Emacs
13850mostly for code or types of documentation that do not require word
13851counts; or perhaps they restrict themselves to the operating system
13852word count command, @code{wc}. Alternatively, people may follow
13853the publishers' convention and compute a word count by dividing the
13854number of characters in a document by five. In any event, here are
13855commands to count words.
13856
13857@node count-words-region, recursive-count-words, Why Count Words, Counting Words
13858@comment node-name, next, previous, up
13859@section The @code{count-words-region} Function
13860@findex count-words-region
13861
13862A word count command could count words in a line, paragraph, region,
13863or buffer. What should the command cover? You could design the
13864command to count the number of words in a complete buffer. However,
13865the Emacs tradition encourages flexibility---you may want to count
13866words in just a section, rather than all of a buffer. So it makes
13867more sense to design the command to count the number of words in a
13868region. Once you have a @code{count-words-region} command, you can,
13869if you wish, count words in a whole buffer by marking it with
13870@w{@kbd{C-x h}} (@code{mark-whole-buffer}).
13871
13872Clearly, counting words is a repetitive act: starting from the
13873beginning of the region, you count the first word, then the second
13874word, then the third word, and so on, until you reach the end of the
13875region. This means that word counting is ideally suited to recursion
13876or to a @code{while} loop.
13877
13878@menu
13879* Design count-words-region:: The definition using a @code{while} loop.
13880* Whitespace Bug:: The Whitespace Bug in @code{count-words-region}.
13881@end menu
13882
13883@node Design count-words-region, Whitespace Bug, count-words-region, count-words-region
13884@ifnottex
13885@unnumberedsubsec Designing @code{count-words-region}
13886@end ifnottex
13887
13888First, we will implement the word count command with a @code{while}
13889loop, then with recursion. The command will, of course, be
13890interactive.
13891
13892@need 800
13893The template for an interactive function definition is, as always:
13894
13895@smallexample
13896@group
13897(defun @var{name-of-function} (@var{argument-list})
13898 "@var{documentation}@dots{}"
13899 (@var{interactive-expression}@dots{})
13900 @var{body}@dots{})
13901@end group
13902@end smallexample
13903
13904What we need to do is fill in the slots.
13905
13906The name of the function should be self-explanatory and similar to the
13907existing @code{count-lines-region} name. This makes the name easier
13908to remember. @code{count-words-region} is a good choice.
13909
13910The function counts words within a region. This means that the
13911argument list must contain symbols that are bound to the two
13912positions, the beginning and end of the region. These two positions
13913can be called @samp{beginning} and @samp{end} respectively. The first
13914line of the documentation should be a single sentence, since that is
13915all that is printed as documentation by a command such as
13916@code{apropos}. The interactive expression will be of the form
13917@samp{(interactive "r")}, since that will cause Emacs to pass the
13918beginning and end of the region to the function's argument list. All
13919this is routine.
13920
13921The body of the function needs to be written to do three tasks:
13922first, to set up conditions under which the @code{while} loop can
13923count words, second, to run the @code{while} loop, and third, to send
13924a message to the user.
13925
13926When a user calls @code{count-words-region}, point may be at the
13927beginning or the end of the region. However, the counting process
13928must start at the beginning of the region. This means we will want
13929to put point there if it is not already there. Executing
13930@code{(goto-char beginning)} ensures this. Of course, we will want to
13931return point to its expected position when the function finishes its
13932work. For this reason, the body must be enclosed in a
13933@code{save-excursion} expression.
13934
13935The central part of the body of the function consists of a
13936@code{while} loop in which one expression jumps point forward word by
13937word, and another expression counts those jumps. The true-or-false-test
13938of the @code{while} loop should test true so long as point should jump
13939forward, and false when point is at the end of the region.
13940
13941We could use @code{(forward-word 1)} as the expression for moving point
13942forward word by word, but it is easier to see what Emacs identifies as a
13943`word' if we use a regular expression search.
13944
13945A regular expression search that finds the pattern for which it is
13946searching leaves point after the last character matched. This means
13947that a succession of successful word searches will move point forward
13948word by word.
13949
13950As a practical matter, we want the regular expression search to jump
13951over whitespace and punctuation between words as well as over the
13952words themselves. A regexp that refuses to jump over interword
13953whitespace would never jump more than one word! This means that
13954the regexp should include the whitespace and punctuation that follows
13955a word, if any, as well as the word itself. (A word may end a buffer
13956and not have any following whitespace or punctuation, so that part of
13957the regexp must be optional.)
13958
13959Thus, what we want for the regexp is a pattern defining one or more
13960word constituent characters followed, optionally, by one or more
13961characters that are not word constituents. The regular expression for
13962this is:
13963
13964@smallexample
13965\w+\W*
13966@end smallexample
13967
13968@noindent
13969The buffer's syntax table determines which characters are and are not
13970word constituents. (@xref{Syntax, , What Constitutes a Word or
13971Symbol?}, for more about syntax. Also, see @ref{Syntax, Syntax, The
13972Syntax Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, ,
13973Syntax Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
13974
13975@need 800
13976The search expression looks like this:
13977
13978@smallexample
13979(re-search-forward "\\w+\\W*")
13980@end smallexample
13981
13982@noindent
13983(Note that paired backslashes precede the @samp{w} and @samp{W}. A
13984single backslash has special meaning to the Emacs Lisp interpreter.
13985It indicates that the following character is interpreted differently
13986than usual. For example, the two characters, @samp{\n}, stand for
13987@samp{newline}, rather than for a backslash followed by @samp{n}. Two
13988backslashes in a row stand for an ordinary, `unspecial' backslash, so
13989Emacs Lisp interpreter ends of seeing a single backslash followed by a
13990letter. So it discovers the letter is special.)
13991
13992We need a counter to count how many words there are; this variable
13993must first be set to 0 and then incremented each time Emacs goes
13994around the @code{while} loop. The incrementing expression is simply:
13995
13996@smallexample
13997(setq count (1+ count))
13998@end smallexample
13999
14000Finally, we want to tell the user how many words there are in the
14001region. The @code{message} function is intended for presenting this
14002kind of information to the user. The message has to be phrased so
14003that it reads properly regardless of how many words there are in the
14004region: we don't want to say that ``there are 1 words in the region''.
14005The conflict between singular and plural is ungrammatical. We can
14006solve this problem by using a conditional expression that evaluates
14007different messages depending on the number of words in the region.
14008There are three possibilities: no words in the region, one word in the
14009region, and more than one word. This means that the @code{cond}
14010special form is appropriate.
14011
14012@need 1500
14013All this leads to the following function definition:
14014
14015@smallexample
14016@group
14017;;; @r{First version; has bugs!}
14018(defun count-words-region (beginning end)
14019 "Print number of words in the region.
14020Words are defined as at least one word-constituent
14021character followed by at least one character that
14022is not a word-constituent. The buffer's syntax
14023table determines which characters these are."
14024 (interactive "r")
14025 (message "Counting words in region ... ")
14026@end group
14027
14028@group
14029;;; @r{1. Set up appropriate conditions.}
14030 (save-excursion
14031 (goto-char beginning)
14032 (let ((count 0))
14033@end group
14034
14035@group
14036;;; @r{2. Run the} while @r{loop.}
14037 (while (< (point) end)
14038 (re-search-forward "\\w+\\W*")
14039 (setq count (1+ count)))
14040@end group
14041
14042@group
14043;;; @r{3. Send a message to the user.}
14044 (cond ((zerop count)
14045 (message
14046 "The region does NOT have any words."))
14047 ((= 1 count)
14048 (message
14049 "The region has 1 word."))
14050 (t
14051 (message
14052 "The region has %d words." count))))))
14053@end group
14054@end smallexample
14055
14056@noindent
14057As written, the function works, but not in all circumstances.
14058
14059@node Whitespace Bug, , Design count-words-region, count-words-region
14060@comment node-name, next, previous, up
14061@subsection The Whitespace Bug in @code{count-words-region}
14062
14063The @code{count-words-region} command described in the preceding
14064section has two bugs, or rather, one bug with two manifestations.
14065First, if you mark a region containing only whitespace in the middle
14066of some text, the @code{count-words-region} command tells you that the
14067region contains one word! Second, if you mark a region containing
14068only whitespace at the end of the buffer or the accessible portion of
14069a narrowed buffer, the command displays an error message that looks
14070like this:
14071
14072@smallexample
14073Search failed: "\\w+\\W*"
14074@end smallexample
14075
14076If you are reading this in Info in GNU Emacs, you can test for these
14077bugs yourself.
14078
14079First, evaluate the function in the usual manner to install it.
14080@ifinfo
14081Here is a copy of the definition. Place your cursor after the closing
14082parenthesis and type @kbd{C-x C-e} to install it.
14083
14084@smallexample
14085@group
14086;; @r{First version; has bugs!}
14087(defun count-words-region (beginning end)
14088 "Print number of words in the region.
14089Words are defined as at least one word-constituent character followed
14090by at least one character that is not a word-constituent. The buffer's
14091syntax table determines which characters these are."
14092@end group
14093@group
14094 (interactive "r")
14095 (message "Counting words in region ... ")
14096@end group
14097
14098@group
14099;;; @r{1. Set up appropriate conditions.}
14100 (save-excursion
14101 (goto-char beginning)
14102 (let ((count 0))
14103@end group
14104
14105@group
14106;;; @r{2. Run the} while @r{loop.}
14107 (while (< (point) end)
14108 (re-search-forward "\\w+\\W*")
14109 (setq count (1+ count)))
14110@end group
14111
14112@group
14113;;; @r{3. Send a message to the user.}
14114 (cond ((zerop count)
14115 (message "The region does NOT have any words."))
14116 ((= 1 count) (message "The region has 1 word."))
14117 (t (message "The region has %d words." count))))))
14118@end group
14119@end smallexample
14120@end ifinfo
14121
14122@need 1000
14123If you wish, you can also install this keybinding by evaluating it:
14124
14125@smallexample
14126(global-set-key "\C-c=" 'count-words-region)
14127@end smallexample
14128
14129To conduct the first test, set mark and point to the beginning and end
14130of the following line and then type @kbd{C-c =} (or @kbd{M-x
14131count-words-region} if you have not bound @kbd{C-c =}):
14132
14133@smallexample
14134 one two three
14135@end smallexample
14136
14137@noindent
14138Emacs will tell you, correctly, that the region has three words.
14139
14140Repeat the test, but place mark at the beginning of the line and place
14141point just @emph{before} the word @samp{one}. Again type the command
14142@kbd{C-c =} (or @kbd{M-x count-words-region}). Emacs should tell you
14143that the region has no words, since it is composed only of the
14144whitespace at the beginning of the line. But instead Emacs tells you
14145that the region has one word!
14146
14147For the third test, copy the sample line to the end of the
14148@file{*scratch*} buffer and then type several spaces at the end of the
14149line. Place mark right after the word @samp{three} and point at the
14150end of line. (The end of the line will be the end of the buffer.)
14151Type @kbd{C-c =} (or @kbd{M-x count-words-region}) as you did before.
14152Again, Emacs should tell you that the region has no words, since it is
14153composed only of the whitespace at the end of the line. Instead,
14154Emacs displays an error message saying @samp{Search failed}.
14155
14156The two bugs stem from the same problem.
14157
14158Consider the first manifestation of the bug, in which the command
14159tells you that the whitespace at the beginning of the line contains
14160one word. What happens is this: The @code{M-x count-words-region}
14161command moves point to the beginning of the region. The @code{while}
14162tests whether the value of point is smaller than the value of
14163@code{end}, which it is. Consequently, the regular expression search
14164looks for and finds the first word. It leaves point after the word.
14165@code{count} is set to one. The @code{while} loop repeats; but this
14166time the value of point is larger than the value of @code{end}, the
14167loop is exited; and the function displays a message saying the number
14168of words in the region is one. In brief, the regular expression
14169search looks for and finds the word even though it is outside
14170the marked region.
14171
14172In the second manifestation of the bug, the region is whitespace at
14173the end of the buffer. Emacs says @samp{Search failed}. What happens
14174is that the true-or-false-test in the @code{while} loop tests true, so
14175the search expression is executed. But since there are no more words
14176in the buffer, the search fails.
14177
14178In both manifestations of the bug, the search extends or attempts to
14179extend outside of the region.
14180
14181The solution is to limit the search to the region---this is a fairly
14182simple action, but as you may have come to expect, it is not quite as
14183simple as you might think.
14184
14185As we have seen, the @code{re-search-forward} function takes a search
14186pattern as its first argument. But in addition to this first,
14187mandatory argument, it accepts three optional arguments. The optional
14188second argument bounds the search. The optional third argument, if
14189@code{t}, causes the function to return @code{nil} rather than signal
14190an error if the search fails. The optional fourth argument is a
14191repeat count. (In Emacs, you can see a function's documentation by
14192typing @kbd{C-h f}, the name of the function, and then @key{RET}.)
14193
14194In the @code{count-words-region} definition, the value of the end of
14195the region is held by the variable @code{end} which is passed as an
14196argument to the function. Thus, we can add @code{end} as an argument
14197to the regular expression search expression:
14198
14199@smallexample
14200(re-search-forward "\\w+\\W*" end)
14201@end smallexample
14202
14203However, if you make only this change to the @code{count-words-region}
14204definition and then test the new version of the definition on a
14205stretch of whitespace, you will receive an error message saying
14206@samp{Search failed}.
14207
14208What happens is this: the search is limited to the region, and fails
14209as you expect because there are no word-constituent characters in the
14210region. Since it fails, we receive an error message. But we do not
14211want to receive an error message in this case; we want to receive the
14212message that "The region does NOT have any words."
14213
14214The solution to this problem is to provide @code{re-search-forward}
14215with a third argument of @code{t}, which causes the function to return
14216@code{nil} rather than signal an error if the search fails.
14217
14218However, if you make this change and try it, you will see the message
14219``Counting words in region ... '' and @dots{} you will keep on seeing
14220that message @dots{}, until you type @kbd{C-g} (@code{keyboard-quit}).
14221
14222Here is what happens: the search is limited to the region, as before,
14223and it fails because there are no word-constituent characters in the
14224region, as expected. Consequently, the @code{re-search-forward}
14225expression returns @code{nil}. It does nothing else. In particular,
14226it does not move point, which it does as a side effect if it finds the
14227search target. After the @code{re-search-forward} expression returns
14228@code{nil}, the next expression in the @code{while} loop is evaluated.
14229This expression increments the count. Then the loop repeats. The
14230true-or-false-test tests true because the value of point is still less
14231than the value of end, since the @code{re-search-forward} expression
14232did not move point. @dots{} and the cycle repeats @dots{}
14233
14234The @code{count-words-region} definition requires yet another
14235modification, to cause the true-or-false-test of the @code{while} loop
14236to test false if the search fails. Put another way, there are two
14237conditions that must be satisfied in the true-or-false-test before the
14238word count variable is incremented: point must still be within the
14239region and the search expression must have found a word to count.
14240
14241Since both the first condition and the second condition must be true
14242together, the two expressions, the region test and the search
14243expression, can be joined with an @code{and} special form and embedded in
14244the @code{while} loop as the true-or-false-test, like this:
14245
14246@smallexample
14247(and (< (point) end) (re-search-forward "\\w+\\W*" end t))
14248@end smallexample
14249
14250@c colon in printed section title causes problem in Info cross reference
14251@c also trouble with an overfull hbox
14252@iftex
14253@noindent
14254(For information about @code{and}, see
14255@ref{kill-new function, , The @code{kill-new} function}.)
14256@end iftex
14257@ifinfo
14258@noindent
14259(@xref{kill-new function, , The @code{kill-new} function}, for
14260information about @code{and}.)
14261@end ifinfo
14262
14263The @code{re-search-forward} expression returns @code{t} if the search
14264succeeds and as a side effect moves point. Consequently, as words are
14265found, point is moved through the region. When the search expression
14266fails to find another word, or when point reaches the end of the
14267region, the true-or-false-test tests false, the @code{while} loop
14268exits, and the @code{count-words-region} function displays one or
14269other of its messages.
14270
14271After incorporating these final changes, the @code{count-words-region}
14272works without bugs (or at least, without bugs that I have found!).
14273Here is what it looks like:
14274
14275@smallexample
14276@group
14277;;; @r{Final version:} @code{while}
14278(defun count-words-region (beginning end)
14279 "Print number of words in the region."
14280 (interactive "r")
14281 (message "Counting words in region ... ")
14282@end group
14283
14284@group
14285;;; @r{1. Set up appropriate conditions.}
14286 (save-excursion
14287 (let ((count 0))
14288 (goto-char beginning)
14289@end group
14290
14291@group
14292;;; @r{2. Run the} while @r{loop.}
14293 (while (and (< (point) end)
14294 (re-search-forward "\\w+\\W*" end t))
14295 (setq count (1+ count)))
14296@end group
14297
14298@group
14299;;; @r{3. Send a message to the user.}
14300 (cond ((zerop count)
14301 (message
14302 "The region does NOT have any words."))
14303 ((= 1 count)
14304 (message
14305 "The region has 1 word."))
14306 (t
14307 (message
14308 "The region has %d words." count))))))
14309@end group
14310@end smallexample
14311
14312@node recursive-count-words, Counting Exercise, count-words-region, Counting Words
14313@comment node-name, next, previous, up
14314@section Count Words Recursively
14315@cindex Count words recursively
14316@cindex Recursively counting words
14317@cindex Words, counted recursively
14318
14319You can write the function for counting words recursively as well as
14320with a @code{while} loop. Let's see how this is done.
14321
14322First, we need to recognize that the @code{count-words-region}
14323function has three jobs: it sets up the appropriate conditions for
14324counting to occur; it counts the words in the region; and it sends a
14325message to the user telling how many words there are.
14326
14327If we write a single recursive function to do everything, we will
14328receive a message for every recursive call. If the region contains 13
14329words, we will receive thirteen messages, one right after the other.
14330We don't want this! Instead, we must write two functions to do the
14331job, one of which (the recursive function) will be used inside of the
14332other. One function will set up the conditions and display the
14333message; the other will return the word count.
14334
14335Let us start with the function that causes the message to be displayed.
14336We can continue to call this @code{count-words-region}.
14337
14338This is the function that the user will call. It will be interactive.
14339Indeed, it will be similar to our previous versions of this
14340function, except that it will call @code{recursive-count-words} to
14341determine how many words are in the region.
14342
14343@need 1250
14344We can readily construct a template for this function, based on our
14345previous versions:
14346
14347@smallexample
14348@group
14349;; @r{Recursive version; uses regular expression search}
14350(defun count-words-region (beginning end)
14351 "@var{documentation}@dots{}"
14352 (@var{interactive-expression}@dots{})
14353@end group
14354@group
14355
14356;;; @r{1. Set up appropriate conditions.}
14357 (@var{explanatory message})
14358 (@var{set-up functions}@dots{}
14359@end group
14360@group
14361
14362;;; @r{2. Count the words.}
14363 @var{recursive call}
14364@end group
14365@group
14366
14367;;; @r{3. Send a message to the user.}
14368 @var{message providing word count}))
14369@end group
14370@end smallexample
14371
14372The definition looks straightforward, except that somehow the count
14373returned by the recursive call must be passed to the message
14374displaying the word count. A little thought suggests that this can be
14375done by making use of a @code{let} expression: we can bind a variable
14376in the varlist of a @code{let} expression to the number of words in
14377the region, as returned by the recursive call; and then the
14378@code{cond} expression, using binding, can display the value to the
14379user.
14380
14381Often, one thinks of the binding within a @code{let} expression as
14382somehow secondary to the `primary' work of a function. But in this
14383case, what you might consider the `primary' job of the function,
14384counting words, is done within the @code{let} expression.
14385
14386@need 1250
14387Using @code{let}, the function definition looks like this:
14388
14389@smallexample
14390@group
14391(defun count-words-region (beginning end)
14392 "Print number of words in the region."
14393 (interactive "r")
14394@end group
14395
14396@group
14397;;; @r{1. Set up appropriate conditions.}
14398 (message "Counting words in region ... ")
14399 (save-excursion
14400 (goto-char beginning)
14401@end group
14402
14403@group
14404;;; @r{2. Count the words.}
14405 (let ((count (recursive-count-words end)))
14406@end group
14407
14408@group
14409;;; @r{3. Send a message to the user.}
14410 (cond ((zerop count)
14411 (message
14412 "The region does NOT have any words."))
14413 ((= 1 count)
14414 (message
14415 "The region has 1 word."))
14416 (t
14417 (message
14418 "The region has %d words." count))))))
14419@end group
14420@end smallexample
14421
14422Next, we need to write the recursive counting function.
14423
14424A recursive function has at least three parts: the `do-again-test', the
14425`next-step-expression', and the recursive call.
14426
14427The do-again-test determines whether the function will or will not be
14428called again. Since we are counting words in a region and can use a
14429function that moves point forward for every word, the do-again-test
14430can check whether point is still within the region. The do-again-test
14431should find the value of point and determine whether point is before,
14432at, or after the value of the end of the region. We can use the
14433@code{point} function to locate point. Clearly, we must pass the
14434value of the end of the region to the recursive counting function as an
14435argument.
14436
14437In addition, the do-again-test should also test whether the search finds a
14438word. If it does not, the function should not call itself again.
14439
14440The next-step-expression changes a value so that when the recursive
14441function is supposed to stop calling itself, it stops. More
14442precisely, the next-step-expression changes a value so that at the
14443right time, the do-again-test stops the recursive function from
14444calling itself again. In this case, the next-step-expression can be
14445the expression that moves point forward, word by word.
14446
14447The third part of a recursive function is the recursive call.
14448
14449Somewhere, also, we also need a part that does the `work' of the
14450function, a part that does the counting. A vital part!
14451
14452@need 1250
14453But already, we have an outline of the recursive counting function:
14454
14455@smallexample
14456@group
14457(defun recursive-count-words (region-end)
14458 "@var{documentation}@dots{}"
14459 @var{do-again-test}
14460 @var{next-step-expression}
14461 @var{recursive call})
14462@end group
14463@end smallexample
14464
14465Now we need to fill in the slots. Let's start with the simplest cases
14466first: if point is at or beyond the end of the region, there cannot
14467be any words in the region, so the function should return zero.
14468Likewise, if the search fails, there are no words to count, so the
14469function should return zero.
14470
14471On the other hand, if point is within the region and the search
14472succeeds, the function should call itself again.
14473
14474@need 800
14475Thus, the do-again-test should look like this:
14476
14477@smallexample
14478@group
14479(and (< (point) region-end)
14480 (re-search-forward "\\w+\\W*" region-end t))
14481@end group
14482@end smallexample
14483
14484Note that the search expression is part of the do-again-test---the
14485function returns @code{t} if its search succeeds and @code{nil} if it
14486fails. (@xref{Whitespace Bug, , The Whitespace Bug in
14487@code{count-words-region}}, for an explanation of how
14488@code{re-search-forward} works.)
14489
14490The do-again-test is the true-or-false test of an @code{if} clause.
14491Clearly, if the do-again-test succeeds, the then-part of the @code{if}
14492clause should call the function again; but if it fails, the else-part
14493should return zero since either point is outside the region or the
14494search failed because there were no words to find.
14495
14496But before considering the recursive call, we need to consider the
14497next-step-expression. What is it? Interestingly, it is the search
14498part of the do-again-test.
14499
14500In addition to returning @code{t} or @code{nil} for the
14501do-again-test, @code{re-search-forward} moves point forward as a side
14502effect of a successful search. This is the action that changes the
14503value of point so that the recursive function stops calling itself
14504when point completes its movement through the region. Consequently,
14505the @code{re-search-forward} expression is the next-step-expression.
14506
14507@need 1200
14508In outline, then, the body of the @code{recursive-count-words}
14509function looks like this:
14510
14511@smallexample
14512@group
14513(if @var{do-again-test-and-next-step-combined}
14514 ;; @r{then}
14515 @var{recursive-call-returning-count}
14516 ;; @r{else}
14517 @var{return-zero})
14518@end group
14519@end smallexample
14520
14521How to incorporate the mechanism that counts?
14522
14523If you are not used to writing recursive functions, a question like
14524this can be troublesome. But it can and should be approached
14525systematically.
14526
14527We know that the counting mechanism should be associated in some way
14528with the recursive call. Indeed, since the next-step-expression moves
14529point forward by one word, and since a recursive call is made for
14530each word, the counting mechanism must be an expression that adds one
14531to the value returned by a call to @code{recursive-count-words}.
14532
14533@need 800
14534Consider several cases:
14535
14536@itemize @bullet
14537@item
14538If there are two words in the region, the function should return
14539a value resulting from adding one to the value returned when it counts
14540the first word, plus the number returned when it counts the remaining
14541words in the region, which in this case is one.
14542
14543@item
14544If there is one word in the region, the function should return
14545a value resulting from adding one to the value returned when it counts
14546that word, plus the number returned when it counts the remaining
14547words in the region, which in this case is zero.
14548
14549@item
14550If there are no words in the region, the function should return zero.
14551@end itemize
14552
14553From the sketch we can see that the else-part of the @code{if} returns
14554zero for the case of no words. This means that the then-part of the
14555@code{if} must return a value resulting from adding one to the value
14556returned from a count of the remaining words.
14557
14558@need 1200
14559The expression will look like this, where @code{1+} is a function that
14560adds one to its argument.
14561
14562@smallexample
14563(1+ (recursive-count-words region-end))
14564@end smallexample
14565
14566@need 1200
14567The whole @code{recursive-count-words} function will then look like
14568this:
14569
14570@smallexample
14571@group
14572(defun recursive-count-words (region-end)
14573 "@var{documentation}@dots{}"
14574
14575;;; @r{1. do-again-test}
14576 (if (and (< (point) region-end)
14577 (re-search-forward "\\w+\\W*" region-end t))
14578@end group
14579
14580@group
14581;;; @r{2. then-part: the recursive call}
14582 (1+ (recursive-count-words region-end))
14583
14584;;; @r{3. else-part}
14585 0))
14586@end group
14587@end smallexample
14588
14589@need 1250
14590Let's examine how this works:
14591
14592If there are no words in the region, the else part of the @code{if}
14593expression is evaluated and consequently the function returns zero.
14594
14595If there is one word in the region, the value of point is less than
14596the value of @code{region-end} and the search succeeds. In this case,
14597the true-or-false-test of the @code{if} expression tests true, and the
14598then-part of the @code{if} expression is evaluated. The counting
14599expression is evaluated. This expression returns a value (which will
14600be the value returned by the whole function) that is the sum of one
14601added to the value returned by a recursive call.
14602
14603Meanwhile, the next-step-expression has caused point to jump over the
14604first (and in this case only) word in the region. This means that
14605when @code{(recursive-count-words region-end)} is evaluated a second
14606time, as a result of the recursive call, the value of point will be
14607equal to or greater than the value of region end. So this time,
14608@code{recursive-count-words} will return zero. The zero will be added
14609to one, and the original evaluation of @code{recursive-count-words}
14610will return one plus zero, which is one, which is the correct amount.
14611
14612Clearly, if there are two words in the region, the first call to
14613@code{recursive-count-words} returns one added to the value returned
14614by calling @code{recursive-count-words} on a region containing the
14615remaining word---that is, it adds one to one, producing two, which is
14616the correct amount.
14617
14618Similarly, if there are three words in the region, the first call to
14619@code{recursive-count-words} returns one added to the value returned
14620by calling @code{recursive-count-words} on a region containing the
14621remaining two words---and so on and so on.
14622
14623@need 1250
14624@noindent
14625With full documentation the two functions look like this:
14626
14627@need 1250
14628@noindent
14629The recursive function:
14630
14631@findex recursive-count-words
14632@smallexample
14633@group
14634(defun recursive-count-words (region-end)
14635 "Number of words between point and REGION-END."
14636@end group
14637
14638@group
14639;;; @r{1. do-again-test}
14640 (if (and (< (point) region-end)
14641 (re-search-forward "\\w+\\W*" region-end t))
14642@end group
14643
14644@group
14645;;; @r{2. then-part: the recursive call}
14646 (1+ (recursive-count-words region-end))
14647
14648;;; @r{3. else-part}
14649 0))
14650@end group
14651@end smallexample
14652
14653@need 800
14654@noindent
14655The wrapper:
14656
14657@smallexample
14658@group
14659;;; @r{Recursive version}
14660(defun count-words-region (beginning end)
14661 "Print number of words in the region.
14662@end group
14663
14664@group
14665Words are defined as at least one word-constituent
14666character followed by at least one character that is
14667not a word-constituent. The buffer's syntax table
14668determines which characters these are."
14669@end group
14670@group
14671 (interactive "r")
14672 (message "Counting words in region ... ")
14673 (save-excursion
14674 (goto-char beginning)
14675 (let ((count (recursive-count-words end)))
14676@end group
14677@group
14678 (cond ((zerop count)
14679 (message
14680 "The region does NOT have any words."))
14681@end group
14682@group
14683 ((= 1 count)
14684 (message "The region has 1 word."))
14685 (t
14686 (message
14687 "The region has %d words." count))))))
14688@end group
14689@end smallexample
14690
14691@node Counting Exercise, , recursive-count-words, Counting Words
14692@section Exercise: Counting Punctuation
14693
14694Using a @code{while} loop, write a function to count the number of
14695punctuation marks in a region---period, comma, semicolon, colon,
14696exclamation mark, and question mark. Do the same using recursion.
14697
14698@node Words in a defun, Readying a Graph, Counting Words, Top
14699@chapter Counting Words in a @code{defun}
14700@cindex Counting words in a @code{defun}
14701@cindex Word counting in a @code{defun}
14702
14703Our next project is to count the number of words in a function
14704definition. Clearly, this can be done using some variant of
14705@code{count-word-region}. @xref{Counting Words, , Counting Words:
14706Repetition and Regexps}. If we are just going to count the words in
14707one definition, it is easy enough to mark the definition with the
14708@kbd{C-M-h} (@code{mark-defun}) command, and then call
14709@code{count-word-region}.
14710
14711However, I am more ambitious: I want to count the words and symbols in
14712every definition in the Emacs sources and then print a graph that
14713shows how many functions there are of each length: how many contain 40
14714to 49 words or symbols, how many contain 50 to 59 words or symbols,
14715and so on. I have often been curious how long a typical function is,
14716and this will tell.
14717
14718@menu
14719* Divide and Conquer::
14720* Words and Symbols:: What to count?
14721* Syntax:: What constitutes a word or symbol?
14722* count-words-in-defun:: Very like @code{count-words}.
14723* Several defuns:: Counting several defuns in a file.
14724* Find a File:: Do you want to look at a file?
14725* lengths-list-file:: A list of the lengths of many definitions.
14726* Several files:: Counting in definitions in different files.
14727* Several files recursively:: Recursively counting in different files.
14728* Prepare the data:: Prepare the data for display in a graph.
14729@end menu
14730
14731@node Divide and Conquer, Words and Symbols, Words in a defun, Words in a defun
14732@ifnottex
14733@unnumberedsec Divide and Conquer
14734@end ifnottex
14735
14736Described in one phrase, the histogram project is daunting; but
14737divided into numerous small steps, each of which we can take one at a
14738time, the project becomes less fearsome. Let us consider what the
14739steps must be:
14740
14741@itemize @bullet
14742@item
14743First, write a function to count the words in one definition. This
14744includes the problem of handling symbols as well as words.
14745
14746@item
14747Second, write a function to list the numbers of words in each function
14748in a file. This function can use the @code{count-words-in-defun}
14749function.
14750
14751@item
14752Third, write a function to list the numbers of words in each function
14753in each of several files. This entails automatically finding the
14754various files, switching to them, and counting the words in the
14755definitions within them.
14756
14757@item
14758Fourth, write a function to convert the list of numbers that we
14759created in step three to a form that will be suitable for printing as
14760a graph.
14761
14762@item
14763Fifth, write a function to print the results as a graph.
14764@end itemize
14765
14766This is quite a project! But if we take each step slowly, it will not
14767be difficult.
14768
14769@node Words and Symbols, Syntax, Divide and Conquer, Words in a defun
14770@section What to Count?
14771@cindex Words and symbols in defun
14772
14773When we first start thinking about how to count the words in a
14774function definition, the first question is (or ought to be) what are
14775we going to count? When we speak of `words' with respect to a Lisp
14776function definition, we are actually speaking, in large part, of
14777`symbols'. For example, the following @code{multiply-by-seven}
14778function contains the five symbols @code{defun},
14779@code{multiply-by-seven}, @code{number}, @code{*}, and @code{7}. In
14780addition, in the documentation string, it contains the four words
14781@samp{Multiply}, @samp{NUMBER}, @samp{by}, and @samp{seven}. The
14782symbol @samp{number} is repeated, so the definition contains a total
14783of ten words and symbols.
14784
14785@smallexample
14786@group
14787(defun multiply-by-seven (number)
14788 "Multiply NUMBER by seven."
14789 (* 7 number))
14790@end group
14791@end smallexample
14792
14793@noindent
14794However, if we mark the @code{multiply-by-seven} definition with
14795@kbd{C-M-h} (@code{mark-defun}), and then call
14796@code{count-words-region} on it, we will find that
14797@code{count-words-region} claims the definition has eleven words, not
14798ten! Something is wrong!
14799
14800The problem is twofold: @code{count-words-region} does not count the
14801@samp{*} as a word, and it counts the single symbol,
14802@code{multiply-by-seven}, as containing three words. The hyphens are
14803treated as if they were interword spaces rather than intraword
14804connectors: @samp{multiply-by-seven} is counted as if it were written
14805@samp{multiply by seven}.
14806
14807The cause of this confusion is the regular expression search within
14808the @code{count-words-region} definition that moves point forward word
14809by word. In the canonical version of @code{count-words-region}, the
14810regexp is:
14811
14812@smallexample
14813"\\w+\\W*"
14814@end smallexample
14815
14816@noindent
14817This regular expression is a pattern defining one or more word
14818constituent characters possibly followed by one or more characters
14819that are not word constituents. What is meant by `word constituent
14820characters' brings us to the issue of syntax, which is worth a section
14821of its own.
14822
14823@node Syntax, count-words-in-defun, Words and Symbols, Words in a defun
14824@section What Constitutes a Word or Symbol?
14825@cindex Syntax categories and tables
14826
14827Emacs treats different characters as belonging to different
14828@dfn{syntax categories}. For example, the regular expression,
14829@samp{\\w+}, is a pattern specifying one or more @emph{word
14830constituent} characters. Word constituent characters are members of
14831one syntax category. Other syntax categories include the class of
14832punctuation characters, such as the period and the comma, and the
14833class of whitespace characters, such as the blank space and the tab
14834character. (For more information, see @ref{Syntax, Syntax, The Syntax
14835Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, , Syntax
14836Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
14837
14838Syntax tables specify which characters belong to which categories.
14839Usually, a hyphen is not specified as a `word constituent character'.
14840Instead, it is specified as being in the `class of characters that are
14841part of symbol names but not words.' This means that the
14842@code{count-words-region} function treats it in the same way it treats
14843an interword white space, which is why @code{count-words-region}
14844counts @samp{multiply-by-seven} as three words.
14845
14846There are two ways to cause Emacs to count @samp{multiply-by-seven} as
14847one symbol: modify the syntax table or modify the regular expression.
14848
14849We could redefine a hyphen as a word constituent character by
14850modifying the syntax table that Emacs keeps for each mode. This
14851action would serve our purpose, except that a hyphen is merely the
14852most common character within symbols that is not typically a word
14853constituent character; there are others, too.
14854
14855Alternatively, we can redefine the regular expression used in the
14856@code{count-words} definition so as to include symbols. This
14857procedure has the merit of clarity, but the task is a little tricky.
14858
14859@need 1200
14860The first part is simple enough: the pattern must match ``at least one
14861character that is a word or symbol constituent''. Thus:
14862
14863@smallexample
14864"\\(\\w\\|\\s_\\)+"
14865@end smallexample
14866
14867@noindent
14868The @samp{\\(} is the first part of the grouping construct that
14869includes the @samp{\\w} and the @samp{\\s_} as alternatives, separated
14870by the @samp{\\|}. The @samp{\\w} matches any word-constituent
14871character and the @samp{\\s_} matches any character that is part of a
14872symbol name but not a word-constituent character. The @samp{+}
14873following the group indicates that the word or symbol constituent
14874characters must be matched at least once.
14875
14876However, the second part of the regexp is more difficult to design.
14877What we want is to follow the first part with ``optionally one or more
14878characters that are not constituents of a word or symbol''. At first,
14879I thought I could define this with the following:
14880
14881@smallexample
14882"\\(\\W\\|\\S_\\)*"
14883@end smallexample
14884
14885@noindent
14886The upper case @samp{W} and @samp{S} match characters that are
14887@emph{not} word or symbol constituents. Unfortunately, this
14888expression matches any character that is either not a word constituent
14889or not a symbol constituent. This matches any character!
14890
14891I then noticed that every word or symbol in my test region was
14892followed by white space (blank space, tab, or newline). So I tried
14893placing a pattern to match one or more blank spaces after the pattern
14894for one or more word or symbol constituents. This failed, too. Words
14895and symbols are often separated by whitespace, but in actual code
14896parentheses may follow symbols and punctuation may follow words. So
14897finally, I designed a pattern in which the word or symbol constituents
14898are followed optionally by characters that are not white space and
14899then followed optionally by white space.
14900
14901@need 800
14902Here is the full regular expression:
14903
14904@smallexample
14905"\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
14906@end smallexample
14907
14908@node count-words-in-defun, Several defuns, Syntax, Words in a defun
14909@section The @code{count-words-in-defun} Function
14910@cindex Counting words in a @code{defun}
14911
14912We have seen that there are several ways to write a
14913@code{count-word-region} function. To write a
14914@code{count-words-in-defun}, we need merely adapt one of these
14915versions.
14916
14917The version that uses a @code{while} loop is easy to understand, so I
14918am going to adapt that. Because @code{count-words-in-defun} will be
14919part of a more complex program, it need not be interactive and it need
14920not display a message but just return the count. These considerations
14921simplify the definition a little.
14922
14923On the other hand, @code{count-words-in-defun} will be used within a
14924buffer that contains function definitions. Consequently, it is
14925reasonable to ask that the function determine whether it is called
14926when point is within a function definition, and if it is, to return
14927the count for that definition. This adds complexity to the
14928definition, but saves us from needing to pass arguments to the
14929function.
14930
14931@need 1250
14932These considerations lead us to prepare the following template:
14933
14934@smallexample
14935@group
14936(defun count-words-in-defun ()
14937 "@var{documentation}@dots{}"
14938 (@var{set up}@dots{}
14939 (@var{while loop}@dots{})
14940 @var{return count})
14941@end group
14942@end smallexample
14943
14944@noindent
14945As usual, our job is to fill in the slots.
14946
14947First, the set up.
14948
14949We are presuming that this function will be called within a buffer
14950containing function definitions. Point will either be within a
14951function definition or not. For @code{count-words-in-defun} to work,
14952point must move to the beginning of the definition, a counter must
14953start at zero, and the counting loop must stop when point reaches the
14954end of the definition.
14955
14956The @code{beginning-of-defun} function searches backwards for an
14957opening delimiter such as a @samp{(} at the beginning of a line, and
14958moves point to that position, or else to the limit of the search. In
14959practice, this means that @code{beginning-of-defun} moves point to the
14960beginning of an enclosing or preceding function definition, or else to
14961the beginning of the buffer. We can use @code{beginning-of-defun} to
14962place point where we wish to start.
14963
14964The @code{while} loop requires a counter to keep track of the words or
14965symbols being counted. A @code{let} expression can be used to create
14966a local variable for this purpose, and bind it to an initial value of zero.
14967
14968The @code{end-of-defun} function works like @code{beginning-of-defun}
14969except that it moves point to the end of the definition.
14970@code{end-of-defun} can be used as part of an expression that
14971determines the position of the end of the definition.
14972
14973The set up for @code{count-words-in-defun} takes shape rapidly: first
14974we move point to the beginning of the definition, then we create a
14975local variable to hold the count, and finally, we record the position
14976of the end of the definition so the @code{while} loop will know when to stop
14977looping.
14978
14979@need 1250
14980The code looks like this:
14981
14982@smallexample
14983@group
14984(beginning-of-defun)
14985(let ((count 0)
14986 (end (save-excursion (end-of-defun) (point))))
14987@end group
14988@end smallexample
14989
14990@noindent
14991The code is simple. The only slight complication is likely to concern
14992@code{end}: it is bound to the position of the end of the definition
14993by a @code{save-excursion} expression that returns the value of point
14994after @code{end-of-defun} temporarily moves it to the end of the
14995definition.
14996
14997The second part of the @code{count-words-in-defun}, after the set up,
14998is the @code{while} loop.
14999
15000The loop must contain an expression that jumps point forward word by
15001word and symbol by symbol, and another expression that counts the
15002jumps. The true-or-false-test for the @code{while} loop should test
15003true so long as point should jump forward, and false when point is at
15004the end of the definition. We have already redefined the regular
15005expression for this (@pxref{Syntax}), so the loop is straightforward:
15006
15007@smallexample
15008@group
15009(while (and (< (point) end)
15010 (re-search-forward
15011 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*" end t)
15012 (setq count (1+ count)))
15013@end group
15014@end smallexample
15015
15016The third part of the function definition returns the count of words
15017and symbols. This part is the last expression within the body of the
15018@code{let} expression, and can be, very simply, the local variable
15019@code{count}, which when evaluated returns the count.
15020
15021@need 1250
15022Put together, the @code{count-words-in-defun} definition looks like this:
15023
15024@findex count-words-in-defun
15025@smallexample
15026@group
15027(defun count-words-in-defun ()
15028 "Return the number of words and symbols in a defun."
15029 (beginning-of-defun)
15030 (let ((count 0)
15031 (end (save-excursion (end-of-defun) (point))))
15032@end group
15033@group
15034 (while
15035 (and (< (point) end)
15036 (re-search-forward
15037 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
15038 end t))
15039 (setq count (1+ count)))
15040 count))
15041@end group
15042@end smallexample
15043
15044How to test this? The function is not interactive, but it is easy to
15045put a wrapper around the function to make it interactive; we can use
15046almost the same code as for the recursive version of
15047@code{count-words-region}:
15048
15049@smallexample
15050@group
15051;;; @r{Interactive version.}
15052(defun count-words-defun ()
15053 "Number of words and symbols in a function definition."
15054 (interactive)
15055 (message
15056 "Counting words and symbols in function definition ... ")
15057@end group
15058@group
15059 (let ((count (count-words-in-defun)))
15060 (cond
15061 ((zerop count)
15062 (message
15063 "The definition does NOT have any words or symbols."))
15064@end group
15065@group
15066 ((= 1 count)
15067 (message
15068 "The definition has 1 word or symbol."))
15069 (t
15070 (message
15071 "The definition has %d words or symbols." count)))))
15072@end group
15073@end smallexample
15074
15075@need 800
15076@noindent
15077Let's re-use @kbd{C-c =} as a convenient keybinding:
15078
15079@smallexample
15080(global-set-key "\C-c=" 'count-words-defun)
15081@end smallexample
15082
15083Now we can try out @code{count-words-defun}: install both
15084@code{count-words-in-defun} and @code{count-words-defun}, and set the
15085keybinding, and then place the cursor within the following definition:
15086
15087@smallexample
15088@group
15089(defun multiply-by-seven (number)
15090 "Multiply NUMBER by seven."
15091 (* 7 number))
15092 @result{} 10
15093@end group
15094@end smallexample
15095
15096@noindent
15097Success! The definition has 10 words and symbols.
15098
15099The next problem is to count the numbers of words and symbols in
15100several definitions within a single file.
15101
15102@node Several defuns, Find a File, count-words-in-defun, Words in a defun
15103@section Count Several @code{defuns} Within a File
15104
15105A file such as @file{simple.el} may have a hundred or more function
15106definitions within it. Our long term goal is to collect statistics on
15107many files, but as a first step, our immediate goal is to collect
15108statistics on one file.
15109
15110The information will be a series of numbers, each number being the
15111length of a function definition. We can store the numbers in a list.
15112
15113We know that we will want to incorporate the information regarding one
15114file with information about many other files; this means that the
15115function for counting definition lengths within one file need only
15116return the list of lengths. It need not and should not display any
15117messages.
15118
15119The word count commands contain one expression to jump point forward
15120word by word and another expression to count the jumps. The function
15121to return the lengths of definitions can be designed to work the same
15122way, with one expression to jump point forward definition by
15123definition and another expression to construct the lengths' list.
15124
15125This statement of the problem makes it elementary to write the
15126function definition. Clearly, we will start the count at the
15127beginning of the file, so the first command will be @code{(goto-char
15128(point-min))}. Next, we start the @code{while} loop; and the
15129true-or-false test of the loop can be a regular expression search for
15130the next function definition---so long as the search succeeds, point
15131is moved forward and then the body of the loop is evaluated. The body
15132needs an expression that constructs the lengths' list. @code{cons},
15133the list construction command, can be used to create the list. That
15134is almost all there is to it.
15135
15136@need 800
15137Here is what this fragment of code looks like:
15138
15139@smallexample
15140@group
15141(goto-char (point-min))
15142(while (re-search-forward "^(defun" nil t)
15143 (setq lengths-list
15144 (cons (count-words-in-defun) lengths-list)))
15145@end group
15146@end smallexample
15147
15148What we have left out is the mechanism for finding the file that
15149contains the function definitions.
15150
15151In previous examples, we either used this, the Info file, or we
15152switched back and forth to some other buffer, such as the
15153@file{*scratch*} buffer.
15154
15155Finding a file is a new process that we have not yet discussed.
15156
15157@node Find a File, lengths-list-file, Several defuns, Words in a defun
15158@comment node-name, next, previous, up
15159@section Find a File
15160@cindex Find a File
15161
15162To find a file in Emacs, you use the @kbd{C-x C-f} (@code{find-file})
15163command. This command is almost, but not quite right for the lengths
15164problem.
15165
15166@need 1200
15167Let's look at the source for @code{find-file}:
15168
15169@smallexample
15170@group
15171(defun find-file (filename)
15172 "Edit file FILENAME.
15173Switch to a buffer visiting file FILENAME,
15174creating one if none already exists."
15175 (interactive "FFind file: ")
15176 (switch-to-buffer (find-file-noselect filename)))
15177@end group
15178@end smallexample
15179
15180@noindent
15181(The most recent version of the @code{find-file} function definition
15182permits you to specify optional wildcards to visit multiple files; that
15183makes the definition more complex and we will not discuss it here,
15184since it is not relevant. You can see its source using either
15185@kbd{M-.} (@code{find-tag}) or @kbd{C-h f} (@code{describe-function}).)
15186
15187@ignore
15188In Emacs 22
15189(defun find-file (filename &optional wildcards)
15190 "Edit file FILENAME.
15191Switch to a buffer visiting file FILENAME,
15192creating one if none already exists.
15193Interactively, the default if you just type RET is the current directory,
15194but the visited file name is available through the minibuffer history:
15195type M-n to pull it into the minibuffer.
15196
15197Interactively, or if WILDCARDS is non-nil in a call from Lisp,
15198expand wildcards (if any) and visit multiple files. You can
15199suppress wildcard expansion by setting `find-file-wildcards' to nil.
15200
15201To visit a file without any kind of conversion and without
15202automatically choosing a major mode, use \\[find-file-literally]."
15203 (interactive (find-file-read-args "Find file: " nil))
15204 (let ((value (find-file-noselect filename nil nil wildcards)))
15205 (if (listp value)
15206 (mapcar 'switch-to-buffer (nreverse value))
15207 (switch-to-buffer value))))
15208@end ignore
15209
15210The definition I am showing possesses short but complete documentation
15211and an interactive specification that prompts you for a file name when
15212you use the command interactively. The body of the definition
15213contains two functions, @code{find-file-noselect} and
15214@code{switch-to-buffer}.
15215
15216According to its documentation as shown by @kbd{C-h f} (the
15217@code{describe-function} command), the @code{find-file-noselect}
15218function reads the named file into a buffer and returns the buffer.
15219(Its most recent version includes an optional wildcards argument,
15220too, as well as another to read a file literally and an other you
15221suppress warning messages. These optional arguments are irrelevant.)
15222
15223However, the @code{find-file-noselect} function does not select the
15224buffer in which it puts the file. Emacs does not switch its attention
15225(or yours if you are using @code{find-file-noselect}) to the selected
15226buffer. That is what @code{switch-to-buffer} does: it switches the
15227buffer to which Emacs attention is directed; and it switches the
15228buffer displayed in the window to the new buffer. We have discussed
15229buffer switching elsewhere. (@xref{Switching Buffers}.)
15230
15231In this histogram project, we do not need to display each file on the
15232screen as the program determines the length of each definition within
15233it. Instead of employing @code{switch-to-buffer}, we can work with
15234@code{set-buffer}, which redirects the attention of the computer
15235program to a different buffer but does not redisplay it on the screen.
15236So instead of calling on @code{find-file} to do the job, we must write
15237our own expression.
15238
15239The task is easy: use @code{find-file-noselect} and @code{set-buffer}.
15240
15241@node lengths-list-file, Several files, Find a File, Words in a defun
15242@section @code{lengths-list-file} in Detail
15243
15244The core of the @code{lengths-list-file} function is a @code{while}
15245loop containing a function to move point forward `defun by defun' and
15246a function to count the number of words and symbols in each defun.
15247This core must be surrounded by functions that do various other tasks,
15248including finding the file, and ensuring that point starts out at the
15249beginning of the file. The function definition looks like this:
15250@findex lengths-list-file
15251
15252@smallexample
15253@group
15254(defun lengths-list-file (filename)
15255 "Return list of definitions' lengths within FILE.
15256The returned list is a list of numbers.
15257Each number is the number of words or
15258symbols in one function definition."
15259@end group
15260@group
15261 (message "Working on `%s' ... " filename)
15262 (save-excursion
15263 (let ((buffer (find-file-noselect filename))
15264 (lengths-list))
15265 (set-buffer buffer)
15266 (setq buffer-read-only t)
15267 (widen)
15268 (goto-char (point-min))
15269 (while (re-search-forward "^(defun" nil t)
15270 (setq lengths-list
15271 (cons (count-words-in-defun) lengths-list)))
15272 (kill-buffer buffer)
15273 lengths-list)))
15274@end group
15275@end smallexample
15276
15277@noindent
15278The function is passed one argument, the name of the file on which it
15279will work. It has four lines of documentation, but no interactive
15280specification. Since people worry that a computer is broken if they
15281don't see anything going on, the first line of the body is a
15282message.
15283
15284The next line contains a @code{save-excursion} that returns Emacs'
15285attention to the current buffer when the function completes. This is
15286useful in case you embed this function in another function that
15287presumes point is restored to the original buffer.
15288
15289In the varlist of the @code{let} expression, Emacs finds the file and
15290binds the local variable @code{buffer} to the buffer containing the
15291file. At the same time, Emacs creates @code{lengths-list} as a local
15292variable.
15293
15294Next, Emacs switches its attention to the buffer.
15295
15296In the following line, Emacs makes the buffer read-only. Ideally,
15297this line is not necessary. None of the functions for counting words
15298and symbols in a function definition should change the buffer.
15299Besides, the buffer is not going to be saved, even if it were changed.
15300This line is entirely the consequence of great, perhaps excessive,
15301caution. The reason for the caution is that this function and those
15302it calls work on the sources for Emacs and it is inconvenient if they
15303are inadvertently modified. It goes without saying that I did not
15304realize a need for this line until an experiment went awry and started
15305to modify my Emacs source files @dots{}
15306
15307Next comes a call to widen the buffer if it is narrowed. This
15308function is usually not needed---Emacs creates a fresh buffer if none
15309already exists; but if a buffer visiting the file already exists Emacs
15310returns that one. In this case, the buffer may be narrowed and must
15311be widened. If we wanted to be fully `user-friendly', we would
15312arrange to save the restriction and the location of point, but we
15313won't.
15314
15315The @code{(goto-char (point-min))} expression moves point to the
15316beginning of the buffer.
15317
15318Then comes a @code{while} loop in which the `work' of the function is
15319carried out. In the loop, Emacs determines the length of each
15320definition and constructs a lengths' list containing the information.
15321
15322Emacs kills the buffer after working through it. This is to save
15323space inside of Emacs. My version of GNU Emacs 19 contained over 300
15324source files of interest; GNU Emacs 22 contains over a thousand source
15325files. Another function will apply @code{lengths-list-file} to each
15326of the files.
15327
15328Finally, the last expression within the @code{let} expression is the
15329@code{lengths-list} variable; its value is returned as the value of
15330the whole function.
15331
15332You can try this function by installing it in the usual fashion. Then
15333place your cursor after the following expression and type @kbd{C-x
15334C-e} (@code{eval-last-sexp}).
15335
15336@c !!! 22.1.1 lisp sources location here
15337@smallexample
15338(lengths-list-file
15339 "/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el")
15340@end smallexample
15341
15342@noindent
15343(You may need to change the pathname of the file; the one here is for
15344GNU Emacs version 22.1.1. To change the expression, copy it to
15345the @file{*scratch*} buffer and edit it.
15346
15347@need 1200
15348@noindent
15349(Also, to see the full length of the list, rather than a truncated
15350version, you may have to evaluate the following:
15351
15352@smallexample
15353(custom-set-variables '(eval-expression-print-length nil))
15354@end smallexample
15355
15356@noindent
15357(@xref{defcustom, , Specifying Variables using @code{defcustom}}.
15358Then evaluate the @code{lengths-list-file} expression.)
15359
15360@need 1200
15361The lengths' list for @file{debug.el} takes less than a second to
15362produce and looks like this in GNU Emacs 22:
15363
15364@smallexample
15365(83 113 105 144 289 22 30 97 48 89 25 52 52 88 28 29 77 49 43 290 232 587)
15366@end smallexample
15367
15368@need 1500
15369(Using my old machine, the version 19 lengths' list for @file{debug.el}
15370took seven seconds to produce and looked like this:
15371
15372@smallexample
15373(75 41 80 62 20 45 44 68 45 12 34 235)
15374@end smallexample
15375
15376(The newer version of @file{debug.el} contains more defuns than the
15377earlier one; and my new machine is much faster than the old one.)
15378
15379Note that the length of the last definition in the file is first in
15380the list.
15381
15382@node Several files, Several files recursively, lengths-list-file, Words in a defun
15383@section Count Words in @code{defuns} in Different Files
15384
15385In the previous section, we created a function that returns a list of
15386the lengths of each definition in a file. Now, we want to define a
15387function to return a master list of the lengths of the definitions in
15388a list of files.
15389
15390Working on each of a list of files is a repetitious act, so we can use
15391either a @code{while} loop or recursion.
15392
15393@menu
15394* lengths-list-many-files:: Return a list of the lengths of defuns.
15395* append:: Attach one list to another.
15396@end menu
15397
15398@node lengths-list-many-files, append, Several files, Several files
15399@ifnottex
15400@unnumberedsubsec Determine the lengths of @code{defuns}
15401@end ifnottex
15402
15403The design using a @code{while} loop is routine. The argument passed
15404the function is a list of files. As we saw earlier (@pxref{Loop
15405Example}), you can write a @code{while} loop so that the body of the
15406loop is evaluated if such a list contains elements, but to exit the
15407loop if the list is empty. For this design to work, the body of the
15408loop must contain an expression that shortens the list each time the
15409body is evaluated, so that eventually the list is empty. The usual
15410technique is to set the value of the list to the value of the @sc{cdr}
15411of the list each time the body is evaluated.
15412
15413@need 800
15414The template looks like this:
15415
15416@smallexample
15417@group
15418(while @var{test-whether-list-is-empty}
15419 @var{body}@dots{}
15420 @var{set-list-to-cdr-of-list})
15421@end group
15422@end smallexample
15423
15424Also, we remember that a @code{while} loop returns @code{nil} (the
15425result of evaluating the true-or-false-test), not the result of any
15426evaluation within its body. (The evaluations within the body of the
15427loop are done for their side effects.) However, the expression that
15428sets the lengths' list is part of the body---and that is the value
15429that we want returned by the function as a whole. To do this, we
15430enclose the @code{while} loop within a @code{let} expression, and
15431arrange that the last element of the @code{let} expression contains
15432the value of the lengths' list. (@xref{Incrementing Example, , Loop
15433Example with an Incrementing Counter}.)
15434
15435@findex lengths-list-many-files
15436@need 1250
15437These considerations lead us directly to the function itself:
15438
15439@smallexample
15440@group
15441;;; @r{Use @code{while} loop.}
15442(defun lengths-list-many-files (list-of-files)
15443 "Return list of lengths of defuns in LIST-OF-FILES."
15444@end group
15445@group
15446 (let (lengths-list)
15447
15448;;; @r{true-or-false-test}
15449 (while list-of-files
15450 (setq lengths-list
15451 (append
15452 lengths-list
15453
15454;;; @r{Generate a lengths' list.}
15455 (lengths-list-file
15456 (expand-file-name (car list-of-files)))))
15457@end group
15458
15459@group
15460;;; @r{Make files' list shorter.}
15461 (setq list-of-files (cdr list-of-files)))
15462
15463;;; @r{Return final value of lengths' list.}
15464 lengths-list))
15465@end group
15466@end smallexample
15467
15468@code{expand-file-name} is a built-in function that converts a file
15469name to the absolute, long, path name form. The function employs the
15470name of the directory in which the function is called.
15471
15472@c !!! 22.1.1 lisp sources location here
15473@need 1500
15474Thus, if @code{expand-file-name} is called on @code{debug.el} when
15475Emacs is visiting the
15476@file{/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/} directory,
15477
15478@smallexample
15479debug.el
15480@end smallexample
15481
15482@need 800
15483@noindent
15484becomes
15485
15486@c !!! 22.1.1 lisp sources location here
15487@smallexample
15488/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el
15489@end smallexample
15490
15491The only other new element of this function definition is the as yet
15492unstudied function @code{append}, which merits a short section for
15493itself.
15494
15495@node append, , lengths-list-many-files, Several files
15496@subsection The @code{append} Function
15497
15498@need 800
15499The @code{append} function attaches one list to another. Thus,
15500
15501@smallexample
15502(append '(1 2 3 4) '(5 6 7 8))
15503@end smallexample
15504
15505@need 800
15506@noindent
15507produces the list
15508
15509@smallexample
15510(1 2 3 4 5 6 7 8)
15511@end smallexample
15512
15513This is exactly how we want to attach two lengths' lists produced by
15514@code{lengths-list-file} to each other. The results contrast with
15515@code{cons},
15516
15517@smallexample
15518(cons '(1 2 3 4) '(5 6 7 8))
15519@end smallexample
15520
15521@need 1250
15522@noindent
15523which constructs a new list in which the first argument to @code{cons}
15524becomes the first element of the new list:
15525
15526@smallexample
15527((1 2 3 4) 5 6 7 8)
15528@end smallexample
15529
15530@node Several files recursively, Prepare the data, Several files, Words in a defun
15531@section Recursively Count Words in Different Files
15532
15533Besides a @code{while} loop, you can work on each of a list of files
15534with recursion. A recursive version of @code{lengths-list-many-files}
15535is short and simple.
15536
15537The recursive function has the usual parts: the `do-again-test', the
15538`next-step-expression', and the recursive call. The `do-again-test'
15539determines whether the function should call itself again, which it
15540will do if the @code{list-of-files} contains any remaining elements;
15541the `next-step-expression' resets the @code{list-of-files} to the
15542@sc{cdr} of itself, so eventually the list will be empty; and the
15543recursive call calls itself on the shorter list. The complete
15544function is shorter than this description!
15545@findex recursive-lengths-list-many-files
15546
15547@smallexample
15548@group
15549(defun recursive-lengths-list-many-files (list-of-files)
15550 "Return list of lengths of each defun in LIST-OF-FILES."
15551 (if list-of-files ; @r{do-again-test}
15552 (append
15553 (lengths-list-file
15554 (expand-file-name (car list-of-files)))
15555 (recursive-lengths-list-many-files
15556 (cdr list-of-files)))))
15557@end group
15558@end smallexample
15559
15560@noindent
15561In a sentence, the function returns the lengths' list for the first of
15562the @code{list-of-files} appended to the result of calling itself on
15563the rest of the @code{list-of-files}.
15564
15565Here is a test of @code{recursive-lengths-list-many-files}, along with
15566the results of running @code{lengths-list-file} on each of the files
15567individually.
15568
15569Install @code{recursive-lengths-list-many-files} and
15570@code{lengths-list-file}, if necessary, and then evaluate the
15571following expressions. You may need to change the files' pathnames;
15572those here work when this Info file and the Emacs sources are located
15573in their customary places. To change the expressions, copy them to
15574the @file{*scratch*} buffer, edit them, and then evaluate them.
15575
15576The results are shown after the @samp{@result{}}. (These results are
15577for files from Emacs version 22.1.1; files from other versions of
15578Emacs may produce different results.)
15579
15580@c !!! 22.1.1 lisp sources location here
15581@smallexample
15582@group
15583(cd "/usr/local/share/emacs/22.1.1/")
15584
15585(lengths-list-file "./lisp/macros.el")
15586 @result{} (283 263 480 90)
15587@end group
15588
15589@group
15590(lengths-list-file "./lisp/mail/mailalias.el")
15591 @result{} (38 32 29 95 178 180 321 218 324)
15592@end group
15593
15594@group
15595(lengths-list-file "./lisp/makesum.el")
15596 @result{} (85 181)
15597@end group
15598
15599@group
15600 (recursive-lengths-list-many-files
15601 '("./lisp/macros.el"
15602 "./lisp/mail/mailalias.el"
15603 "./lisp/makesum.el"))
15604 @result{} (283 263 480 90 38 32 29 95 178 180 321 218 324 85 181)
15605@end group
15606@end smallexample
15607
15608The @code{recursive-lengths-list-many-files} function produces the
15609output we want.
15610
15611The next step is to prepare the data in the list for display in a graph.
15612
15613@node Prepare the data, , Several files recursively, Words in a defun
15614@section Prepare the Data for Display in a Graph
15615
15616The @code{recursive-lengths-list-many-files} function returns a list
15617of numbers. Each number records the length of a function definition.
15618What we need to do now is transform this data into a list of numbers
15619suitable for generating a graph. The new list will tell how many
15620functions definitions contain less than 10 words and
15621symbols, how many contain between 10 and 19 words and symbols, how
15622many contain between 20 and 29 words and symbols, and so on.
15623
15624In brief, we need to go through the lengths' list produced by the
15625@code{recursive-lengths-list-many-files} function and count the number
15626of defuns within each range of lengths, and produce a list of those
15627numbers.
15628
15629@menu
15630* Data for Display in Detail::
15631* Sorting:: Sorting lists.
15632* Files List:: Making a list of files.
15633* Counting function definitions::
15634@end menu
15635
15636@node Data for Display in Detail, Sorting, Prepare the data, Prepare the data
15637@ifnottex
15638@unnumberedsubsec The Data for Display in Detail
15639@end ifnottex
15640
15641Based on what we have done before, we can readily foresee that it
15642should not be too hard to write a function that `@sc{cdr}s' down the
15643lengths' list, looks at each element, determines which length range it
15644is in, and increments a counter for that range.
15645
15646However, before beginning to write such a function, we should consider
15647the advantages of sorting the lengths' list first, so the numbers are
15648ordered from smallest to largest. First, sorting will make it easier
15649to count the numbers in each range, since two adjacent numbers will
15650either be in the same length range or in adjacent ranges. Second, by
15651inspecting a sorted list, we can discover the highest and lowest
15652number, and thereby determine the largest and smallest length range
15653that we will need.
15654
15655@node Sorting, Files List, Data for Display in Detail, Prepare the data
15656@subsection Sorting Lists
15657@findex sort
15658
15659Emacs contains a function to sort lists, called (as you might guess)
15660@code{sort}. The @code{sort} function takes two arguments, the list
15661to be sorted, and a predicate that determines whether the first of
15662two list elements is ``less'' than the second.
15663
15664As we saw earlier (@pxref{Wrong Type of Argument, , Using the Wrong
15665Type Object as an Argument}), a predicate is a function that
15666determines whether some property is true or false. The @code{sort}
15667function will reorder a list according to whatever property the
15668predicate uses; this means that @code{sort} can be used to sort
15669non-numeric lists by non-numeric criteria---it can, for example,
15670alphabetize a list.
15671
15672@need 1250
15673The @code{<} function is used when sorting a numeric list. For example,
15674
15675@smallexample
15676(sort '(4 8 21 17 33 7 21 7) '<)
15677@end smallexample
15678
15679@need 800
15680@noindent
15681produces this:
15682
15683@smallexample
15684(4 7 7 8 17 21 21 33)
15685@end smallexample
15686
15687@noindent
15688(Note that in this example, both the arguments are quoted so that the
15689symbols are not evaluated before being passed to @code{sort} as
15690arguments.)
15691
15692Sorting the list returned by the
15693@code{recursive-lengths-list-many-files} function is straightforward;
15694it uses the @code{<} function:
15695
15696@ignore
156972006 Oct 29
15698In GNU Emacs 22, eval
15699(progn
15700 (cd "/usr/local/share/emacs/22.0.50/")
15701 (sort
15702 (recursive-lengths-list-many-files
15703 '("./lisp/macros.el"
15704 "./lisp/mail/mailalias.el"
15705 "./lisp/makesum.el"))
15706 '<))
15707
15708@end ignore
15709
15710@smallexample
15711@group
15712(sort
15713 (recursive-lengths-list-many-files
15714 '("./lisp/macros.el"
15715 "./lisp/mailalias.el"
15716 "./lisp/makesum.el"))
15717 '<)
15718@end group
15719@end smallexample
15720
15721@need 800
15722@noindent
15723which produces:
15724
15725@smallexample
15726(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
15727@end smallexample
15728
15729@noindent
15730(Note that in this example, the first argument to @code{sort} is not
15731quoted, since the expression must be evaluated so as to produce the
15732list that is passed to @code{sort}.)
15733
15734@node Files List, Counting function definitions, Sorting, Prepare the data
15735@subsection Making a List of Files
15736
15737The @code{recursive-lengths-list-many-files} function requires a list
15738of files as its argument. For our test examples, we constructed such
15739a list by hand; but the Emacs Lisp source directory is too large for
15740us to do for that. Instead, we will write a function to do the job
15741for us. In this function, we will use both a @code{while} loop and a
15742recursive call.
15743
15744@findex directory-files
15745We did not have to write a function like this for older versions of
15746GNU Emacs, since they placed all the @samp{.el} files in one
15747directory. Instead, we were able to use the @code{directory-files}
15748function, which lists the names of files that match a specified
15749pattern within a single directory.
15750
15751However, recent versions of Emacs place Emacs Lisp files in
15752sub-directories of the top level @file{lisp} directory. This
15753re-arrangement eases navigation. For example, all the mail related
15754files are in a @file{lisp} sub-directory called @file{mail}. But at
15755the same time, this arrangement forces us to create a file listing
15756function that descends into the sub-directories.
15757
15758@findex files-in-below-directory
15759We can create this function, called @code{files-in-below-directory},
15760using familiar functions such as @code{car}, @code{nthcdr}, and
15761@code{substring} in conjunction with an existing function called
15762@code{directory-files-and-attributes}. This latter function not only
15763lists all the filenames in a directory, including the names
15764of sub-directories, but also their attributes.
15765
15766To restate our goal: to create a function that will enable us
15767to feed filenames to @code{recursive-lengths-list-many-files}
15768as a list that looks like this (but with more elements):
15769
15770@smallexample
15771@group
15772("./lisp/macros.el"
15773 "./lisp/mail/rmail.el"
15774 "./lisp/makesum.el")
15775@end group
15776@end smallexample
15777
15778The @code{directory-files-and-attributes} function returns a list of
15779lists. Each of the lists within the main list consists of 13
15780elements. The first element is a string that contains the name of the
15781file -- which, in GNU/Linux, may be a `directory file', that is to
15782say, a file with the special attributes of a directory. The second
15783element of the list is @code{t} for a directory, a string
15784for symbolic link (the string is the name linked to), or @code{nil}.
15785
15786For example, the first @samp{.el} file in the @file{lisp/} directory
15787is @file{abbrev.el}. Its name is
15788@file{/usr/local/share/emacs/22.1.1/lisp/abbrev.el} and it is not a
15789directory or a symbolic link.
15790
15791@need 1000
15792This is how @code{directory-files-and-attributes} lists that file and
15793its attributes:
15794
15795@smallexample
15796@group
15797("abbrev.el"
15798nil
157991
158001000
15801100
15802@end group
15803@group
15804(17733 259)
15805(17491 28834)
15806(17596 62124)
1580713157
15808"-rw-rw-r--"
15809@end group
15810@group
15811nil
158122971624
15813773)
15814@end group
15815@end smallexample
15816
15817@need 1200
15818On the other hand, @file{mail/} is a directory within the @file{lisp/}
15819directory. The beginning of its listing looks like this:
15820
15821@smallexample
15822@group
15823("mail"
15824t
15825@dots{}
15826)
15827@end group
15828@end smallexample
15829
15830(To learn about the different attributes, look at the documentation of
15831@code{file-attributes}. Bear in mind that the @code{file-attributes}
15832function does not list the filename, so its first element is
15833@code{directory-files-and-attributes}'s second element.)
15834
15835We will want our new function, @code{files-in-below-directory}, to
15836list the @samp{.el} files in the directory it is told to check, and in
15837any directories below that directory.
15838
15839This gives us a hint on how to construct
15840@code{files-in-below-directory}: within a directory, the function
15841should add @samp{.el} filenames to a list; and if, within a directory,
15842the function comes upon a sub-directory, it should go into that
15843sub-directory and repeat its actions.
15844
15845However, we should note that every directory contains a name that
15846refers to itself, called @file{.}, (``dot'') and a name that refers to
15847its parent directory, called @file{..} (``double dot''). (In
15848@file{/}, the root directory, @file{..} refers to itself, since
15849@file{/} has no parent.) Clearly, we do not want our
15850@code{files-in-below-directory} function to enter those directories,
15851since they always lead us, directly or indirectly, to the current
15852directory.
15853
15854Consequently, our @code{files-in-below-directory} function must do
15855several tasks:
15856
15857@itemize @bullet
15858@item
15859Check to see whether it is looking at a filename that ends in
15860@samp{.el}; and if so, add its name to a list.
15861
15862@item
15863Check to see whether it is looking at a filename that is the name of a
15864directory; and if so,
15865
15866@itemize @minus
15867@item
15868Check to see whether it is looking at @file{.} or @file{..}; and if
15869so skip it.
15870
15871@item
15872Or else, go into that directory and repeat the process.
15873@end itemize
15874@end itemize
15875
15876Let's write a function definition to do these tasks. We will use a
15877@code{while} loop to move from one filename to another within a
15878directory, checking what needs to be done; and we will use a recursive
15879call to repeat the actions on each sub-directory. The recursive
15880pattern is `accumulate'
15881(@pxref{Accumulate, , Recursive Pattern: @emph{accumulate}}),
15882using @code{append} as the combiner.
15883
15884@ignore
15885(directory-files "/usr/local/src/emacs/lisp/" t "\\.el$")
15886(shell-command "find /usr/local/src/emacs/lisp/ -name '*.el'")
15887
15888(directory-files "/usr/local/share/emacs/22.1.1/lisp/" t "\\.el$")
15889(shell-command "find /usr/local/share/emacs/22.1.1/lisp/ -name '*.el'")
15890@end ignore
15891
15892@c /usr/local/share/emacs/22.1.1/lisp/
15893
15894@need 800
15895Here is the function:
15896
15897@smallexample
15898@group
15899(defun files-in-below-directory (directory)
15900 "List the .el files in DIRECTORY and in its sub-directories."
15901 ;; Although the function will be used non-interactively,
15902 ;; it will be easier to test if we make it interactive.
15903 ;; The directory will have a name such as
15904 ;; "/usr/local/share/emacs/22.1.1/lisp/"
15905 (interactive "DDirectory name: ")
15906@end group
15907@group
15908 (let (el-files-list
15909 (current-directory-list
15910 (directory-files-and-attributes directory t)))
15911 ;; while we are in the current directory
15912 (while current-directory-list
15913@end group
15914@group
15915 (cond
15916 ;; check to see whether filename ends in `.el'
15917 ;; and if so, append its name to a list.
15918 ((equal ".el" (substring (car (car current-directory-list)) -3))
15919 (setq el-files-list
15920 (cons (car (car current-directory-list)) el-files-list)))
15921@end group
15922@group
15923 ;; check whether filename is that of a directory
15924 ((eq t (car (cdr (car current-directory-list))))
15925 ;; decide whether to skip or recurse
15926 (if
15927 (equal "."
15928 (substring (car (car current-directory-list)) -1))
15929 ;; then do nothing since filename is that of
15930 ;; current directory or parent, "." or ".."
15931 ()
15932@end group
15933@group
15934 ;; else descend into the directory and repeat the process
15935 (setq el-files-list
15936 (append
15937 (files-in-below-directory
15938 (car (car current-directory-list)))
15939 el-files-list)))))
15940 ;; move to the next filename in the list; this also
15941 ;; shortens the list so the while loop eventually comes to an end
15942 (setq current-directory-list (cdr current-directory-list)))
15943 ;; return the filenames
15944 el-files-list))
15945@end group
15946@end smallexample
15947
15948@c (files-in-below-directory "/usr/local/src/emacs/lisp/")
15949@c (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
15950
15951The @code{files-in-below-directory} @code{directory-files} function
15952takes one argument, the name of a directory.
15953
15954@need 1250
15955Thus, on my system,
15956
15957@c (length (files-in-below-directory "/usr/local/src/emacs/lisp/"))
15958
15959@c !!! 22.1.1 lisp sources location here
15960@smallexample
15961@group
15962(length
15963 (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/"))
15964@end group
15965@end smallexample
15966
15967@noindent
15968tells me that in and below my Lisp sources directory are 1031
15969@samp{.el} files.
15970
15971@code{files-in-below-directory} returns a list in reverse alphabetical
15972order. An expression to sort the list in alphabetical order looks
15973like this:
15974
15975@smallexample
15976@group
15977(sort
15978 (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
15979 'string-lessp)
15980@end group
15981@end smallexample
15982
15983@ignore
15984(defun test ()
15985 "Test how long it takes to find lengths of all sorted elisp defuns."
15986 (insert "\n" (current-time-string) "\n")
15987 (sit-for 0)
15988 (sort
15989 (recursive-lengths-list-many-files
15990 (files-in-below-directory "/usr/local/src/emacs/lisp/"))
15991 '<)
15992 (insert (format "%s" (current-time-string))))
15993@end ignore
15994
15995@node Counting function definitions, , Files List, Prepare the data
15996@subsection Counting function definitions
15997
15998Our immediate goal is to generate a list that tells us how many
15999function definitions contain fewer than 10 words and symbols, how many
16000contain between 10 and 19 words and symbols, how many contain between
1600120 and 29 words and symbols, and so on.
16002
16003With a sorted list of numbers, this is easy: count how many elements
16004of the list are smaller than 10, then, after moving past the numbers
16005just counted, count how many are smaller than 20, then, after moving
16006past the numbers just counted, count how many are smaller than 30, and
16007so on. Each of the numbers, 10, 20, 30, 40, and the like, is one
16008larger than the top of that range. We can call the list of such
16009numbers the @code{top-of-ranges} list.
16010
16011@need 1200
16012If we wished, we could generate this list automatically, but it is
16013simpler to write a list manually. Here it is:
16014@vindex top-of-ranges
16015
16016@smallexample
16017@group
16018(defvar top-of-ranges
16019 '(10 20 30 40 50
16020 60 70 80 90 100
16021 110 120 130 140 150
16022 160 170 180 190 200
16023 210 220 230 240 250
16024 260 270 280 290 300)
16025 "List specifying ranges for `defuns-per-range'.")
16026@end group
16027@end smallexample
16028
16029To change the ranges, we edit this list.
16030
16031Next, we need to write the function that creates the list of the
16032number of definitions within each range. Clearly, this function must
16033take the @code{sorted-lengths} and the @code{top-of-ranges} lists
16034as arguments.
16035
16036The @code{defuns-per-range} function must do two things again and
16037again: it must count the number of definitions within a range
16038specified by the current top-of-range value; and it must shift to the
16039next higher value in the @code{top-of-ranges} list after counting the
16040number of definitions in the current range. Since each of these
16041actions is repetitive, we can use @code{while} loops for the job.
16042One loop counts the number of definitions in the range defined by the
16043current top-of-range value, and the other loop selects each of the
16044top-of-range values in turn.
16045
16046Several entries of the @code{sorted-lengths} list are counted for each
16047range; this means that the loop for the @code{sorted-lengths} list
16048will be inside the loop for the @code{top-of-ranges} list, like a
16049small gear inside a big gear.
16050
16051The inner loop counts the number of definitions within the range. It
16052is a simple counting loop of the type we have seen before.
16053(@xref{Incrementing Loop, , A loop with an incrementing counter}.)
16054The true-or-false test of the loop tests whether the value from the
16055@code{sorted-lengths} list is smaller than the current value of the
16056top of the range. If it is, the function increments the counter and
16057tests the next value from the @code{sorted-lengths} list.
16058
16059@need 1250
16060The inner loop looks like this:
16061
16062@smallexample
16063@group
16064(while @var{length-element-smaller-than-top-of-range}
16065 (setq number-within-range (1+ number-within-range))
16066 (setq sorted-lengths (cdr sorted-lengths)))
16067@end group
16068@end smallexample
16069
16070The outer loop must start with the lowest value of the
16071@code{top-of-ranges} list, and then be set to each of the succeeding
16072higher values in turn. This can be done with a loop like this:
16073
16074@smallexample
16075@group
16076(while top-of-ranges
16077 @var{body-of-loop}@dots{}
16078 (setq top-of-ranges (cdr top-of-ranges)))
16079@end group
16080@end smallexample
16081
16082@need 1200
16083Put together, the two loops look like this:
16084
16085@smallexample
16086@group
16087(while top-of-ranges
16088
16089 ;; @r{Count the number of elements within the current range.}
16090 (while @var{length-element-smaller-than-top-of-range}
16091 (setq number-within-range (1+ number-within-range))
16092 (setq sorted-lengths (cdr sorted-lengths)))
16093
16094 ;; @r{Move to next range.}
16095 (setq top-of-ranges (cdr top-of-ranges)))
16096@end group
16097@end smallexample
16098
16099In addition, in each circuit of the outer loop, Emacs should record
16100the number of definitions within that range (the value of
16101@code{number-within-range}) in a list. We can use @code{cons} for
16102this purpose. (@xref{cons, , @code{cons}}.)
16103
16104The @code{cons} function works fine, except that the list it
16105constructs will contain the number of definitions for the highest
16106range at its beginning and the number of definitions for the lowest
16107range at its end. This is because @code{cons} attaches new elements
16108of the list to the beginning of the list, and since the two loops are
16109working their way through the lengths' list from the lower end first,
16110the @code{defuns-per-range-list} will end up largest number first.
16111But we will want to print our graph with smallest values first and the
16112larger later. The solution is to reverse the order of the
16113@code{defuns-per-range-list}. We can do this using the
16114@code{nreverse} function, which reverses the order of a list.
16115@findex nreverse
16116
16117@need 800
16118For example,
16119
16120@smallexample
16121(nreverse '(1 2 3 4))
16122@end smallexample
16123
16124@need 800
16125@noindent
16126produces:
16127
16128@smallexample
16129(4 3 2 1)
16130@end smallexample
16131
16132Note that the @code{nreverse} function is ``destructive''---that is,
16133it changes the list to which it is applied; this contrasts with the
16134@code{car} and @code{cdr} functions, which are non-destructive. In
16135this case, we do not want the original @code{defuns-per-range-list},
16136so it does not matter that it is destroyed. (The @code{reverse}
16137function provides a reversed copy of a list, leaving the original list
16138as is.)
16139@findex reverse
16140
16141@need 1250
16142Put all together, the @code{defuns-per-range} looks like this:
16143
16144@smallexample
16145@group
16146(defun defuns-per-range (sorted-lengths top-of-ranges)
16147 "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
16148 (let ((top-of-range (car top-of-ranges))
16149 (number-within-range 0)
16150 defuns-per-range-list)
16151@end group
16152
16153@group
16154 ;; @r{Outer loop.}
16155 (while top-of-ranges
16156@end group
16157
16158@group
16159 ;; @r{Inner loop.}
16160 (while (and
16161 ;; @r{Need number for numeric test.}
16162 (car sorted-lengths)
16163 (< (car sorted-lengths) top-of-range))
16164@end group
16165
16166@group
16167 ;; @r{Count number of definitions within current range.}
16168 (setq number-within-range (1+ number-within-range))
16169 (setq sorted-lengths (cdr sorted-lengths)))
16170
16171 ;; @r{Exit inner loop but remain within outer loop.}
16172@end group
16173
16174@group
16175 (setq defuns-per-range-list
16176 (cons number-within-range defuns-per-range-list))
16177 (setq number-within-range 0) ; @r{Reset count to zero.}
16178@end group
16179
16180@group
16181 ;; @r{Move to next range.}
16182 (setq top-of-ranges (cdr top-of-ranges))
16183 ;; @r{Specify next top of range value.}
16184 (setq top-of-range (car top-of-ranges)))
16185@end group
16186
16187@group
16188 ;; @r{Exit outer loop and count the number of defuns larger than}
16189 ;; @r{ the largest top-of-range value.}
16190 (setq defuns-per-range-list
16191 (cons
16192 (length sorted-lengths)
16193 defuns-per-range-list))
16194@end group
16195
16196@group
16197 ;; @r{Return a list of the number of definitions within each range,}
16198 ;; @r{ smallest to largest.}
16199 (nreverse defuns-per-range-list)))
16200@end group
16201@end smallexample
16202
16203@need 1200
16204@noindent
16205The function is straightforward except for one subtle feature. The
16206true-or-false test of the inner loop looks like this:
16207
16208@smallexample
16209@group
16210(and (car sorted-lengths)
16211 (< (car sorted-lengths) top-of-range))
16212@end group
16213@end smallexample
16214
16215@need 800
16216@noindent
16217instead of like this:
16218
16219@smallexample
16220(< (car sorted-lengths) top-of-range)
16221@end smallexample
16222
16223The purpose of the test is to determine whether the first item in the
16224@code{sorted-lengths} list is less than the value of the top of the
16225range.
16226
16227The simple version of the test works fine unless the
16228@code{sorted-lengths} list has a @code{nil} value. In that case, the
16229@code{(car sorted-lengths)} expression function returns
16230@code{nil}. The @code{<} function cannot compare a number to
16231@code{nil}, which is an empty list, so Emacs signals an error and
16232stops the function from attempting to continue to execute.
16233
16234The @code{sorted-lengths} list always becomes @code{nil} when the
16235counter reaches the end of the list. This means that any attempt to
16236use the @code{defuns-per-range} function with the simple version of
16237the test will fail.
16238
16239We solve the problem by using the @code{(car sorted-lengths)}
16240expression in conjunction with the @code{and} expression. The
16241@code{(car sorted-lengths)} expression returns a non-@code{nil}
16242value so long as the list has at least one number within it, but
16243returns @code{nil} if the list is empty. The @code{and} expression
16244first evaluates the @code{(car sorted-lengths)} expression, and
16245if it is @code{nil}, returns false @emph{without} evaluating the
16246@code{<} expression. But if the @code{(car sorted-lengths)}
16247expression returns a non-@code{nil} value, the @code{and} expression
16248evaluates the @code{<} expression, and returns that value as the value
16249of the @code{and} expression.
16250
16251@c colon in printed section title causes problem in Info cross reference
16252This way, we avoid an error.
16253@iftex
16254@noindent
16255(For information about @code{and}, see
16256@ref{kill-new function, , The @code{kill-new} function}.)
16257@end iftex
16258@ifinfo
16259@noindent
16260(@xref{kill-new function, , The @code{kill-new} function}, for
16261information about @code{and}.)
16262@end ifinfo
16263
16264Here is a short test of the @code{defuns-per-range} function. First,
16265evaluate the expression that binds (a shortened)
16266@code{top-of-ranges} list to the list of values, then evaluate the
16267expression for binding the @code{sorted-lengths} list, and then
16268evaluate the @code{defuns-per-range} function.
16269
16270@smallexample
16271@group
16272;; @r{(Shorter list than we will use later.)}
16273(setq top-of-ranges
16274 '(110 120 130 140 150
16275 160 170 180 190 200))
16276
16277(setq sorted-lengths
16278 '(85 86 110 116 122 129 154 176 179 200 265 300 300))
16279
16280(defuns-per-range sorted-lengths top-of-ranges)
16281@end group
16282@end smallexample
16283
16284@need 800
16285@noindent
16286The list returned looks like this:
16287
16288@smallexample
16289(2 2 2 0 0 1 0 2 0 0 4)
16290@end smallexample
16291
16292@noindent
16293Indeed, there are two elements of the @code{sorted-lengths} list
16294smaller than 110, two elements between 110 and 119, two elements
16295between 120 and 129, and so on. There are four elements with a value
16296of 200 or larger.
16297
16298@c The next step is to turn this numbers' list into a graph.
16299@node Readying a Graph, Emacs Initialization, Words in a defun, Top
16300@chapter Readying a Graph
16301@cindex Readying a graph
16302@cindex Graph prototype
16303@cindex Prototype graph
16304@cindex Body of graph
16305
16306Our goal is to construct a graph showing the numbers of function
16307definitions of various lengths in the Emacs lisp sources.
16308
16309As a practical matter, if you were creating a graph, you would
16310probably use a program such as @code{gnuplot} to do the job.
16311(@code{gnuplot} is nicely integrated into GNU Emacs.) In this case,
16312however, we create one from scratch, and in the process we will
16313re-acquaint ourselves with some of what we learned before and learn
16314more.
16315
16316In this chapter, we will first write a simple graph printing function.
16317This first definition will be a @dfn{prototype}, a rapidly written
16318function that enables us to reconnoiter this unknown graph-making
16319territory. We will discover dragons, or find that they are myth.
16320After scouting the terrain, we will feel more confident and enhance
16321the function to label the axes automatically.
16322
16323@menu
16324* Columns of a graph::
16325* graph-body-print:: How to print the body of a graph.
16326* recursive-graph-body-print::
16327* Printed Axes::
16328* Line Graph Exercise::
16329@end menu
16330
16331@node Columns of a graph, graph-body-print, Readying a Graph, Readying a Graph
16332@ifnottex
16333@unnumberedsec Printing the Columns of a Graph
16334@end ifnottex
16335
16336Since Emacs is designed to be flexible and work with all kinds of
16337terminals, including character-only terminals, the graph will need to
16338be made from one of the `typewriter' symbols. An asterisk will do; as
16339we enhance the graph-printing function, we can make the choice of
16340symbol a user option.
16341
16342We can call this function @code{graph-body-print}; it will take a
16343@code{numbers-list} as its only argument. At this stage, we will not
16344label the graph, but only print its body.
16345
16346The @code{graph-body-print} function inserts a vertical column of
16347asterisks for each element in the @code{numbers-list}. The height of
16348each line is determined by the value of that element of the
16349@code{numbers-list}.
16350
16351Inserting columns is a repetitive act; that means that this function can
16352be written either with a @code{while} loop or recursively.
16353
16354Our first challenge is to discover how to print a column of asterisks.
16355Usually, in Emacs, we print characters onto a screen horizontally,
16356line by line, by typing. We have two routes we can follow: write our
16357own column-insertion function or discover whether one exists in Emacs.
16358
16359To see whether there is one in Emacs, we can use the @kbd{M-x apropos}
16360command. This command is like the @kbd{C-h a} (@code{command-apropos})
16361command, except that the latter finds only those functions that are
16362commands. The @kbd{M-x apropos} command lists all symbols that match
16363a regular expression, including functions that are not interactive.
16364@findex apropos
16365
16366What we want to look for is some command that prints or inserts
16367columns. Very likely, the name of the function will contain either
16368the word `print' or the word `insert' or the word `column'.
16369Therefore, we can simply type @kbd{M-x apropos RET
16370print\|insert\|column RET} and look at the result. On my system, this
16371command once too takes quite some time, and then produced a list of 79
16372functions and variables. Now it does not take much time at all and
16373produces a list of 211 functions and variables. Scanning down the
16374list, the only function that looks as if it might do the job is
16375@code{insert-rectangle}.
16376
16377@need 1200
16378Indeed, this is the function we want; its documentation says:
16379
16380@smallexample
16381@group
16382insert-rectangle:
16383Insert text of RECTANGLE with upper left corner at point.
16384RECTANGLE's first line is inserted at point,
16385its second line is inserted at a point vertically under point, etc.
16386RECTANGLE should be a list of strings.
16387After this command, the mark is at the upper left corner
16388and point is at the lower right corner.
16389@end group
16390@end smallexample
16391
16392We can run a quick test, to make sure it does what we expect of it.
16393
16394Here is the result of placing the cursor after the
16395@code{insert-rectangle} expression and typing @kbd{C-u C-x C-e}
16396(@code{eval-last-sexp}). The function inserts the strings
16397@samp{"first"}, @samp{"second"}, and @samp{"third"} at and below
16398point. Also the function returns @code{nil}.
16399
16400@smallexample
16401@group
16402(insert-rectangle '("first" "second" "third"))first
16403 second
16404 thirdnil
16405@end group
16406@end smallexample
16407
16408@noindent
16409Of course, we won't be inserting the text of the
16410@code{insert-rectangle} expression itself into the buffer in which we
16411are making the graph, but will call the function from our program. We
16412shall, however, have to make sure that point is in the buffer at the
16413place where the @code{insert-rectangle} function will insert its
16414column of strings.
16415
16416If you are reading this in Info, you can see how this works by
16417switching to another buffer, such as the @file{*scratch*} buffer,
16418placing point somewhere in the buffer, typing @kbd{M-:}, typing the
16419@code{insert-rectangle} expression into the minibuffer at the prompt,
16420and then typing @key{RET}. This causes Emacs to evaluate the
16421expression in the minibuffer, but to use as the value of point the
16422position of point in the @file{*scratch*} buffer. (@kbd{M-:} is the
16423keybinding for @code{eval-expression}. Also, @code{nil} does not
16424appear in the @file{*scratch*} buffer since the expression is
16425evaluated in the minibuffer.)
16426
16427We find when we do this that point ends up at the end of the last
16428inserted line---that is to say, this function moves point as a
16429side-effect. If we were to repeat the command, with point at this
16430position, the next insertion would be below and to the right of the
16431previous insertion. We don't want this! If we are going to make a
16432bar graph, the columns need to be beside each other.
16433
16434So we discover that each cycle of the column-inserting @code{while}
16435loop must reposition point to the place we want it, and that place
16436will be at the top, not the bottom, of the column. Moreover, we
16437remember that when we print a graph, we do not expect all the columns
16438to be the same height. This means that the top of each column may be
16439at a different height from the previous one. We cannot simply
16440reposition point to the same line each time, but moved over to the
16441right---or perhaps we can@dots{}
16442
16443We are planning to make the columns of the bar graph out of asterisks.
16444The number of asterisks in the column is the number specified by the
16445current element of the @code{numbers-list}. We need to construct a
16446list of asterisks of the right length for each call to
16447@code{insert-rectangle}. If this list consists solely of the requisite
16448number of asterisks, then we will have position point the right number
16449of lines above the base for the graph to print correctly. This could
16450be difficult.
16451
16452Alternatively, if we can figure out some way to pass
16453@code{insert-rectangle} a list of the same length each time, then we
16454can place point on the same line each time, but move it over one
16455column to the right for each new column. If we do this, however, some
16456of the entries in the list passed to @code{insert-rectangle} must be
16457blanks rather than asterisks. For example, if the maximum height of
16458the graph is 5, but the height of the column is 3, then
16459@code{insert-rectangle} requires an argument that looks like this:
16460
16461@smallexample
16462(" " " " "*" "*" "*")
16463@end smallexample
16464
16465This last proposal is not so difficult, so long as we can determine
16466the column height. There are two ways for us to specify the column
16467height: we can arbitrarily state what it will be, which would work
16468fine for graphs of that height; or we can search through the list of
16469numbers and use the maximum height of the list as the maximum height
16470of the graph. If the latter operation were difficult, then the former
16471procedure would be easiest, but there is a function built into Emacs
16472that determines the maximum of its arguments. We can use that
16473function. The function is called @code{max} and it returns the
16474largest of all its arguments, which must be numbers. Thus, for
16475example,
16476
16477@smallexample
16478(max 3 4 6 5 7 3)
16479@end smallexample
16480
16481@noindent
16482returns 7. (A corresponding function called @code{min} returns the
16483smallest of all its arguments.)
16484@findex max
16485@findex min
16486
16487However, we cannot simply call @code{max} on the @code{numbers-list};
16488the @code{max} function expects numbers as its argument, not a list of
16489numbers. Thus, the following expression,
16490
16491@smallexample
16492(max '(3 4 6 5 7 3))
16493@end smallexample
16494
16495@need 800
16496@noindent
16497produces the following error message;
16498
16499@smallexample
16500Wrong type of argument: number-or-marker-p, (3 4 6 5 7 3)
16501@end smallexample
16502
16503@findex apply
16504We need a function that passes a list of arguments to a function.
16505This function is @code{apply}. This function `applies' its first
16506argument (a function) to its remaining arguments, the last of which
16507may be a list.
16508
16509@need 1250
16510For example,
16511
16512@smallexample
16513(apply 'max 3 4 7 3 '(4 8 5))
16514@end smallexample
16515
16516@noindent
16517returns 8.
16518
16519(Incidentally, I don't know how you would learn of this function
16520without a book such as this. It is possible to discover other
16521functions, like @code{search-forward} or @code{insert-rectangle}, by
16522guessing at a part of their names and then using @code{apropos}. Even
16523though its base in metaphor is clear---`apply' its first argument to
16524the rest---I doubt a novice would come up with that particular word
16525when using @code{apropos} or other aid. Of course, I could be wrong;
16526after all, the function was first named by someone who had to invent
16527it.)
16528
16529The second and subsequent arguments to @code{apply} are optional, so
16530we can use @code{apply} to call a function and pass the elements of a
16531list to it, like this, which also returns 8:
16532
16533@smallexample
16534(apply 'max '(4 8 5))
16535@end smallexample
16536
16537This latter way is how we will use @code{apply}. The
16538@code{recursive-lengths-list-many-files} function returns a numbers'
16539list to which we can apply @code{max} (we could also apply @code{max} to
16540the sorted numbers' list; it does not matter whether the list is
16541sorted or not.)
16542
16543@need 800
16544Hence, the operation for finding the maximum height of the graph is this:
16545
16546@smallexample
16547(setq max-graph-height (apply 'max numbers-list))
16548@end smallexample
16549
16550Now we can return to the question of how to create a list of strings
16551for a column of the graph. Told the maximum height of the graph
16552and the number of asterisks that should appear in the column, the
16553function should return a list of strings for the
16554@code{insert-rectangle} command to insert.
16555
16556Each column is made up of asterisks or blanks. Since the function is
16557passed the value of the height of the column and the number of
16558asterisks in the column, the number of blanks can be found by
16559subtracting the number of asterisks from the height of the column.
16560Given the number of blanks and the number of asterisks, two
16561@code{while} loops can be used to construct the list:
16562
16563@smallexample
16564@group
16565;;; @r{First version.}
16566(defun column-of-graph (max-graph-height actual-height)
16567 "Return list of strings that is one column of a graph."
16568 (let ((insert-list nil)
16569 (number-of-top-blanks
16570 (- max-graph-height actual-height)))
16571@end group
16572
16573@group
16574 ;; @r{Fill in asterisks.}
16575 (while (> actual-height 0)
16576 (setq insert-list (cons "*" insert-list))
16577 (setq actual-height (1- actual-height)))
16578@end group
16579
16580@group
16581 ;; @r{Fill in blanks.}
16582 (while (> number-of-top-blanks 0)
16583 (setq insert-list (cons " " insert-list))
16584 (setq number-of-top-blanks
16585 (1- number-of-top-blanks)))
16586@end group
16587
16588@group
16589 ;; @r{Return whole list.}
16590 insert-list))
16591@end group
16592@end smallexample
16593
16594If you install this function and then evaluate the following
16595expression you will see that it returns the list as desired:
16596
16597@smallexample
16598(column-of-graph 5 3)
16599@end smallexample
16600
16601@need 800
16602@noindent
16603returns
16604
16605@smallexample
16606(" " " " "*" "*" "*")
16607@end smallexample
16608
16609As written, @code{column-of-graph} contains a major flaw: the symbols
16610used for the blank and for the marked entries in the column are
16611`hard-coded' as a space and asterisk. This is fine for a prototype,
16612but you, or another user, may wish to use other symbols. For example,
16613in testing the graph function, you many want to use a period in place
16614of the space, to make sure the point is being repositioned properly
16615each time the @code{insert-rectangle} function is called; or you might
16616want to substitute a @samp{+} sign or other symbol for the asterisk.
16617You might even want to make a graph-column that is more than one
16618display column wide. The program should be more flexible. The way to
16619do that is to replace the blank and the asterisk with two variables
16620that we can call @code{graph-blank} and @code{graph-symbol} and define
16621those variables separately.
16622
16623Also, the documentation is not well written. These considerations
16624lead us to the second version of the function:
16625
16626@smallexample
16627@group
16628(defvar graph-symbol "*"
16629 "String used as symbol in graph, usually an asterisk.")
16630@end group
16631
16632@group
16633(defvar graph-blank " "
16634 "String used as blank in graph, usually a blank space.
16635graph-blank must be the same number of columns wide
16636as graph-symbol.")
16637@end group
16638@end smallexample
16639
16640@noindent
16641(For an explanation of @code{defvar}, see
16642@ref{defvar, , Initializing a Variable with @code{defvar}}.)
16643
16644@smallexample
16645@group
16646;;; @r{Second version.}
16647(defun column-of-graph (max-graph-height actual-height)
16648 "Return MAX-GRAPH-HEIGHT strings; ACTUAL-HEIGHT are graph-symbols.
16649
16650@end group
16651@group
16652The graph-symbols are contiguous entries at the end
16653of the list.
16654The list will be inserted as one column of a graph.
16655The strings are either graph-blank or graph-symbol."
16656@end group
16657
16658@group
16659 (let ((insert-list nil)
16660 (number-of-top-blanks
16661 (- max-graph-height actual-height)))
16662@end group
16663
16664@group
16665 ;; @r{Fill in @code{graph-symbols}.}
16666 (while (> actual-height 0)
16667 (setq insert-list (cons graph-symbol insert-list))
16668 (setq actual-height (1- actual-height)))
16669@end group
16670
16671@group
16672 ;; @r{Fill in @code{graph-blanks}.}
16673 (while (> number-of-top-blanks 0)
16674 (setq insert-list (cons graph-blank insert-list))
16675 (setq number-of-top-blanks
16676 (1- number-of-top-blanks)))
16677
16678 ;; @r{Return whole list.}
16679 insert-list))
16680@end group
16681@end smallexample
16682
16683If we wished, we could rewrite @code{column-of-graph} a third time to
16684provide optionally for a line graph as well as for a bar graph. This
16685would not be hard to do. One way to think of a line graph is that it
16686is no more than a bar graph in which the part of each bar that is
16687below the top is blank. To construct a column for a line graph, the
16688function first constructs a list of blanks that is one shorter than
16689the value, then it uses @code{cons} to attach a graph symbol to the
16690list; then it uses @code{cons} again to attach the `top blanks' to
16691the list.
16692
16693It is easy to see how to write such a function, but since we don't
16694need it, we will not do it. But the job could be done, and if it were
16695done, it would be done with @code{column-of-graph}. Even more
16696important, it is worth noting that few changes would have to be made
16697anywhere else. The enhancement, if we ever wish to make it, is
16698simple.
16699
16700Now, finally, we come to our first actual graph printing function.
16701This prints the body of a graph, not the labels for the vertical and
16702horizontal axes, so we can call this @code{graph-body-print}.
16703
16704@node graph-body-print, recursive-graph-body-print, Columns of a graph, Readying a Graph
16705@section The @code{graph-body-print} Function
16706@findex graph-body-print
16707
16708After our preparation in the preceding section, the
16709@code{graph-body-print} function is straightforward. The function
16710will print column after column of asterisks and blanks, using the
16711elements of a numbers' list to specify the number of asterisks in each
16712column. This is a repetitive act, which means we can use a
16713decrementing @code{while} loop or recursive function for the job. In
16714this section, we will write the definition using a @code{while} loop.
16715
16716The @code{column-of-graph} function requires the height of the graph
16717as an argument, so we should determine and record that as a local variable.
16718
16719This leads us to the following template for the @code{while} loop
16720version of this function:
16721
16722@smallexample
16723@group
16724(defun graph-body-print (numbers-list)
16725 "@var{documentation}@dots{}"
16726 (let ((height @dots{}
16727 @dots{}))
16728@end group
16729
16730@group
16731 (while numbers-list
16732 @var{insert-columns-and-reposition-point}
16733 (setq numbers-list (cdr numbers-list)))))
16734@end group
16735@end smallexample
16736
16737@noindent
16738We need to fill in the slots of the template.
16739
16740Clearly, we can use the @code{(apply 'max numbers-list)} expression to
16741determine the height of the graph.
16742
16743The @code{while} loop will cycle through the @code{numbers-list} one
16744element at a time. As it is shortened by the @code{(setq numbers-list
16745(cdr numbers-list))} expression, the @sc{car} of each instance of the
16746list is the value of the argument for @code{column-of-graph}.
16747
16748At each cycle of the @code{while} loop, the @code{insert-rectangle}
16749function inserts the list returned by @code{column-of-graph}. Since
16750the @code{insert-rectangle} function moves point to the lower right of
16751the inserted rectangle, we need to save the location of point at the
16752time the rectangle is inserted, move back to that position after the
16753rectangle is inserted, and then move horizontally to the next place
16754from which @code{insert-rectangle} is called.
16755
16756If the inserted columns are one character wide, as they will be if
16757single blanks and asterisks are used, the repositioning command is
16758simply @code{(forward-char 1)}; however, the width of a column may be
16759greater than one. This means that the repositioning command should be
16760written @code{(forward-char symbol-width)}. The @code{symbol-width}
16761itself is the length of a @code{graph-blank} and can be found using
16762the expression @code{(length graph-blank)}. The best place to bind
16763the @code{symbol-width} variable to the value of the width of graph
16764column is in the varlist of the @code{let} expression.
16765
16766@need 1250
16767These considerations lead to the following function definition:
16768
16769@smallexample
16770@group
16771(defun graph-body-print (numbers-list)
16772 "Print a bar graph of the NUMBERS-LIST.
16773The numbers-list consists of the Y-axis values."
16774
16775 (let ((height (apply 'max numbers-list))
16776 (symbol-width (length graph-blank))
16777 from-position)
16778@end group
16779
16780@group
16781 (while numbers-list
16782 (setq from-position (point))
16783 (insert-rectangle
16784 (column-of-graph height (car numbers-list)))
16785 (goto-char from-position)
16786 (forward-char symbol-width)
16787@end group
16788@group
16789 ;; @r{Draw graph column by column.}
16790 (sit-for 0)
16791 (setq numbers-list (cdr numbers-list)))
16792@end group
16793@group
16794 ;; @r{Place point for X axis labels.}
16795 (forward-line height)
16796 (insert "\n")
16797))
16798@end group
16799@end smallexample
16800
16801@noindent
16802The one unexpected expression in this function is the
16803@w{@code{(sit-for 0)}} expression in the @code{while} loop. This
16804expression makes the graph printing operation more interesting to
16805watch than it would be otherwise. The expression causes Emacs to
16806`sit' or do nothing for a zero length of time and then redraw the
16807screen. Placed here, it causes Emacs to redraw the screen column by
16808column. Without it, Emacs would not redraw the screen until the
16809function exits.
16810
16811We can test @code{graph-body-print} with a short list of numbers.
16812
16813@enumerate
16814@item
16815Install @code{graph-symbol}, @code{graph-blank},
16816@code{column-of-graph}, which are in
16817@iftex
16818@ref{Readying a Graph, , Readying a Graph},
16819@end iftex
16820@ifinfo
16821@ref{Columns of a graph},
16822@end ifinfo
16823and @code{graph-body-print}.
16824
16825@need 800
16826@item
16827Copy the following expression:
16828
16829@smallexample
16830(graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))
16831@end smallexample
16832
16833@item
16834Switch to the @file{*scratch*} buffer and place the cursor where you
16835want the graph to start.
16836
16837@item
16838Type @kbd{M-:} (@code{eval-expression}).
16839
16840@item
16841Yank the @code{graph-body-print} expression into the minibuffer
16842with @kbd{C-y} (@code{yank)}.
16843
16844@item
16845Press @key{RET} to evaluate the @code{graph-body-print} expression.
16846@end enumerate
16847
16848@need 800
16849Emacs will print a graph like this:
16850
16851@smallexample
16852@group
16853 *
16854 * **
16855 * ****
16856 *** ****
16857 ********* *
16858 ************
16859 *************
16860@end group
16861@end smallexample
16862
16863@node recursive-graph-body-print, Printed Axes, graph-body-print, Readying a Graph
16864@section The @code{recursive-graph-body-print} Function
16865@findex recursive-graph-body-print
16866
16867The @code{graph-body-print} function may also be written recursively.
16868The recursive solution is divided into two parts: an outside `wrapper'
16869that uses a @code{let} expression to determine the values of several
16870variables that need only be found once, such as the maximum height of
16871the graph, and an inside function that is called recursively to print
16872the graph.
16873
16874@need 1250
16875The `wrapper' is uncomplicated:
16876
16877@smallexample
16878@group
16879(defun recursive-graph-body-print (numbers-list)
16880 "Print a bar graph of the NUMBERS-LIST.
16881The numbers-list consists of the Y-axis values."
16882 (let ((height (apply 'max numbers-list))
16883 (symbol-width (length graph-blank))
16884 from-position)
16885 (recursive-graph-body-print-internal
16886 numbers-list
16887 height
16888 symbol-width)))
16889@end group
16890@end smallexample
16891
16892The recursive function is a little more difficult. It has four parts:
16893the `do-again-test', the printing code, the recursive call, and the
16894`next-step-expression'. The `do-again-test' is a @code{when}
16895expression that determines whether the @code{numbers-list} contains
16896any remaining elements; if it does, the function prints one column of
16897the graph using the printing code and calls itself again. The
16898function calls itself again according to the value produced by the
16899`next-step-expression' which causes the call to act on a shorter
16900version of the @code{numbers-list}.
16901
16902@smallexample
16903@group
16904(defun recursive-graph-body-print-internal
16905 (numbers-list height symbol-width)
16906 "Print a bar graph.
16907Used within recursive-graph-body-print function."
16908@end group
16909
16910@group
16911 (when numbers-list
16912 (setq from-position (point))
16913 (insert-rectangle
16914 (column-of-graph height (car numbers-list)))
16915@end group
16916@group
16917 (goto-char from-position)
16918 (forward-char symbol-width)
16919 (sit-for 0) ; @r{Draw graph column by column.}
16920 (recursive-graph-body-print-internal
16921 (cdr numbers-list) height symbol-width)))
16922@end group
16923@end smallexample
16924
16925@need 1250
16926After installation, this expression can be tested; here is a sample:
16927
16928@smallexample
16929(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
16930@end smallexample
16931
16932@need 800
16933Here is what @code{recursive-graph-body-print} produces:
16934
16935@smallexample
16936@group
16937 *
16938 ** *
16939 **** *
16940 **** ***
16941 * *********
16942 ************
16943 *************
16944@end group
16945@end smallexample
16946
16947Either of these two functions, @code{graph-body-print} or
16948@code{recursive-graph-body-print}, create the body of a graph.
16949
16950@node Printed Axes, Line Graph Exercise, recursive-graph-body-print, Readying a Graph
16951@section Need for Printed Axes
16952
16953A graph needs printed axes, so you can orient yourself. For a do-once
16954project, it may be reasonable to draw the axes by hand using Emacs'
16955Picture mode; but a graph drawing function may be used more than once.
16956
16957For this reason, I have written enhancements to the basic
16958@code{print-graph-body} function that automatically print labels for
16959the horizontal and vertical axes. Since the label printing functions
16960do not contain much new material, I have placed their description in
16961an appendix. @xref{Full Graph, , A Graph with Labelled Axes}.
16962
16963@node Line Graph Exercise, , Printed Axes, Readying a Graph
16964@section Exercise
16965
16966Write a line graph version of the graph printing functions.
16967
16968@node Emacs Initialization, Debugging, Readying a Graph, Top
16969@chapter Your @file{.emacs} File
16970@cindex @file{.emacs} file
16971@cindex Customizing your @file{.emacs} file
16972@cindex Initialization file
16973
16974``You don't have to like Emacs to like it'' -- this seemingly
16975paradoxical statement is the secret of GNU Emacs. The plain, `out of
16976the box' Emacs is a generic tool. Most people who use it, customize
16977it to suit themselves.
16978
16979GNU Emacs is mostly written in Emacs Lisp; this means that by writing
16980expressions in Emacs Lisp you can change or extend Emacs.
16981
16982@menu
16983* Default Configuration::
16984* Site-wide Init:: You can write site-wide init files.
16985* defcustom:: Emacs will write code for you.
16986* Beginning a .emacs File:: How to write a @code{.emacs file}.
16987* Text and Auto-fill:: Automatically wrap lines.
16988* Mail Aliases:: Use abbreviations for email addresses.
16989* Indent Tabs Mode:: Don't use tabs with @TeX{}
16990* Keybindings:: Create some personal keybindings.
16991* Keymaps:: More about key binding.
16992* Loading Files:: Load (i.e., evaluate) files automatically.
16993* Autoload:: Make functions available.
16994* Simple Extension:: Define a function; bind it to a key.
16995* X11 Colors:: Colors in X.
16996* Miscellaneous::
16997* Mode Line:: How to customize your mode line.
16998@end menu
16999
17000@node Default Configuration, Site-wide Init, Emacs Initialization, Emacs Initialization
17001@ifnottex
17002@unnumberedsec Emacs' Default Configuration
17003@end ifnottex
17004
17005There are those who appreciate Emacs' default configuration. After
17006all, Emacs starts you in C mode when you edit a C file, starts you in
17007Fortran mode when you edit a Fortran file, and starts you in
17008Fundamental mode when you edit an unadorned file. This all makes
17009sense, if you do not know who is going to use Emacs. Who knows what a
17010person hopes to do with an unadorned file? Fundamental mode is the
17011right default for such a file, just as C mode is the right default for
17012editing C code. (Enough programming languages have syntaxes
17013that enable them to share or nearly share features, so C mode is
6bd6c2fa 17014now provided by CC mode, the `C Collection'.)
8cda6f8f
GM
17015
17016But when you do know who is going to use Emacs---you,
17017yourself---then it makes sense to customize Emacs.
17018
17019For example, I seldom want Fundamental mode when I edit an
17020otherwise undistinguished file; I want Text mode. This is why I
17021customize Emacs: so it suits me.
17022
17023You can customize and extend Emacs by writing or adapting a
17024@file{~/.emacs} file. This is your personal initialization file; its
17025contents, written in Emacs Lisp, tell Emacs what to do.@footnote{You
17026may also add @file{.el} to @file{~/.emacs} and call it a
17027@file{~/.emacs.el} file. In the past, you were forbidden to type the
17028extra keystrokes that the name @file{~/.emacs.el} requires, but now
17029you may. The new format is consistent with the Emacs Lisp file
17030naming conventions; the old format saves typing.}
17031
17032A @file{~/.emacs} file contains Emacs Lisp code. You can write this
17033code yourself; or you can use Emacs' @code{customize} feature to write
17034the code for you. You can combine your own expressions and
17035auto-written Customize expressions in your @file{.emacs} file.
17036
17037(I myself prefer to write my own expressions, except for those,
17038particularly fonts, that I find easier to manipulate using the
17039@code{customize} command. I combine the two methods.)
17040
17041Most of this chapter is about writing expressions yourself. It
17042describes a simple @file{.emacs} file; for more information, see
17043@ref{Init File, , The Init File, emacs, The GNU Emacs Manual}, and
17044@ref{Init File, , The Init File, elisp, The GNU Emacs Lisp Reference
17045Manual}.
17046
17047@node Site-wide Init, defcustom, Default Configuration, Emacs Initialization
17048@section Site-wide Initialization Files
17049
17050@cindex @file{default.el} init file
17051@cindex @file{site-init.el} init file
17052@cindex @file{site-load.el} init file
17053In addition to your personal initialization file, Emacs automatically
17054loads various site-wide initialization files, if they exist. These
17055have the same form as your @file{.emacs} file, but are loaded by
17056everyone.
17057
17058Two site-wide initialization files, @file{site-load.el} and
17059@file{site-init.el}, are loaded into Emacs and then `dumped' if a
17060`dumped' version of Emacs is created, as is most common. (Dumped
17061copies of Emacs load more quickly. However, once a file is loaded and
17062dumped, a change to it does not lead to a change in Emacs unless you
17063load it yourself or re-dump Emacs. @xref{Building Emacs, , Building
17064Emacs, elisp, The GNU Emacs Lisp Reference Manual}, and the
17065@file{INSTALL} file.)
17066
17067Three other site-wide initialization files are loaded automatically
17068each time you start Emacs, if they exist. These are
17069@file{site-start.el}, which is loaded @emph{before} your @file{.emacs}
17070file, and @file{default.el}, and the terminal type file, which are both
17071loaded @emph{after} your @file{.emacs} file.
17072
17073Settings and definitions in your @file{.emacs} file will overwrite
17074conflicting settings and definitions in a @file{site-start.el} file,
17075if it exists; but the settings and definitions in a @file{default.el}
17076or terminal type file will overwrite those in your @file{.emacs} file.
17077(You can prevent interference from a terminal type file by setting
17078@code{term-file-prefix} to @code{nil}. @xref{Simple Extension, , A
17079Simple Extension}.)
17080
17081@c Rewritten to avoid overfull hbox.
17082The @file{INSTALL} file that comes in the distribution contains
17083descriptions of the @file{site-init.el} and @file{site-load.el} files.
17084
17085The @file{loadup.el}, @file{startup.el}, and @file{loaddefs.el} files
17086control loading. These files are in the @file{lisp} directory of the
17087Emacs distribution and are worth perusing.
17088
17089The @file{loaddefs.el} file contains a good many suggestions as to
17090what to put into your own @file{.emacs} file, or into a site-wide
17091initialization file.
17092
17093@node defcustom, Beginning a .emacs File, Site-wide Init, Emacs Initialization
17094@section Specifying Variables using @code{defcustom}
17095@findex defcustom
17096
17097You can specify variables using @code{defcustom} so that you and
17098others can then use Emacs' @code{customize} feature to set their
17099values. (You cannot use @code{customize} to write function
17100definitions; but you can write @code{defuns} in your @file{.emacs}
17101file. Indeed, you can write any Lisp expression in your @file{.emacs}
17102file.)
17103
17104The @code{customize} feature depends on the @code{defcustom} special
17105form. Although you can use @code{defvar} or @code{setq} for variables
17106that users set, the @code{defcustom} special form is designed for the
17107job.
17108
17109You can use your knowledge of @code{defvar} for writing the
17110first three arguments for @code{defcustom}. The first argument to
17111@code{defcustom} is the name of the variable. The second argument is
17112the variable's initial value, if any; and this value is set only if
17113the value has not already been set. The third argument is the
17114documentation.
17115
17116The fourth and subsequent arguments to @code{defcustom} specify types
17117and options; these are not featured in @code{defvar}. (These
17118arguments are optional.)
17119
17120Each of these arguments consists of a keyword followed by a value.
17121Each keyword starts with the colon character @samp{:}.
17122
17123@need 1250
17124For example, the customizable user option variable
17125@code{text-mode-hook} looks like this:
17126
17127@smallexample
17128@group
17129(defcustom text-mode-hook nil
17130 "Normal hook run when entering Text mode and many related modes."
17131 :type 'hook
17132 :options '(turn-on-auto-fill flyspell-mode)
17133 :group 'data)
17134@end group
17135@end smallexample
17136
17137@noindent
17138The name of the variable is @code{text-mode-hook}; it has no default
17139value; and its documentation string tells you what it does.
17140
17141The @code{:type} keyword tells Emacs the kind of data to which
17142@code{text-mode-hook} should be set and how to display the value in a
17143Customization buffer.
17144
17145The @code{:options} keyword specifies a suggested list of values for
17146the variable. Usually, @code{:options} applies to a hook.
17147The list is only a suggestion; it is not exclusive; a person who sets
17148the variable may set it to other values; the list shown following the
17149@code{:options} keyword is intended to offer convenient choices to a
17150user.
17151
17152Finally, the @code{:group} keyword tells the Emacs Customization
17153command in which group the variable is located. This tells where to
17154find it.
17155
17156The @code{defcustom} function recognizes more than a dozen keywords.
17157For more information, see @ref{Customization, , Writing Customization
17158Definitions, elisp, The GNU Emacs Lisp Reference Manual}.
17159
17160Consider @code{text-mode-hook} as an example.
17161
17162There are two ways to customize this variable. You can use the
17163customization command or write the appropriate expressions yourself.
17164
17165@need 800
17166Using the customization command, you can type:
17167
17168@smallexample
17169M-x customize
17170@end smallexample
17171
17172@noindent
17173and find that the group for editing files of data is called `data'.
17174Enter that group. Text Mode Hook is the first member. You can click
17175on its various options, such as @code{turn-on-auto-fill}, to set the
17176values. After you click on the button to
17177
17178@smallexample
17179Save for Future Sessions
17180@end smallexample
17181
17182@noindent
17183Emacs will write an expression into your @file{.emacs} file.
17184It will look like this:
17185
17186@smallexample
17187@group
17188(custom-set-variables
17189 ;; custom-set-variables was added by Custom.
17190 ;; If you edit it by hand, you could mess it up, so be careful.
17191 ;; Your init file should contain only one such instance.
17192 ;; If there is more than one, they won't work right.
17193 '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify))))
17194@end group
17195@end smallexample
17196
17197@noindent
17198(The @code{text-mode-hook-identify} function tells
17199@code{toggle-text-mode-auto-fill} which buffers are in Text mode.
17200It comes on automatically.)
17201
17202The @code{custom-set-variables} function works somewhat differently
17203than a @code{setq}. While I have never learned the differences, I
17204modify the @code{custom-set-variables} expressions in my @file{.emacs}
17205file by hand: I make the changes in what appears to me to be a
17206reasonable manner and have not had any problems. Others prefer to use
17207the Customization command and let Emacs do the work for them.
17208
17209Another @code{custom-set-@dots{}} function is @code{custom-set-faces}.
17210This function sets the various font faces. Over time, I have set a
17211considerable number of faces. Some of the time, I re-set them using
17212@code{customize}; other times, I simply edit the
17213@code{custom-set-faces} expression in my @file{.emacs} file itself.
17214
17215The second way to customize your @code{text-mode-hook} is to set it
17216yourself in your @file{.emacs} file using code that has nothing to do
17217with the @code{custom-set-@dots{}} functions.
17218
17219@need 800
17220When you do this, and later use @code{customize}, you will see a
17221message that says
17222
17223@smallexample
17224CHANGED outside Customize; operating on it here may be unreliable.
17225@end smallexample
17226
17227@need 800
17228This message is only a warning. If you click on the button to
17229
17230@smallexample
17231Save for Future Sessions
17232@end smallexample
17233
17234@noindent
17235Emacs will write a @code{custom-set-@dots{}} expression near the end
17236of your @file{.emacs} file that will be evaluated after your
17237hand-written expression. It will, therefore, overrule your
17238hand-written expression. No harm will be done. When you do this,
17239however, be careful to remember which expression is active; if you
17240forget, you may confuse yourself.
17241
17242So long as you remember where the values are set, you will have no
17243trouble. In any event, the values are always set in your
17244initialization file, which is usually called @file{.emacs}.
17245
17246I myself use @code{customize} for hardly anything. Mostly, I write
17247expressions myself.
17248
17249@findex defsubst
17250@findex defconst
17251Incidentally, to be more complete concerning defines: @code{defsubst}
17252defines an inline function. The syntax is just like that of
17253@code{defun}. @code{defconst} defines a symbol as a constant. The
17254intent is that neither programs nor users should ever change a value
17255set by @code{defconst}. (You can change it; the value set is a
17256variable; but please do not.)
17257
17258@node Beginning a .emacs File, Text and Auto-fill, defcustom, Emacs Initialization
17259@section Beginning a @file{.emacs} File
17260@cindex @file{.emacs} file, beginning of
17261
17262When you start Emacs, it loads your @file{.emacs} file unless you tell
17263it not to by specifying @samp{-q} on the command line. (The
17264@code{emacs -q} command gives you a plain, out-of-the-box Emacs.)
17265
17266A @file{.emacs} file contains Lisp expressions. Often, these are no
17267more than expressions to set values; sometimes they are function
17268definitions.
17269
17270@xref{Init File, , The Init File @file{~/.emacs}, emacs, The GNU Emacs
17271Manual}, for a short description of initialization files.
17272
17273This chapter goes over some of the same ground, but is a walk among
17274extracts from a complete, long-used @file{.emacs} file---my own.
17275
17276The first part of the file consists of comments: reminders to myself.
17277By now, of course, I remember these things, but when I started, I did
17278not.
17279
17280@need 1200
17281@smallexample
17282@group
17283;;;; Bob's .emacs file
17284; Robert J. Chassell
17285; 26 September 1985
17286@end group
17287@end smallexample
17288
17289@noindent
17290Look at that date! I started this file a long time ago. I have been
17291adding to it ever since.
17292
17293@smallexample
17294@group
17295; Each section in this file is introduced by a
17296; line beginning with four semicolons; and each
17297; entry is introduced by a line beginning with
17298; three semicolons.
17299@end group
17300@end smallexample
17301
17302@noindent
17303This describes the usual conventions for comments in Emacs Lisp.
17304Everything on a line that follows a semicolon is a comment. Two,
17305three, and four semicolons are used as subsection and section markers.
17306(@xref{Comments, ,, elisp, The GNU Emacs Lisp Reference Manual}, for
17307more about comments.)
17308
17309@smallexample
17310@group
17311;;;; The Help Key
17312; Control-h is the help key;
17313; after typing control-h, type a letter to
17314; indicate the subject about which you want help.
17315; For an explanation of the help facility,
17316; type control-h two times in a row.
17317@end group
17318@end smallexample
17319
17320@noindent
17321Just remember: type @kbd{C-h} two times for help.
17322
17323@smallexample
17324@group
17325; To find out about any mode, type control-h m
17326; while in that mode. For example, to find out
17327; about mail mode, enter mail mode and then type
17328; control-h m.
17329@end group
17330@end smallexample
17331
17332@noindent
17333`Mode help', as I call this, is very helpful. Usually, it tells you
17334all you need to know.
17335
17336Of course, you don't need to include comments like these in your
17337@file{.emacs} file. I included them in mine because I kept forgetting
17338about Mode help or the conventions for comments---but I was able to
17339remember to look here to remind myself.
17340
17341@node Text and Auto-fill, Mail Aliases, Beginning a .emacs File, Emacs Initialization
17342@section Text and Auto Fill Mode
17343
17344Now we come to the part that `turns on' Text mode and
17345Auto Fill mode.
17346
17347@smallexample
17348@group
17349;;; Text mode and Auto Fill mode
cd61af01
SM
17350;; The next two lines put Emacs into Text mode
17351;; and Auto Fill mode, and are for writers who
17352;; want to start writing prose rather than code.
17353(setq-default major-mode 'text-mode)
8cda6f8f
GM
17354(add-hook 'text-mode-hook 'turn-on-auto-fill)
17355@end group
17356@end smallexample
17357
17358Here is the first part of this @file{.emacs} file that does something
17359besides remind a forgetful human!
17360
17361The first of the two lines in parentheses tells Emacs to turn on Text
17362mode when you find a file, @emph{unless} that file should go into some
17363other mode, such as C mode.
17364
17365@cindex Per-buffer, local variables list
17366@cindex Local variables list, per-buffer,
17367@cindex Automatic mode selection
17368@cindex Mode selection, automatic
17369When Emacs reads a file, it looks at the extension to the file name,
17370if any. (The extension is the part that comes after a @samp{.}.) If
17371the file ends with a @samp{.c} or @samp{.h} extension then Emacs turns
17372on C mode. Also, Emacs looks at first nonblank line of the file; if
17373the line says @w{@samp{-*- C -*-}}, Emacs turns on C mode. Emacs
17374possesses a list of extensions and specifications that it uses
17375automatically. In addition, Emacs looks near the last page for a
17376per-buffer, ``local variables list'', if any.
17377
17378@ifinfo
17379@xref{Choosing Modes, , How Major Modes are Chosen, emacs, The GNU
17380Emacs Manual}.
17381
17382@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
17383Manual}.
17384@end ifinfo
17385@iftex
17386See sections ``How Major Modes are Chosen'' and ``Local Variables in
17387Files'' in @cite{The GNU Emacs Manual}.
17388@end iftex
17389
17390Now, back to the @file{.emacs} file.
17391
17392@need 800
17393Here is the line again; how does it work?
17394
17395@cindex Text Mode turned on
17396@smallexample
4e3b4528 17397(setq major-mode 'text-mode)
8cda6f8f
GM
17398@end smallexample
17399
17400@noindent
17401This line is a short, but complete Emacs Lisp expression.
17402
17403We are already familiar with @code{setq}. It sets the following variable,
4e3b4528
SM
17404@code{major-mode}, to the subsequent value, which is @code{text-mode}.
17405The single quote mark before @code{text-mode} tells Emacs to deal directly
17406with the @code{text-mode} symbol, not with whatever it might stand for.
17407@xref{set & setq, , Setting the Value of a Variable},
17408for a reminder of how @code{setq} works.
17409The main point is that there is no difference between the procedure you
17410use to set a value in your @file{.emacs} file and the procedure you use
17411anywhere else in Emacs.
8cda6f8f
GM
17412
17413@need 800
17414Here is the next line:
17415
17416@cindex Auto Fill mode turned on
17417@findex add-hook
17418@smallexample
17419(add-hook 'text-mode-hook 'turn-on-auto-fill)
17420@end smallexample
17421
17422@noindent
17423In this line, the @code{add-hook} command adds
17424@code{turn-on-auto-fill} to the variable.
17425
17426@code{turn-on-auto-fill} is the name of a program, that, you guessed
17427it!, turns on Auto Fill mode.
17428
17429Every time Emacs turns on Text mode, Emacs runs the commands `hooked'
17430onto Text mode. So every time Emacs turns on Text mode, Emacs also
17431turns on Auto Fill mode.
17432
17433In brief, the first line causes Emacs to enter Text mode when you edit a
17434file, unless the file name extension, a first non-blank line, or local
17435variables to tell Emacs otherwise.
17436
17437Text mode among other actions, sets the syntax table to work
17438conveniently for writers. In Text mode, Emacs considers an apostrophe
17439as part of a word like a letter; but Emacs does not consider a period
17440or a space as part of a word. Thus, @kbd{M-f} moves you over
17441@samp{it's}. On the other hand, in C mode, @kbd{M-f} stops just after
17442the @samp{t} of @samp{it's}.
17443
17444The second line causes Emacs to turn on Auto Fill mode when it turns
17445on Text mode. In Auto Fill mode, Emacs automatically breaks a line
17446that is too wide and brings the excessively wide part of the line down
17447to the next line. Emacs breaks lines between words, not within them.
17448
17449When Auto Fill mode is turned off, lines continue to the right as you
17450type them. Depending on how you set the value of
17451@code{truncate-lines}, the words you type either disappear off the
17452right side of the screen, or else are shown, in a rather ugly and
17453unreadable manner, as a continuation line on the screen.
17454
17455@need 1250
17456In addition, in this part of my @file{.emacs} file, I tell the Emacs
17457fill commands to insert two spaces after a colon:
17458
17459@smallexample
17460(setq colon-double-space t)
17461@end smallexample
17462
17463@node Mail Aliases, Indent Tabs Mode, Text and Auto-fill, Emacs Initialization
17464@section Mail Aliases
17465
17466Here is a @code{setq} that `turns on' mail aliases, along with more
17467reminders.
17468
17469@smallexample
17470@group
17471;;; Mail mode
17472; To enter mail mode, type `C-x m'
17473; To enter RMAIL (for reading mail),
17474; type `M-x rmail'
17475(setq mail-aliases t)
17476@end group
17477@end smallexample
17478
17479@cindex Mail aliases
17480@noindent
17481This @code{setq} command sets the value of the variable
17482@code{mail-aliases} to @code{t}. Since @code{t} means true, the line
17483says, in effect, ``Yes, use mail aliases.''
17484
17485Mail aliases are convenient short names for long email addresses or
17486for lists of email addresses. The file where you keep your `aliases'
17487is @file{~/.mailrc}. You write an alias like this:
17488
17489@smallexample
17490alias geo george@@foobar.wiz.edu
17491@end smallexample
17492
17493@noindent
17494When you write a message to George, address it to @samp{geo}; the
17495mailer will automatically expand @samp{geo} to the full address.
17496
17497@node Indent Tabs Mode, Keybindings, Mail Aliases, Emacs Initialization
17498@section Indent Tabs Mode
17499@cindex Tabs, preventing
17500@findex indent-tabs-mode
17501
17502By default, Emacs inserts tabs in place of multiple spaces when it
17503formats a region. (For example, you might indent many lines of text
17504all at once with the @code{indent-region} command.) Tabs look fine on
17505a terminal or with ordinary printing, but they produce badly indented
17506output when you use @TeX{} or Texinfo since @TeX{} ignores tabs.
17507
17508@need 1250
17509The following turns off Indent Tabs mode:
17510
17511@smallexample
17512@group
17513;;; Prevent Extraneous Tabs
17514(setq-default indent-tabs-mode nil)
17515@end group
17516@end smallexample
17517
17518Note that this line uses @code{setq-default} rather than the
17519@code{setq} command that we have seen before. The @code{setq-default}
17520command sets values only in buffers that do not have their own local
17521values for the variable.
17522
17523@ifinfo
17524@xref{Just Spaces, , Tabs vs. Spaces, emacs, The GNU Emacs Manual}.
17525
17526@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
17527Manual}.
17528@end ifinfo
17529@iftex
17530See sections ``Tabs vs.@: Spaces'' and ``Local Variables in
17531Files'' in @cite{The GNU Emacs Manual}.
17532@end iftex
17533
17534@need 1700
17535@node Keybindings, Keymaps, Indent Tabs Mode, Emacs Initialization
17536@section Some Keybindings
17537
17538Now for some personal keybindings:
17539
17540@smallexample
17541@group
17542;;; Compare windows
17543(global-set-key "\C-cw" 'compare-windows)
17544@end group
17545@end smallexample
17546
17547@findex compare-windows
17548@code{compare-windows} is a nifty command that compares the text in
17549your current window with text in the next window. It makes the
17550comparison by starting at point in each window, moving over text in
17551each window as far as they match. I use this command all the time.
17552
17553This also shows how to set a key globally, for all modes.
17554
17555@cindex Setting a key globally
17556@cindex Global set key
17557@cindex Key setting globally
17558@findex global-set-key
17559The command is @code{global-set-key}. It is followed by the
17560keybinding. In a @file{.emacs} file, the keybinding is written as
17561shown: @code{\C-c} stands for `control-c', which means `press the
17562control key and the @key{c} key at the same time'. The @code{w} means
17563`press the @key{w} key'. The keybinding is surrounded by double
17564quotation marks. In documentation, you would write this as
17565@w{@kbd{C-c w}}. (If you were binding a @key{META} key, such as
17566@kbd{M-c}, rather than a @key{CTRL} key, you would write
17567@w{@code{\M-c}} in your @file{.emacs} file. @xref{Init Rebinding, ,
17568Rebinding Keys in Your Init File, emacs, The GNU Emacs Manual}, for
17569details.)
17570
17571The command invoked by the keys is @code{compare-windows}. Note that
17572@code{compare-windows} is preceded by a single quote; otherwise, Emacs
17573would first try to evaluate the symbol to determine its value.
17574
17575These three things, the double quotation marks, the backslash before
17576the @samp{C}, and the single quote mark are necessary parts of
17577keybinding that I tend to forget. Fortunately, I have come to
17578remember that I should look at my existing @file{.emacs} file, and
17579adapt what is there.
17580
17581As for the keybinding itself: @kbd{C-c w}. This combines the prefix
17582key, @kbd{C-c}, with a single character, in this case, @kbd{w}. This
17583set of keys, @kbd{C-c} followed by a single character, is strictly
17584reserved for individuals' own use. (I call these `own' keys, since
17585these are for my own use.) You should always be able to create such a
17586keybinding for your own use without stomping on someone else's
17587keybinding. If you ever write an extension to Emacs, please avoid
17588taking any of these keys for public use. Create a key like @kbd{C-c
17589C-w} instead. Otherwise, we will run out of `own' keys.
17590
17591@need 1250
17592Here is another keybinding, with a comment:
17593
17594@smallexample
17595@group
17596;;; Keybinding for `occur'
17597; I use occur a lot, so let's bind it to a key:
17598(global-set-key "\C-co" 'occur)
17599@end group
17600@end smallexample
17601
17602@findex occur
17603The @code{occur} command shows all the lines in the current buffer
17604that contain a match for a regular expression. Matching lines are
17605shown in a buffer called @file{*Occur*}. That buffer serves as a menu
17606to jump to occurrences.
17607
17608@findex global-unset-key
17609@cindex Unbinding key
17610@cindex Key unbinding
17611@need 1250
17612Here is how to unbind a key, so it does not
17613work:
17614
17615@smallexample
17616@group
17617;;; Unbind `C-x f'
17618(global-unset-key "\C-xf")
17619@end group
17620@end smallexample
17621
17622There is a reason for this unbinding: I found I inadvertently typed
17623@w{@kbd{C-x f}} when I meant to type @kbd{C-x C-f}. Rather than find a
17624file, as I intended, I accidentally set the width for filled text,
17625almost always to a width I did not want. Since I hardly ever reset my
17626default width, I simply unbound the key.
17627
17628@findex list-buffers, @r{rebound}
17629@findex buffer-menu, @r{bound to key}
17630@need 1250
17631The following rebinds an existing key:
17632
17633@smallexample
17634@group
17635;;; Rebind `C-x C-b' for `buffer-menu'
17636(global-set-key "\C-x\C-b" 'buffer-menu)
17637@end group
17638@end smallexample
17639
17640By default, @kbd{C-x C-b} runs the
17641@code{list-buffers} command. This command lists
17642your buffers in @emph{another} window. Since I
17643almost always want to do something in that
17644window, I prefer the @code{buffer-menu}
17645command, which not only lists the buffers,
17646but moves point into that window.
17647
17648@node Keymaps, Loading Files, Keybindings, Emacs Initialization
17649@section Keymaps
17650@cindex Keymaps
17651@cindex Rebinding keys
17652
17653Emacs uses @dfn{keymaps} to record which keys call which commands.
17654When you use @code{global-set-key} to set the keybinding for a single
17655command in all parts of Emacs, you are specifying the keybinding in
17656@code{current-global-map}.
17657
17658Specific modes, such as C mode or Text mode, have their own keymaps;
17659the mode-specific keymaps override the global map that is shared by
17660all buffers.
17661
17662The @code{global-set-key} function binds, or rebinds, the global
17663keymap. For example, the following binds the key @kbd{C-x C-b} to the
17664function @code{buffer-menu}:
17665
17666@smallexample
17667(global-set-key "\C-x\C-b" 'buffer-menu)
17668@end smallexample
17669
17670Mode-specific keymaps are bound using the @code{define-key} function,
17671which takes a specific keymap as an argument, as well as the key and
17672the command. For example, my @file{.emacs} file contains the
17673following expression to bind the @code{texinfo-insert-@@group} command
17674to @kbd{C-c C-c g}:
17675
17676@smallexample
17677@group
17678(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@@group)
17679@end group
17680@end smallexample
17681
17682@noindent
17683The @code{texinfo-insert-@@group} function itself is a little extension
17684to Texinfo mode that inserts @samp{@@group} into a Texinfo file. I
17685use this command all the time and prefer to type the three strokes
17686@kbd{C-c C-c g} rather than the six strokes @kbd{@@ g r o u p}.
17687(@samp{@@group} and its matching @samp{@@end group} are commands that
17688keep all enclosed text together on one page; many multi-line examples
17689in this book are surrounded by @samp{@@group @dots{} @@end group}.)
17690
17691@need 1250
17692Here is the @code{texinfo-insert-@@group} function definition:
17693
17694@smallexample
17695@group
17696(defun texinfo-insert-@@group ()
17697 "Insert the string @@group in a Texinfo buffer."
17698 (interactive)
17699 (beginning-of-line)
17700 (insert "@@group\n"))
17701@end group
17702@end smallexample
17703
17704(Of course, I could have used Abbrev mode to save typing, rather than
17705write a function to insert a word; but I prefer key strokes consistent
17706with other Texinfo mode key bindings.)
17707
17708You will see numerous @code{define-key} expressions in
17709@file{loaddefs.el} as well as in the various mode libraries, such as
17710@file{cc-mode.el} and @file{lisp-mode.el}.
17711
17712@xref{Key Bindings, , Customizing Key Bindings, emacs, The GNU Emacs
17713Manual}, and @ref{Keymaps, , Keymaps, elisp, The GNU Emacs Lisp
17714Reference Manual}, for more information about keymaps.
17715
17716@node Loading Files, Autoload, Keymaps, Emacs Initialization
17717@section Loading Files
17718@cindex Loading files
17719@c findex load
17720
17721Many people in the GNU Emacs community have written extensions to
17722Emacs. As time goes by, these extensions are often included in new
17723releases. For example, the Calendar and Diary packages are now part
17724of the standard GNU Emacs, as is Calc.
17725
17726You can use a @code{load} command to evaluate a complete file and
17727thereby install all the functions and variables in the file into Emacs.
17728For example:
17729
17730@c (auto-compression-mode t)
17731
17732@smallexample
17733(load "~/emacs/slowsplit")
17734@end smallexample
17735
17736This evaluates, i.e.@: loads, the @file{slowsplit.el} file or if it
17737exists, the faster, byte compiled @file{slowsplit.elc} file from the
17738@file{emacs} sub-directory of your home directory. The file contains
17739the function @code{split-window-quietly}, which John Robinson wrote in
177401989.
17741
17742The @code{split-window-quietly} function splits a window with the
17743minimum of redisplay. I installed it in 1989 because it worked well
17744with the slow 1200 baud terminals I was then using. Nowadays, I only
17745occasionally come across such a slow connection, but I continue to use
17746the function because I like the way it leaves the bottom half of a
17747buffer in the lower of the new windows and the top half in the upper
17748window.
17749
17750@need 1250
17751To replace the key binding for the default
17752@code{split-window-vertically}, you must also unset that key and bind
17753the keys to @code{split-window-quietly}, like this:
17754
17755@smallexample
17756@group
17757(global-unset-key "\C-x2")
17758(global-set-key "\C-x2" 'split-window-quietly)
17759@end group
17760@end smallexample
17761
17762@vindex load-path
17763If you load many extensions, as I do, then instead of specifying the
17764exact location of the extension file, as shown above, you can specify
17765that directory as part of Emacs' @code{load-path}. Then, when Emacs
17766loads a file, it will search that directory as well as its default
17767list of directories. (The default list is specified in @file{paths.h}
17768when Emacs is built.)
17769
17770@need 1250
17771The following command adds your @file{~/emacs} directory to the
17772existing load path:
17773
17774@smallexample
17775@group
17776;;; Emacs Load Path
17777(setq load-path (cons "~/emacs" load-path))
17778@end group
17779@end smallexample
17780
17781Incidentally, @code{load-library} is an interactive interface to the
17782@code{load} function. The complete function looks like this:
17783
17784@findex load-library
17785@smallexample
17786@group
17787(defun load-library (library)
17788 "Load the library named LIBRARY.
17789This is an interface to the function `load'."
17790 (interactive
17791 (list (completing-read "Load library: "
e0e10d9d 17792 (apply-partially 'locate-file-completion-table
f51f97dd
SM
17793 load-path
17794 (get-load-suffixes)))))
8cda6f8f
GM
17795 (load library))
17796@end group
17797@end smallexample
17798
17799The name of the function, @code{load-library}, comes from the use of
17800`library' as a conventional synonym for `file'. The source for the
17801@code{load-library} command is in the @file{files.el} library.
17802
17803Another interactive command that does a slightly different job is
17804@code{load-file}. @xref{Lisp Libraries, , Libraries of Lisp Code for
17805Emacs, emacs, The GNU Emacs Manual}, for information on the
17806distinction between @code{load-library} and this command.
17807
17808@node Autoload, Simple Extension, Loading Files, Emacs Initialization
17809@section Autoloading
17810@findex autoload
17811
17812Instead of installing a function by loading the file that contains it,
17813or by evaluating the function definition, you can make the function
17814available but not actually install it until it is first called. This
17815is called @dfn{autoloading}.
17816
17817When you execute an autoloaded function, Emacs automatically evaluates
17818the file that contains the definition, and then calls the function.
17819
17820Emacs starts quicker with autoloaded functions, since their libraries
17821are not loaded right away; but you need to wait a moment when you
17822first use such a function, while its containing file is evaluated.
17823
17824Rarely used functions are frequently autoloaded. The
17825@file{loaddefs.el} library contains hundreds of autoloaded functions,
17826from @code{bookmark-set} to @code{wordstar-mode}. Of course, you may
17827come to use a `rare' function frequently. When you do, you should
17828load that function's file with a @code{load} expression in your
17829@file{.emacs} file.
17830
17831In my @file{.emacs} file, I load 14 libraries that contain functions
17832that would otherwise be autoloaded. (Actually, it would have been
17833better to include these files in my `dumped' Emacs, but I forgot.
17834@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
17835Reference Manual}, and the @file{INSTALL} file for more about
17836dumping.)
17837
17838You may also want to include autoloaded expressions in your @file{.emacs}
17839file. @code{autoload} is a built-in function that takes up to five
17840arguments, the final three of which are optional. The first argument
17841is the name of the function to be autoloaded; the second is the name
17842of the file to be loaded. The third argument is documentation for the
17843function, and the fourth tells whether the function can be called
17844interactively. The fifth argument tells what type of
17845object---@code{autoload} can handle a keymap or macro as well as a
17846function (the default is a function).
17847
17848@need 800
17849Here is a typical example:
17850
17851@smallexample
17852@group
17853(autoload 'html-helper-mode
17854 "html-helper-mode" "Edit HTML documents" t)
17855@end group
17856@end smallexample
17857
17858@noindent
17859(@code{html-helper-mode} is an older alternative to @code{html-mode},
17860which is a standard part of the distribution.)
17861
17862@noindent
17863This expression autoloads the @code{html-helper-mode} function. It
17864takes it from the @file{html-helper-mode.el} file (or from the byte
a9097c6d
KB
17865compiled version @file{html-helper-mode.elc}, if that exists.) The
17866file must be located in a directory specified by @code{load-path}.
17867The documentation says that this is a mode to help you edit documents
8cda6f8f
GM
17868written in the HyperText Markup Language. You can call this mode
17869interactively by typing @kbd{M-x html-helper-mode}. (You need to
17870duplicate the function's regular documentation in the autoload
17871expression because the regular function is not yet loaded, so its
17872documentation is not available.)
17873
17874@xref{Autoload, , Autoload, elisp, The GNU Emacs Lisp Reference
17875Manual}, for more information.
17876
17877@node Simple Extension, X11 Colors, Autoload, Emacs Initialization
17878@section A Simple Extension: @code{line-to-top-of-window}
17879@findex line-to-top-of-window
17880@cindex Simple extension in @file{.emacs} file
17881
17882Here is a simple extension to Emacs that moves the line point is on to
17883the top of the window. I use this all the time, to make text easier
17884to read.
17885
17886You can put the following code into a separate file and then load it
17887from your @file{.emacs} file, or you can include it within your
17888@file{.emacs} file.
17889
17890@need 1250
17891Here is the definition:
17892
17893@smallexample
17894@group
17895;;; Line to top of window;
17896;;; replace three keystroke sequence C-u 0 C-l
17897(defun line-to-top-of-window ()
17898 "Move the line point is on to top of window."
17899 (interactive)
17900 (recenter 0))
17901@end group
17902@end smallexample
17903
17904@need 1250
17905Now for the keybinding.
17906
17907Nowadays, function keys as well as mouse button events and
17908non-@sc{ascii} characters are written within square brackets, without
17909quotation marks. (In Emacs version 18 and before, you had to write
17910different function key bindings for each different make of terminal.)
17911
17912I bind @code{line-to-top-of-window} to my @key{F6} function key like
17913this:
17914
17915@smallexample
17916(global-set-key [f6] 'line-to-top-of-window)
17917@end smallexample
17918
17919For more information, see @ref{Init Rebinding, , Rebinding Keys in
17920Your Init File, emacs, The GNU Emacs Manual}.
17921
17922@cindex Conditional 'twixt two versions of Emacs
17923@cindex Version of Emacs, choosing
17924@cindex Emacs version, choosing
6dd28193 17925If you run two versions of GNU Emacs, such as versions 22 and 23, and
8cda6f8f
GM
17926use one @file{.emacs} file, you can select which code to evaluate with
17927the following conditional:
17928
17929@smallexample
17930@group
17931(cond
6dd28193 17932 ((= 22 emacs-major-version)
8cda6f8f 17933 ;; evaluate version 22 code
6dd28193
CY
17934 ( @dots{} ))
17935 ((= 23 emacs-major-version)
17936 ;; evaluate version 23 code
8cda6f8f
GM
17937 ( @dots{} )))
17938@end group
17939@end smallexample
17940
17941For example, in contrast to version 20, more recent versions blink
17942their cursors by default. I hate such blinking, as well as other
17943features, so I placed the following in my @file{.emacs}
17944file@footnote{When I start instances of Emacs that do not load my
17945@file{.emacs} file or any site file, I also turn off blinking:
17946
17947@smallexample
17948emacs -q --no-site-file -eval '(blink-cursor-mode nil)'
17949
17950@exdent Or nowadays, using an even more sophisticated set of options,
17951
17952emacs -Q - D
17953@end smallexample
17954}:
17955
17956@smallexample
17957@group
6dd28193
CY
17958(when (>= emacs-major-version 21)
17959 (blink-cursor-mode 0)
17960 ;; Insert newline when you press `C-n' (next-line)
17961 ;; at the end of the buffer
17962 (setq next-line-add-newlines t)
8cda6f8f
GM
17963@end group
17964@group
6dd28193
CY
17965 ;; Turn on image viewing
17966 (auto-image-file-mode t)
8cda6f8f
GM
17967@end group
17968@group
6dd28193
CY
17969 ;; Turn on menu bar (this bar has text)
17970 ;; (Use numeric argument to turn on)
17971 (menu-bar-mode 1)
8cda6f8f
GM
17972@end group
17973@group
6dd28193
CY
17974 ;; Turn off tool bar (this bar has icons)
17975 ;; (Use numeric argument to turn on)
17976 (tool-bar-mode nil)
8cda6f8f 17977@end group
8cda6f8f 17978@group
6dd28193
CY
17979 ;; Turn off tooltip mode for tool bar
17980 ;; (This mode causes icon explanations to pop up)
17981 ;; (Use numeric argument to turn on)
17982 (tooltip-mode nil)
17983 ;; If tooltips turned on, make tips appear promptly
17984 (setq tooltip-delay 0.1) ; default is 0.7 second
17985 )
8cda6f8f
GM
17986@end group
17987@end smallexample
17988
8cda6f8f
GM
17989@node X11 Colors, Miscellaneous, Simple Extension, Emacs Initialization
17990@section X11 Colors
17991
17992You can specify colors when you use Emacs with the MIT X Windowing
17993system.
17994
17995I dislike the default colors and specify my own.
17996
17997@need 1250
17998Here are the expressions in my @file{.emacs}
17999file that set values:
18000
18001@smallexample
18002@group
18003;; Set cursor color
18004(set-cursor-color "white")
18005
18006;; Set mouse color
18007(set-mouse-color "white")
18008
18009;; Set foreground and background
18010(set-foreground-color "white")
18011(set-background-color "darkblue")
18012@end group
18013
18014@group
18015;;; Set highlighting colors for isearch and drag
18016(set-face-foreground 'highlight "white")
18017(set-face-background 'highlight "blue")
18018@end group
18019
18020@group
18021(set-face-foreground 'region "cyan")
18022(set-face-background 'region "blue")
18023@end group
18024
18025@group
18026(set-face-foreground 'secondary-selection "skyblue")
18027(set-face-background 'secondary-selection "darkblue")
18028@end group
18029
18030@group
18031;; Set calendar highlighting colors
18032(setq calendar-load-hook
18033 '(lambda ()
18034 (set-face-foreground 'diary-face "skyblue")
18035 (set-face-background 'holiday-face "slate blue")
18036 (set-face-foreground 'holiday-face "white")))
18037@end group
18038@end smallexample
18039
18040The various shades of blue soothe my eye and prevent me from seeing
18041the screen flicker.
18042
18043Alternatively, I could have set my specifications in various X
18044initialization files. For example, I could set the foreground,
18045background, cursor, and pointer (i.e., mouse) colors in my
18046@file{~/.Xresources} file like this:
18047
18048@smallexample
18049@group
18050Emacs*foreground: white
18051Emacs*background: darkblue
18052Emacs*cursorColor: white
18053Emacs*pointerColor: white
18054@end group
18055@end smallexample
18056
18057In any event, since it is not part of Emacs, I set the root color of
18058my X window in my @file{~/.xinitrc} file, like this@footnote{I also
18059run more modern window managers, such as Enlightenment, Gnome, or KDE;
18060in those cases, I often specify an image rather than a plain color.}:
18061
18062@smallexample
18063xsetroot -solid Navy -fg white &
18064@end smallexample
18065
18066@need 1700
18067@node Miscellaneous, Mode Line, X11 Colors, Emacs Initialization
18068@section Miscellaneous Settings for a @file{.emacs} File
18069
18070@need 1250
18071Here are a few miscellaneous settings:
18072@sp 1
18073
18074@itemize @minus
18075@item
18076Set the shape and color of the mouse cursor:
18077
18078@smallexample
18079@group
18080; Cursor shapes are defined in
18081; `/usr/include/X11/cursorfont.h';
18082; for example, the `target' cursor is number 128;
18083; the `top_left_arrow' cursor is number 132.
18084@end group
18085
18086@group
18087(let ((mpointer (x-get-resource "*mpointer"
18088 "*emacs*mpointer")))
18089 ;; If you have not set your mouse pointer
18090 ;; then set it, otherwise leave as is:
18091 (if (eq mpointer nil)
18092 (setq mpointer "132")) ; top_left_arrow
18093@end group
18094@group
18095 (setq x-pointer-shape (string-to-int mpointer))
18096 (set-mouse-color "white"))
18097@end group
18098@end smallexample
18099
18100@item
18101Or you can set the values of a variety of features in an alist, like
18102this:
18103
18104@smallexample
18105@group
18106(setq-default
18107 default-frame-alist
18108 '((cursor-color . "white")
18109 (mouse-color . "white")
18110 (foreground-color . "white")
18111 (background-color . "DodgerBlue4")
18112 ;; (cursor-type . bar)
18113 (cursor-type . box)
18114@end group
18115@group
18116 (tool-bar-lines . 0)
18117 (menu-bar-lines . 1)
18118 (width . 80)
18119 (height . 58)
18120 (font .
18121 "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO8859-1")
18122 ))
18123@end group
18124@end smallexample
18125
18126@item
18127Convert @kbd{@key{CTRL}-h} into @key{DEL} and @key{DEL}
18128into @kbd{@key{CTRL}-h}.@*
18129(Some older keyboards needed this, although I have not seen the
18130problem recently.)
18131
18132@smallexample
18133@group
18134;; Translate `C-h' to <DEL>.
18135; (keyboard-translate ?\C-h ?\C-?)
18136
18137;; Translate <DEL> to `C-h'.
18138(keyboard-translate ?\C-? ?\C-h)
18139@end group
18140@end smallexample
18141
18142@item Turn off a blinking cursor!
18143
18144@smallexample
18145@group
18146(if (fboundp 'blink-cursor-mode)
18147 (blink-cursor-mode -1))
18148@end group
18149@end smallexample
18150
18151@noindent
18152or start GNU Emacs with the command @code{emacs -nbc}.
18153
18154@need 1250
18155@item When using `grep'@*
18156@samp{-i}@w{ } Ignore case distinctions@*
18157@samp{-n}@w{ } Prefix each line of output with line number@*
18158@samp{-H}@w{ } Print the filename for each match.@*
18159@samp{-e}@w{ } Protect patterns beginning with a hyphen character, @samp{-}
18160
18161@smallexample
18162(setq grep-command "grep -i -nH -e ")
18163@end smallexample
18164
18165@ignore
18166@c Evidently, no longer needed in GNU Emacs 22
18167
18168item Automatically uncompress compressed files when visiting them
18169
18170smallexample
18171(load "uncompress")
18172end smallexample
18173
18174@end ignore
18175
18176@item Find an existing buffer, even if it has a different name@*
18177This avoids problems with symbolic links.
18178
18179@smallexample
18180(setq find-file-existing-other-name t)
18181@end smallexample
18182
18183@item Set your language environment and default input method
18184
18185@smallexample
18186@group
18187(set-language-environment "latin-1")
18188;; Remember you can enable or disable multilingual text input
18189;; with the @code{toggle-input-method'} (@kbd{C-\}) command
18190(setq default-input-method "latin-1-prefix")
18191@end group
18192@end smallexample
18193
18194If you want to write with Chinese `GB' characters, set this instead:
18195
18196@smallexample
18197@group
18198(set-language-environment "Chinese-GB")
18199(setq default-input-method "chinese-tonepy")
18200@end group
18201@end smallexample
18202@end itemize
18203
18204@subsubheading Fixing Unpleasant Key Bindings
18205@cindex Key bindings, fixing
18206@cindex Bindings, key, fixing unpleasant
18207
18208Some systems bind keys unpleasantly. Sometimes, for example, the
18209@key{CTRL} key appears in an awkward spot rather than at the far left
18210of the home row.
18211
18212Usually, when people fix these sorts of keybindings, they do not
18213change their @file{~/.emacs} file. Instead, they bind the proper keys
18214on their consoles with the @code{loadkeys} or @code{install-keymap}
18215commands in their boot script and then include @code{xmodmap} commands
18216in their @file{.xinitrc} or @file{.Xsession} file for X Windows.
18217
18218@need 1250
18219@noindent
18220For a boot script:
18221
18222@smallexample
18223@group
18224loadkeys /usr/share/keymaps/i386/qwerty/emacs2.kmap.gz
18225@exdent or
18226install-keymap emacs2
18227@end group
18228@end smallexample
18229
18230@need 1250
18231@noindent
18232For a @file{.xinitrc} or @file{.Xsession} file when the @key{Caps
18233Lock} key is at the far left of the home row:
18234
18235@smallexample
18236@group
18237# Bind the key labeled `Caps Lock' to `Control'
18238# (Such a broken user interface suggests that keyboard manufacturers
18239# think that computers are typewriters from 1885.)
18240
18241xmodmap -e "clear Lock"
18242xmodmap -e "add Control = Caps_Lock"
18243@end group
18244@end smallexample
18245
18246@need 1250
18247@noindent
18248In a @file{.xinitrc} or @file{.Xsession} file, to convert an @key{ALT}
18249key to a @key{META} key:
18250
18251@smallexample
18252@group
18253# Some ill designed keyboards have a key labeled ALT and no Meta
18254xmodmap -e "keysym Alt_L = Meta_L Alt_L"
18255@end group
18256@end smallexample
18257
18258@need 1700
18259@node Mode Line, , Miscellaneous, Emacs Initialization
18260@section A Modified Mode Line
cd61af01 18261@vindex mode-line-format
8cda6f8f
GM
18262@cindex Mode line format
18263
18264Finally, a feature I really like: a modified mode line.
18265
18266When I work over a network, I forget which machine I am using. Also,
18267I tend to I lose track of where I am, and which line point is on.
18268
18269So I reset my mode line to look like this:
18270
18271@smallexample
18272-:-- foo.texi rattlesnake:/home/bob/ Line 1 (Texinfo Fill) Top
18273@end smallexample
18274
18275I am visiting a file called @file{foo.texi}, on my machine
18276@file{rattlesnake} in my @file{/home/bob} buffer. I am on line 1, in
18277Texinfo mode, and am at the top of the buffer.
18278
18279@need 1200
18280My @file{.emacs} file has a section that looks like this:
18281
18282@smallexample
18283@group
18284;; Set a Mode Line that tells me which machine, which directory,
18285;; and which line I am on, plus the other customary information.
cd61af01 18286(setq-default mode-line-format
8cda6f8f
GM
18287 (quote
18288 (#("-" 0 1
18289 (help-echo
18290 "mouse-1: select window, mouse-2: delete others ..."))
18291 mode-line-mule-info
18292 mode-line-modified
18293 mode-line-frame-identification
18294 " "
18295@end group
18296@group
18297 mode-line-buffer-identification
18298 " "
18299 (:eval (substring
18300 (system-name) 0 (string-match "\\..+" (system-name))))
18301 ":"
18302 default-directory
18303 #(" " 0 1
18304 (help-echo
18305 "mouse-1: select window, mouse-2: delete others ..."))
18306 (line-number-mode " Line %l ")
18307 global-mode-string
18308@end group
18309@group
18310 #(" %[(" 0 6
18311 (help-echo
18312 "mouse-1: select window, mouse-2: delete others ..."))
18313 (:eval (mode-line-mode-name))
18314 mode-line-process
18315 minor-mode-alist
18316 #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
18317 ")%] "
18318 (-3 . "%P")
18319 ;; "-%-"
18320 )))
18321@end group
18322@end smallexample
18323
18324@noindent
18325Here, I redefine the default mode line. Most of the parts are from
18326the original; but I make a few changes. I set the @emph{default} mode
18327line format so as to permit various modes, such as Info, to override
18328it.
18329
18330Many elements in the list are self-explanatory:
18331@code{mode-line-modified} is a variable that tells whether the buffer
18332has been modified, @code{mode-name} tells the name of the mode, and so
18333on. However, the format looks complicated because of two features we
18334have not discussed.
18335
18336@cindex Properties, in mode line example
18337The first string in the mode line is a dash or hyphen, @samp{-}. In
18338the old days, it would have been specified simply as @code{"-"}. But
18339nowadays, Emacs can add properties to a string, such as highlighting
18340or, as in this case, a help feature. If you place your mouse cursor
18341over the hyphen, some help information appears (By default, you must
18342wait seven-tenths of a second before the information appears. You can
18343change that timing by changing the value of @code{tooltip-delay}.)
18344
18345@need 1000
18346The new string format has a special syntax:
18347
18348@smallexample
18349#("-" 0 1 (help-echo "mouse-1: select window, ..."))
18350@end smallexample
18351
18352@noindent
18353The @code{#(} begins a list. The first element of the list is the
18354string itself, just one @samp{-}. The second and third
18355elements specify the range over which the fourth element applies. A
18356range starts @emph{after} a character, so a zero means the range
18357starts just before the first character; a 1 means that the range ends
18358just after the first character. The third element is the property for
18359the range. It consists of a property list, a
18360property name, in this case, @samp{help-echo}, followed by a value, in this
18361case, a string. The second, third, and fourth elements of this new
18362string format can be repeated.
18363
18364@xref{Text Properties, , Text Properties, elisp, The GNU Emacs Lisp
18365Reference Manual}, and see @ref{Mode Line Format, , Mode Line Format,
18366elisp, The GNU Emacs Lisp Reference Manual}, for more information.
18367
18368@code{mode-line-buffer-identification}
18369displays the current buffer name. It is a list
18370beginning @code{(#("%12b" 0 4 @dots{}}.
18371The @code{#(} begins the list.
18372
18373The @samp{"%12b"} displays the current buffer name, using the
18374@code{buffer-name} function with which we are familiar; the `12'
18375specifies the maximum number of characters that will be displayed.
18376When a name has fewer characters, whitespace is added to fill out to
18377this number. (Buffer names can and often should be longer than 12
18378characters; this length works well in a typical 80 column wide
18379window.)
18380
18381@code{:eval} says to evaluate the following form and use the result as
18382a string to display. In this case, the expression displays the first
18383component of the full system name. The end of the first component is
18384a @samp{.} (`period'), so I use the @code{string-match} function to
18385tell me the length of the first component. The substring from the
18386zeroth character to that length is the name of the machine.
18387
18388@need 1250
18389This is the expression:
18390
18391@smallexample
18392@group
18393(:eval (substring
18394 (system-name) 0 (string-match "\\..+" (system-name))))
18395@end group
18396@end smallexample
18397
18398@samp{%[} and @samp{%]} cause a pair of square brackets
18399to appear for each recursive editing level. @samp{%n} says `Narrow'
18400when narrowing is in effect. @samp{%P} tells you the percentage of
18401the buffer that is above the bottom of the window, or `Top', `Bottom',
18402or `All'. (A lower case @samp{p} tell you the percentage above the
18403@emph{top} of the window.) @samp{%-} inserts enough dashes to fill
18404out the line.
18405
18406Remember, ``You don't have to like Emacs to like it'' --- your own
18407Emacs can have different colors, different commands, and different
18408keys than a default Emacs.
18409
18410On the other hand, if you want to bring up a plain `out of the box'
18411Emacs, with no customization, type:
18412
18413@smallexample
18414emacs -q
18415@end smallexample
18416
18417@noindent
18418This will start an Emacs that does @emph{not} load your
18419@file{~/.emacs} initialization file. A plain, default Emacs. Nothing
18420more.
18421
18422@node Debugging, Conclusion, Emacs Initialization, Top
18423@chapter Debugging
18424@cindex debugging
18425
18426GNU Emacs has two debuggers, @code{debug} and @code{edebug}. The
18427first is built into the internals of Emacs and is always with you;
18428the second requires that you instrument a function before you can use it.
18429
18430Both debuggers are described extensively in @ref{Debugging, ,
18431Debugging Lisp Programs, elisp, The GNU Emacs Lisp Reference Manual}.
18432In this chapter, I will walk through a short example of each.
18433
18434@menu
18435* debug:: How to use the built-in debugger.
18436* debug-on-entry:: Start debugging when you call a function.
18437* debug-on-quit:: Start debugging when you quit with @kbd{C-g}.
18438* edebug:: How to use Edebug, a source level debugger.
18439* Debugging Exercises::
18440@end menu
18441
18442@node debug, debug-on-entry, Debugging, Debugging
18443@section @code{debug}
18444@findex debug
18445
18446Suppose you have written a function definition that is intended to
18447return the sum of the numbers 1 through a given number. (This is the
18448@code{triangle} function discussed earlier. @xref{Decrementing
18449Example, , Example with Decrementing Counter}, for a discussion.)
18450@c xref{Decrementing Loop,, Loop with a Decrementing Counter}, for a discussion.)
18451
18452However, your function definition has a bug. You have mistyped
18453@samp{1=} for @samp{1-}. Here is the broken definition:
18454
18455@findex triangle-bugged
18456@smallexample
18457@group
18458(defun triangle-bugged (number)
18459 "Return sum of numbers 1 through NUMBER inclusive."
18460 (let ((total 0))
18461 (while (> number 0)
18462 (setq total (+ total number))
18463 (setq number (1= number))) ; @r{Error here.}
18464 total))
18465@end group
18466@end smallexample
18467
18468If you are reading this in Info, you can evaluate this definition in
18469the normal fashion. You will see @code{triangle-bugged} appear in the
18470echo area.
18471
18472@need 1250
18473Now evaluate the @code{triangle-bugged} function with an
18474argument of 4:
18475
18476@smallexample
18477(triangle-bugged 4)
18478@end smallexample
18479
18480@noindent
18481In a recent GNU Emacs, you will create and enter a @file{*Backtrace*}
18482buffer that says:
18483
18484@noindent
18485@smallexample
18486@group
18487---------- Buffer: *Backtrace* ----------
18488Debugger entered--Lisp error: (void-function 1=)
18489 (1= number)
18490 (setq number (1= number))
18491 (while (> number 0) (setq total (+ total number))
18492 (setq number (1= number)))
18493 (let ((total 0)) (while (> number 0) (setq total ...)
18494 (setq number ...)) total)
18495 triangle-bugged(4)
18496@end group
18497@group
18498 eval((triangle-bugged 4))
18499 eval-last-sexp-1(nil)
18500 eval-last-sexp(nil)
18501 call-interactively(eval-last-sexp)
18502---------- Buffer: *Backtrace* ----------
18503@end group
18504@end smallexample
18505
18506@noindent
18507(I have reformatted this example slightly; the debugger does not fold
18508long lines. As usual, you can quit the debugger by typing @kbd{q} in
18509the @file{*Backtrace*} buffer.)
18510
18511In practice, for a bug as simple as this, the `Lisp error' line will
18512tell you what you need to know to correct the definition. The
18513function @code{1=} is `void'.
18514
18515@ignore
18516@need 800
18517In GNU Emacs 20 and before, you will see:
18518
18519@smallexample
18520Symbol's function definition is void:@: 1=
18521@end smallexample
18522
18523@noindent
18524which has the same meaning as the @file{*Backtrace*} buffer line in
18525version 21.
18526@end ignore
18527
18528However, suppose you are not quite certain what is going on?
18529You can read the complete backtrace.
18530
18531In this case, you need to run a recent GNU Emacs, which automatically
18532starts the debugger that puts you in the @file{*Backtrace*} buffer; or
18533else, you need to start the debugger manually as described below.
18534
18535Read the @file{*Backtrace*} buffer from the bottom up; it tells you
18536what Emacs did that led to the error. Emacs made an interactive call
18537to @kbd{C-x C-e} (@code{eval-last-sexp}), which led to the evaluation
18538of the @code{triangle-bugged} expression. Each line above tells you
18539what the Lisp interpreter evaluated next.
18540
18541@need 1250
18542The third line from the top of the buffer is
18543
18544@smallexample
18545(setq number (1= number))
18546@end smallexample
18547
18548@noindent
18549Emacs tried to evaluate this expression; in order to do so, it tried
18550to evaluate the inner expression shown on the second line from the
18551top:
18552
18553@smallexample
18554(1= number)
18555@end smallexample
18556
18557@need 1250
18558@noindent
18559This is where the error occurred; as the top line says:
18560
18561@smallexample
18562Debugger entered--Lisp error: (void-function 1=)
18563@end smallexample
18564
18565@noindent
18566You can correct the mistake, re-evaluate the function definition, and
18567then run your test again.
18568
18569@node debug-on-entry, debug-on-quit, debug, Debugging
18570@section @code{debug-on-entry}
18571@findex debug-on-entry
18572
18573A recent GNU Emacs starts the debugger automatically when your
18574function has an error.
18575
18576@ignore
18577GNU Emacs version 20 and before did not; it simply
18578presented you with an error message. You had to start the debugger
18579manually.
18580@end ignore
18581
18582Incidentally, you can start the debugger manually for all versions of
18583Emacs; the advantage is that the debugger runs even if you do not have
18584a bug in your code. Sometimes your code will be free of bugs!
18585
18586You can enter the debugger when you call the function by calling
18587@code{debug-on-entry}.
18588
18589@need 1250
18590@noindent
18591Type:
18592
18593@smallexample
18594M-x debug-on-entry RET triangle-bugged RET
18595@end smallexample
18596
18597@need 1250
18598@noindent
18599Now, evaluate the following:
18600
18601@smallexample
18602(triangle-bugged 5)
18603@end smallexample
18604
18605@noindent
18606All versions of Emacs will create a @file{*Backtrace*} buffer and tell
18607you that it is beginning to evaluate the @code{triangle-bugged}
18608function:
18609
18610@smallexample
18611@group
18612---------- Buffer: *Backtrace* ----------
18613Debugger entered--entering a function:
18614* triangle-bugged(5)
18615 eval((triangle-bugged 5))
18616@end group
18617@group
18618 eval-last-sexp-1(nil)
18619 eval-last-sexp(nil)
18620 call-interactively(eval-last-sexp)
18621---------- Buffer: *Backtrace* ----------
18622@end group
18623@end smallexample
18624
18625In the @file{*Backtrace*} buffer, type @kbd{d}. Emacs will evaluate
18626the first expression in @code{triangle-bugged}; the buffer will look
18627like this:
18628
18629@smallexample
18630@group
18631---------- Buffer: *Backtrace* ----------
18632Debugger entered--beginning evaluation of function call form:
18633* (let ((total 0)) (while (> number 0) (setq total ...)
18634 (setq number ...)) total)
18635* triangle-bugged(5)
18636 eval((triangle-bugged 5))
18637@end group
18638@group
18639 eval-last-sexp-1(nil)
18640 eval-last-sexp(nil)
18641 call-interactively(eval-last-sexp)
18642---------- Buffer: *Backtrace* ----------
18643@end group
18644@end smallexample
18645
18646@noindent
18647Now, type @kbd{d} again, eight times, slowly. Each time you type
18648@kbd{d}, Emacs will evaluate another expression in the function
18649definition.
18650
18651@need 1750
18652Eventually, the buffer will look like this:
18653
18654@smallexample
18655@group
18656---------- Buffer: *Backtrace* ----------
18657Debugger entered--beginning evaluation of function call form:
18658* (setq number (1= number))
18659* (while (> number 0) (setq total (+ total number))
18660 (setq number (1= number)))
18661@group
18662@end group
18663* (let ((total 0)) (while (> number 0) (setq total ...)
18664 (setq number ...)) total)
18665* triangle-bugged(5)
18666 eval((triangle-bugged 5))
18667@group
18668@end group
18669 eval-last-sexp-1(nil)
18670 eval-last-sexp(nil)
18671 call-interactively(eval-last-sexp)
18672---------- Buffer: *Backtrace* ----------
18673@end group
18674@end smallexample
18675
18676@need 1500
18677@noindent
18678Finally, after you type @kbd{d} two more times, Emacs will reach the
18679error, and the top two lines of the @file{*Backtrace*} buffer will look
18680like this:
18681
18682@smallexample
18683@group
18684---------- Buffer: *Backtrace* ----------
18685Debugger entered--Lisp error: (void-function 1=)
18686* (1= number)
18687@dots{}
18688---------- Buffer: *Backtrace* ----------
18689@end group
18690@end smallexample
18691
18692By typing @kbd{d}, you were able to step through the function.
18693
18694You can quit a @file{*Backtrace*} buffer by typing @kbd{q} in it; this
18695quits the trace, but does not cancel @code{debug-on-entry}.
18696
18697@findex cancel-debug-on-entry
18698To cancel the effect of @code{debug-on-entry}, call
18699@code{cancel-debug-on-entry} and the name of the function, like this:
18700
18701@smallexample
18702M-x cancel-debug-on-entry RET triangle-bugged RET
18703@end smallexample
18704
18705@noindent
18706(If you are reading this in Info, cancel @code{debug-on-entry} now.)
18707
18708@node debug-on-quit, edebug, debug-on-entry, Debugging
18709@section @code{debug-on-quit} and @code{(debug)}
18710
18711In addition to setting @code{debug-on-error} or calling @code{debug-on-entry},
18712there are two other ways to start @code{debug}.
18713
18714@findex debug-on-quit
18715You can start @code{debug} whenever you type @kbd{C-g}
18716(@code{keyboard-quit}) by setting the variable @code{debug-on-quit} to
18717@code{t}. This is useful for debugging infinite loops.
18718
18719@need 1500
18720@cindex @code{(debug)} in code
18721Or, you can insert a line that says @code{(debug)} into your code
18722where you want the debugger to start, like this:
18723
18724@smallexample
18725@group
18726(defun triangle-bugged (number)
18727 "Return sum of numbers 1 through NUMBER inclusive."
18728 (let ((total 0))
18729 (while (> number 0)
18730 (setq total (+ total number))
18731 (debug) ; @r{Start debugger.}
18732 (setq number (1= number))) ; @r{Error here.}
18733 total))
18734@end group
18735@end smallexample
18736
18737The @code{debug} function is described in detail in @ref{Debugger, ,
18738The Lisp Debugger, elisp, The GNU Emacs Lisp Reference Manual}.
18739
18740@node edebug, Debugging Exercises, debug-on-quit, Debugging
18741@section The @code{edebug} Source Level Debugger
18742@cindex Source level debugger
18743@findex edebug
18744
18745Edebug is a source level debugger. Edebug normally displays the
18746source of the code you are debugging, with an arrow at the left that
18747shows which line you are currently executing.
18748
18749You can walk through the execution of a function, line by line, or run
18750quickly until reaching a @dfn{breakpoint} where execution stops.
18751
18752Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
18753Lisp Reference Manual}.
18754
18755@need 1250
18756Here is a bugged function definition for @code{triangle-recursively}.
18757@xref{Recursive triangle function, , Recursion in place of a counter},
18758for a review of it.
18759
18760@smallexample
18761@group
18762(defun triangle-recursively-bugged (number)
18763 "Return sum of numbers 1 through NUMBER inclusive.
18764Uses recursion."
18765 (if (= number 1)
18766 1
18767 (+ number
18768 (triangle-recursively-bugged
18769 (1= number))))) ; @r{Error here.}
18770@end group
18771@end smallexample
18772
18773@noindent
18774Normally, you would install this definition by positioning your cursor
18775after the function's closing parenthesis and typing @kbd{C-x C-e}
18776(@code{eval-last-sexp}) or else by positioning your cursor within the
18777definition and typing @kbd{C-M-x} (@code{eval-defun}). (By default,
18778the @code{eval-defun} command works only in Emacs Lisp mode or in Lisp
a1539cd7 18779Interaction mode.)
8cda6f8f
GM
18780
18781@need 1500
18782However, to prepare this function definition for Edebug, you must
18783first @dfn{instrument} the code using a different command. You can do
18784this by positioning your cursor within or just after the definition
18785and typing
18786
18787@smallexample
18788M-x edebug-defun RET
18789@end smallexample
18790
18791@noindent
18792This will cause Emacs to load Edebug automatically if it is not
18793already loaded, and properly instrument the function.
18794
18795After instrumenting the function, place your cursor after the
18796following expression and type @kbd{C-x C-e} (@code{eval-last-sexp}):
18797
18798@smallexample
18799(triangle-recursively-bugged 3)
18800@end smallexample
18801
18802@noindent
18803You will be jumped back to the source for
18804@code{triangle-recursively-bugged} and the cursor positioned at the
18805beginning of the @code{if} line of the function. Also, you will see
18806an arrowhead at the left hand side of that line. The arrowhead marks
18807the line where the function is executing. (In the following examples,
18808we show the arrowhead with @samp{=>}; in a windowing system, you may
18809see the arrowhead as a solid triangle in the window `fringe'.)
18810
18811@smallexample
18812=>@point{}(if (= number 1)
18813@end smallexample
18814
18815@noindent
18816@iftex
18817In the example, the location of point is displayed with a star,
18818@samp{@point{}} (in Info, it is displayed as @samp{-!-}).
18819@end iftex
18820@ifnottex
18821In the example, the location of point is displayed as @samp{@point{}}
18822(in a printed book, it is displayed with a five pointed star).
18823@end ifnottex
18824
18825If you now press @key{SPC}, point will move to the next expression to
18826be executed; the line will look like this:
18827
18828@smallexample
18829=>(if @point{}(= number 1)
18830@end smallexample
18831
18832@noindent
18833As you continue to press @key{SPC}, point will move from expression to
18834expression. At the same time, whenever an expression returns a value,
18835that value will be displayed in the echo area. For example, after you
18836move point past @code{number}, you will see the following:
18837
18838@smallexample
18839Result: 3 (#o3, #x3, ?\C-c)
18840@end smallexample
18841
18842@noindent
18843This means the value of @code{number} is 3, which is octal three,
18844hexadecimal three, and @sc{ascii} `control-c' (the third letter of the
18845alphabet, in case you need to know this information).
18846
18847You can continue moving through the code until you reach the line with
18848the error. Before evaluation, that line looks like this:
18849
18850@smallexample
18851=> @point{}(1= number))))) ; @r{Error here.}
18852@end smallexample
18853
18854@need 1250
18855@noindent
18856When you press @key{SPC} once again, you will produce an error message
18857that says:
18858
18859@smallexample
18860Symbol's function definition is void:@: 1=
18861@end smallexample
18862
18863@noindent
18864This is the bug.
18865
18866Press @kbd{q} to quit Edebug.
18867
18868To remove instrumentation from a function definition, simply
18869re-evaluate it with a command that does not instrument it.
18870For example, you could place your cursor after the definition's
18871closing parenthesis and type @kbd{C-x C-e}.
18872
18873Edebug does a great deal more than walk with you through a function.
18874You can set it so it races through on its own, stopping only at an
18875error or at specified stopping points; you can cause it to display the
18876changing values of various expressions; you can find out how many
18877times a function is called, and more.
18878
18879Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
18880Lisp Reference Manual}.
18881
18882@need 1500
18883@node Debugging Exercises, , edebug, Debugging
18884@section Debugging Exercises
18885
18886@itemize @bullet
18887@item
18888Install the @code{count-words-region} function and then cause it to
18889enter the built-in debugger when you call it. Run the command on a
18890region containing two words. You will need to press @kbd{d} a
18891remarkable number of times. On your system, is a `hook' called after
18892the command finishes? (For information on hooks, see @ref{Command
18893Overview, , Command Loop Overview, elisp, The GNU Emacs Lisp Reference
18894Manual}.)
18895
18896@item
18897Copy @code{count-words-region} into the @file{*scratch*} buffer,
18898instrument the function for Edebug, and walk through its execution.
18899The function does not need to have a bug, although you can introduce
18900one if you wish. If the function lacks a bug, the walk-through
18901completes without problems.
18902
18903@item
18904While running Edebug, type @kbd{?} to see a list of all the Edebug commands.
18905(The @code{global-edebug-prefix} is usually @kbd{C-x X}, i.e.@:
18906@kbd{@key{CTRL}-x} followed by an upper case @kbd{X}; use this prefix
18907for commands made outside of the Edebug debugging buffer.)
18908
18909@item
18910In the Edebug debugging buffer, use the @kbd{p}
18911(@code{edebug-bounce-point}) command to see where in the region the
18912@code{count-words-region} is working.
18913
18914@item
18915Move point to some spot further down the function and then type the
18916@kbd{h} (@code{edebug-goto-here}) command to jump to that location.
18917
18918@item
18919Use the @kbd{t} (@code{edebug-trace-mode}) command to cause Edebug to
18920walk through the function on its own; use an upper case @kbd{T} for
18921@code{edebug-Trace-fast-mode}.
18922
18923@item
18924Set a breakpoint, then run Edebug in Trace mode until it reaches the
18925stopping point.
18926@end itemize
18927
18928@node Conclusion, the-the, Debugging, Top
18929@chapter Conclusion
18930
18931We have now reached the end of this Introduction. You have now
18932learned enough about programming in Emacs Lisp to set values, to write
18933simple @file{.emacs} files for yourself and your friends, and write
18934simple customizations and extensions to Emacs.
18935
18936This is a place to stop. Or, if you wish, you can now go onward, and
18937teach yourself.
18938
18939You have learned some of the basic nuts and bolts of programming. But
18940only some. There are a great many more brackets and hinges that are
18941easy to use that we have not touched.
18942
18943A path you can follow right now lies among the sources to GNU Emacs
18944and in
18945@ifnotinfo
18946@cite{The GNU Emacs Lisp Reference Manual}.
18947@end ifnotinfo
18948@ifinfo
18949@ref{Top, , The GNU Emacs Lisp Reference Manual, elisp, The GNU
18950Emacs Lisp Reference Manual}.
18951@end ifinfo
18952
18953The Emacs Lisp sources are an adventure. When you read the sources and
18954come across a function or expression that is unfamiliar, you need to
18955figure out or find out what it does.
18956
18957Go to the Reference Manual. It is a thorough, complete, and fairly
18958easy-to-read description of Emacs Lisp. It is written not only for
18959experts, but for people who know what you know. (The @cite{Reference
18960Manual} comes with the standard GNU Emacs distribution. Like this
18961introduction, it comes as a Texinfo source file, so you can read it
18962on-line and as a typeset, printed book.)
18963
18964Go to the other on-line help that is part of GNU Emacs: the on-line
88c26f5c 18965documentation for all functions and variables, and @code{find-tag},
8cda6f8f
GM
18966the program that takes you to sources.
18967
18968Here is an example of how I explore the sources. Because of its name,
18969@file{simple.el} is the file I looked at first, a long time ago. As
18970it happens some of the functions in @file{simple.el} are complicated,
18971or at least look complicated at first sight. The @code{open-line}
18972function, for example, looks complicated.
18973
18974You may want to walk through this function slowly, as we did with the
18975@code{forward-sentence} function. (@xref{forward-sentence, The
18976@code{forward-sentence} function}.) Or you may want to skip that
18977function and look at another, such as @code{split-line}. You don't
18978need to read all the functions. According to
18979@code{count-words-in-defun}, the @code{split-line} function contains
18980102 words and symbols.
18981
18982Even though it is short, @code{split-line} contains expressions
18983we have not studied: @code{skip-chars-forward}, @code{indent-to},
18984@code{current-column} and @code{insert-and-inherit}.
18985
18986Consider the @code{skip-chars-forward} function. (It is part of the
18987function definition for @code{back-to-indentation}, which is shown in
18988@ref{Review, , Review}.)
18989
18990In GNU Emacs, you can find out more about @code{skip-chars-forward} by
18991typing @kbd{C-h f} (@code{describe-function}) and the name of the
18992function. This gives you the function documentation.
18993
18994You may be able to guess what is done by a well named function such as
18995@code{indent-to}; or you can look it up, too. Incidentally, the
18996@code{describe-function} function itself is in @file{help.el}; it is
18997one of those long, but decipherable functions. You can look up
18998@code{describe-function} using the @kbd{C-h f} command!
18999
19000In this instance, since the code is Lisp, the @file{*Help*} buffer
19001contains the name of the library containing the function's source.
19002You can put point over the name of the library and press the RET key,
19003which in this situation is bound to @code{help-follow}, and be taken
19004directly to the source, in the same way as @kbd{M-.}
19005(@code{find-tag}).
19006
19007The definition for @code{describe-function} illustrates how to
19008customize the @code{interactive} expression without using the standard
19009character codes; and it shows how to create a temporary buffer.
19010
19011(The @code{indent-to} function is written in C rather than Emacs Lisp;
19012it is a `built-in' function. @code{help-follow} takes you to its
19013source as does @code{find-tag}, when properly set up.)
19014
19015You can look at a function's source using @code{find-tag}, which is
19016bound to @kbd{M-.} Finally, you can find out what the Reference
19017Manual has to say by visiting the manual in Info, and typing @kbd{i}
19018(@code{Info-index}) and the name of the function, or by looking up the
19019function in the index to a printed copy of the manual.
19020
19021Similarly, you can find out what is meant by
19022@code{insert-and-inherit}.
19023
19024Other interesting source files include @file{paragraphs.el},
19025@file{loaddefs.el}, and @file{loadup.el}. The @file{paragraphs.el}
19026file includes short, easily understood functions as well as longer
19027ones. The @file{loaddefs.el} file contains the many standard
19028autoloads and many keymaps. I have never looked at it all; only at
19029parts. @file{loadup.el} is the file that loads the standard parts of
19030Emacs; it tells you a great deal about how Emacs is built.
19031(@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
19032Reference Manual}, for more about building.)
19033
19034As I said, you have learned some nuts and bolts; however, and very
19035importantly, we have hardly touched major aspects of programming; I
19036have said nothing about how to sort information, except to use the
19037predefined @code{sort} function; I have said nothing about how to store
19038information, except to use variables and lists; I have said nothing
19039about how to write programs that write programs. These are topics for
19040another, and different kind of book, a different kind of learning.
19041
19042What you have done is learn enough for much practical work with GNU
19043Emacs. What you have done is get started. This is the end of a
19044beginning.
19045
19046@c ================ Appendix ================
19047
19048@node the-the, Kill Ring, Conclusion, Top
19049@appendix The @code{the-the} Function
19050@findex the-the
19051@cindex Duplicated words function
19052@cindex Words, duplicated
19053
19054Sometimes when you you write text, you duplicate words---as with ``you
19055you'' near the beginning of this sentence. I find that most
19056frequently, I duplicate ``the''; hence, I call the function for
19057detecting duplicated words, @code{the-the}.
19058
19059@need 1250
19060As a first step, you could use the following regular expression to
19061search for duplicates:
19062
19063@smallexample
19064\\(\\w+[ \t\n]+\\)\\1
19065@end smallexample
19066
19067@noindent
19068This regexp matches one or more word-constituent characters followed
19069by one or more spaces, tabs, or newlines. However, it does not detect
19070duplicated words on different lines, since the ending of the first
19071word, the end of the line, is different from the ending of the second
19072word, a space. (For more information about regular expressions, see
19073@ref{Regexp Search, , Regular Expression Searches}, as well as
19074@ref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
19075Manual}, and @ref{Regular Expressions, , Regular Expressions, elisp,
19076The GNU Emacs Lisp Reference Manual}.)
19077
19078You might try searching just for duplicated word-constituent
19079characters but that does not work since the pattern detects doubles
19080such as the two occurrences of `th' in `with the'.
19081
19082Another possible regexp searches for word-constituent characters
19083followed by non-word-constituent characters, reduplicated. Here,
19084@w{@samp{\\w+}} matches one or more word-constituent characters and
19085@w{@samp{\\W*}} matches zero or more non-word-constituent characters.
19086
19087@smallexample
19088\\(\\(\\w+\\)\\W*\\)\\1
19089@end smallexample
19090
19091@noindent
19092Again, not useful.
19093
19094Here is the pattern that I use. It is not perfect, but good enough.
19095@w{@samp{\\b}} matches the empty string, provided it is at the beginning
19096or end of a word; @w{@samp{[^@@ \n\t]+}} matches one or more occurrences of
19097any characters that are @emph{not} an @@-sign, space, newline, or tab.
19098
19099@smallexample
19100\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b
19101@end smallexample
19102
19103One can write more complicated expressions, but I found that this
19104expression is good enough, so I use it.
19105
19106Here is the @code{the-the} function, as I include it in my
19107@file{.emacs} file, along with a handy global key binding:
19108
19109@smallexample
19110@group
19111(defun the-the ()
19112 "Search forward for for a duplicated word."
19113 (interactive)
19114 (message "Searching for for duplicated words ...")
19115 (push-mark)
19116@end group
19117@group
19118 ;; This regexp is not perfect
19119 ;; but is fairly good over all:
19120 (if (re-search-forward
19121 "\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
19122 (message "Found duplicated word.")
19123 (message "End of buffer")))
19124@end group
19125
19126@group
19127;; Bind `the-the' to C-c \
19128(global-set-key "\C-c\\" 'the-the)
19129@end group
19130@end smallexample
19131
19132@sp 1
19133Here is test text:
19134
19135@smallexample
19136@group
19137one two two three four five
19138five six seven
19139@end group
19140@end smallexample
19141
19142You can substitute the other regular expressions shown above in the
19143function definition and try each of them on this list.
19144
19145@node Kill Ring, Full Graph, the-the, Top
19146@appendix Handling the Kill Ring
19147@cindex Kill ring handling
19148@cindex Handling the kill ring
19149@cindex Ring, making a list like a
19150
19151The kill ring is a list that is transformed into a ring by the
19152workings of the @code{current-kill} function. The @code{yank} and
19153@code{yank-pop} commands use the @code{current-kill} function.
19154
19155This appendix describes the @code{current-kill} function as well as
19156both the @code{yank} and the @code{yank-pop} commands, but first,
19157consider the workings of the kill ring.
19158
19159@menu
19160* What the Kill Ring Does::
19161* current-kill::
19162* yank:: Paste a copy of a clipped element.
19163* yank-pop:: Insert element pointed to.
19164* ring file::
19165@end menu
19166
19167@node What the Kill Ring Does, current-kill, Kill Ring, Kill Ring
19168@ifnottex
19169@unnumberedsec What the Kill Ring Does
19170@end ifnottex
19171
19172@need 1250
19173The kill ring has a default maximum length of sixty items; this number
19174is too large for an explanation. Instead, set it to four. Please
19175evaluate the following:
19176
19177@smallexample
19178@group
19179(setq old-kill-ring-max kill-ring-max)
19180(setq kill-ring-max 4)
19181@end group
19182@end smallexample
19183
19184@noindent
19185Then, please copy each line of the following indented example into the
19186kill ring. You may kill each line with @kbd{C-k} or mark it and copy
19187it with @kbd{M-w}.
19188
19189@noindent
19190(In a read-only buffer, such as the @file{*info*} buffer, the kill
19191command, @kbd{C-k} (@code{kill-line}), will not remove the text,
19192merely copy it to the kill ring. However, your machine may beep at
19193you. Alternatively, for silence, you may copy the region of each line
19194with the @kbd{M-w} (@code{kill-ring-save}) command. You must mark
19195each line for this command to succeed, but it does not matter at which
19196end you put point or mark.)
19197
19198@need 1250
19199@noindent
19200Please invoke the calls in order, so that five elements attempt to
19201fill the kill ring:
19202
19203@smallexample
19204@group
19205first some text
19206second piece of text
19207third line
19208fourth line of text
19209fifth bit of text
19210@end group
19211@end smallexample
19212
19213@need 1250
19214@noindent
19215Then find the value of @code{kill-ring} by evaluating
19216
19217@smallexample
19218kill-ring
19219@end smallexample
19220
19221@need 800
19222@noindent
19223It is:
19224
19225@smallexample
19226@group
19227("fifth bit of text" "fourth line of text"
19228"third line" "second piece of text")
19229@end group
19230@end smallexample
19231
19232@noindent
19233The first element, @samp{first some text}, was dropped.
19234
19235@need 1250
19236To return to the old value for the length of the kill ring, evaluate:
19237
19238@smallexample
19239(setq kill-ring-max old-kill-ring-max)
19240@end smallexample
19241
19242@node current-kill, yank, What the Kill Ring Does, Kill Ring
19243@comment node-name, next, previous, up
19244@appendixsec The @code{current-kill} Function
19245@findex current-kill
19246
19247The @code{current-kill} function changes the element in the kill ring
19248to which @code{kill-ring-yank-pointer} points. (Also, the
19249@code{kill-new} function sets @code{kill-ring-yank-pointer} to point
867d4bb3 19250to the latest element of the kill ring. The @code{kill-new}
8cda6f8f
GM
19251function is used directly or indirectly by @code{kill-append},
19252@code{copy-region-as-kill}, @code{kill-ring-save}, @code{kill-line},
19253and @code{kill-region}.)
19254
19255@menu
19256* Code for current-kill::
19257* Understanding current-kill::
19258@end menu
19259
19260@node Code for current-kill, Understanding current-kill, current-kill, current-kill
19261@ifnottex
19262@unnumberedsubsec The code for @code{current-kill}
19263@end ifnottex
19264
19265
19266@need 1500
19267The @code{current-kill} function is used by @code{yank} and by
19268@code{yank-pop}. Here is the code for @code{current-kill}:
19269
19270@smallexample
19271@group
19272(defun current-kill (n &optional do-not-move)
19273 "Rotate the yanking point by N places, and then return that kill.
19274If N is zero, `interprogram-paste-function' is set, and calling it
19275returns a string, then that string is added to the front of the
19276kill ring and returned as the latest kill.
19277@end group
19278@group
19279If optional arg DO-NOT-MOVE is non-nil, then don't actually move the
19280yanking point; just return the Nth kill forward."
19281 (let ((interprogram-paste (and (= n 0)
19282 interprogram-paste-function
19283 (funcall interprogram-paste-function))))
19284@end group
19285@group
19286 (if interprogram-paste
19287 (progn
19288 ;; Disable the interprogram cut function when we add the new
19289 ;; text to the kill ring, so Emacs doesn't try to own the
19290 ;; selection, with identical text.
19291 (let ((interprogram-cut-function nil))
19292 (kill-new interprogram-paste))
19293 interprogram-paste)
19294@end group
19295@group
19296 (or kill-ring (error "Kill ring is empty"))
19297 (let ((ARGth-kill-element
19298 (nthcdr (mod (- n (length kill-ring-yank-pointer))
19299 (length kill-ring))
19300 kill-ring)))
19301 (or do-not-move
19302 (setq kill-ring-yank-pointer ARGth-kill-element))
19303 (car ARGth-kill-element)))))
19304@end group
19305@end smallexample
19306
19307Remember also that the @code{kill-new} function sets
867d4bb3 19308@code{kill-ring-yank-pointer} to the latest element of the kill
8cda6f8f
GM
19309ring, which means that all the functions that call it set the value
19310indirectly: @code{kill-append}, @code{copy-region-as-kill},
19311@code{kill-ring-save}, @code{kill-line}, and @code{kill-region}.
19312
19313@need 1500
19314Here is the line in @code{kill-new}, which is explained in
19315@ref{kill-new function, , The @code{kill-new} function}.
19316
19317@smallexample
19318(setq kill-ring-yank-pointer kill-ring)
19319@end smallexample
19320
19321@node Understanding current-kill, , Code for current-kill, current-kill
19322@ifnottex
19323@unnumberedsubsec @code{current-kill} in Outline
19324@end ifnottex
19325
19326The @code{current-kill} function looks complex, but as usual, it can
19327be understood by taking it apart piece by piece. First look at it in
19328skeletal form:
19329
19330@smallexample
19331@group
19332(defun current-kill (n &optional do-not-move)
19333 "Rotate the yanking point by N places, and then return that kill."
19334 (let @var{varlist}
19335 @var{body}@dots{})
19336@end group
19337@end smallexample
19338
19339This function takes two arguments, one of which is optional. It has a
19340documentation string. It is @emph{not} interactive.
19341
19342@menu
19343* Body of current-kill::
19344* Digression concerning error:: How to mislead humans, but not computers.
19345* Determining the Element::
19346@end menu
19347
19348@node Body of current-kill, Digression concerning error, Understanding current-kill, Understanding current-kill
19349@ifnottex
19350@unnumberedsubsubsec The Body of @code{current-kill}
19351@end ifnottex
19352
19353The body of the function definition is a @code{let} expression, which
19354itself has a body as well as a @var{varlist}.
19355
19356The @code{let} expression declares a variable that will be only usable
19357within the bounds of this function. This variable is called
19358@code{interprogram-paste} and is for copying to another program. It
19359is not for copying within this instance of GNU Emacs. Most window
19360systems provide a facility for interprogram pasting. Sadly, that
19361facility usually provides only for the last element. Most windowing
19362systems have not adopted a ring of many possibilities, even though
19363Emacs has provided it for decades.
19364
19365The @code{if} expression has two parts, one if there exists
19366@code{interprogram-paste} and one if not.
19367
19368@need 2000
19369Let us consider the `if not' or else-part of the @code{current-kill}
867d4bb3 19370function. (The then-part uses the @code{kill-new} function, which
8cda6f8f
GM
19371we have already described. @xref{kill-new function, , The
19372@code{kill-new} function}.)
19373
19374@smallexample
19375@group
19376(or kill-ring (error "Kill ring is empty"))
19377(let ((ARGth-kill-element
19378 (nthcdr (mod (- n (length kill-ring-yank-pointer))
19379 (length kill-ring))
19380 kill-ring)))
19381 (or do-not-move
19382 (setq kill-ring-yank-pointer ARGth-kill-element))
19383 (car ARGth-kill-element))
19384@end group
19385@end smallexample
19386
19387@noindent
19388The code first checks whether the kill ring has content; otherwise it
19389signals an error.
19390
19391@need 1000
19392Note that the @code{or} expression is very similar to testing length
19393with an @code{if}:
19394
19395@findex zerop
19396@findex error
19397@smallexample
19398@group
19399(if (zerop (length kill-ring)) ; @r{if-part}
19400 (error "Kill ring is empty")) ; @r{then-part}
19401 ;; No else-part
19402@end group
19403@end smallexample
19404
19405@noindent
19406If there is not anything in the kill ring, its length must be zero and
19407an error message sent to the user: @samp{Kill ring is empty}. The
19408@code{current-kill} function uses an @code{or} expression which is
19409simpler. But an @code{if} expression reminds us what goes on.
19410
19411This @code{if} expression uses the function @code{zerop} which returns
19412true if the value it is testing is zero. When @code{zerop} tests
19413true, the then-part of the @code{if} is evaluated. The then-part is a
19414list starting with the function @code{error}, which is a function that
19415is similar to the @code{message} function
19416(@pxref{message, , The @code{message} Function}) in that
19417it prints a one-line message in the echo area. However, in addition
19418to printing a message, @code{error} also stops evaluation of the
19419function within which it is embedded. This means that the rest of the
19420function will not be evaluated if the length of the kill ring is zero.
19421
19422Then the @code{current-kill} function selects the element to return.
19423The selection depends on the number of places that @code{current-kill}
19424rotates and on where @code{kill-ring-yank-pointer} points.
19425
19426Next, either the optional @code{do-not-move} argument is true or the
19427current value of @code{kill-ring-yank-pointer} is set to point to the
19428list. Finally, another expression returns the first element of the
19429list even if the @code{do-not-move} argument is true.
19430
19431@node Digression concerning error, Determining the Element, Body of current-kill, Understanding current-kill
19432@ifnottex
19433@unnumberedsubsubsec Digression about the word `error'
19434@end ifnottex
19435
19436In my opinion, it is slightly misleading, at least to humans, to use
19437the term `error' as the name of the @code{error} function. A better
19438term would be `cancel'. Strictly speaking, of course, you cannot
19439point to, much less rotate a pointer to a list that has no length, so
19440from the point of view of the computer, the word `error' is correct.
19441But a human expects to attempt this sort of thing, if only to find out
19442whether the kill ring is full or empty. This is an act of
19443exploration.
19444
19445From the human point of view, the act of exploration and discovery is
19446not necessarily an error, and therefore should not be labelled as one,
19447even in the bowels of a computer. As it is, the code in Emacs implies
19448that a human who is acting virtuously, by exploring his or her
19449environment, is making an error. This is bad. Even though the computer
19450takes the same steps as it does when there is an `error', a term such as
19451`cancel' would have a clearer connotation.
19452
19453@node Determining the Element, , Digression concerning error, Understanding current-kill
19454@ifnottex
19455@unnumberedsubsubsec Determining the Element
19456@end ifnottex
19457
19458Among other actions, the else-part of the @code{if} expression sets
19459the value of @code{kill-ring-yank-pointer} to
19460@code{ARGth-kill-element} when the kill ring has something in it and
19461the value of @code{do-not-move} is @code{nil}.
19462
19463@need 800
19464The code looks like this:
19465
19466@smallexample
19467@group
19468(nthcdr (mod (- n (length kill-ring-yank-pointer))
19469 (length kill-ring))
19470 kill-ring)))
19471@end group
19472@end smallexample
19473
19474This needs some examination. Unless it is not supposed to move the
19475pointer, the @code{current-kill} function changes where
19476@code{kill-ring-yank-pointer} points.
19477That is what the
19478@w{@code{(setq kill-ring-yank-pointer ARGth-kill-element))}}
19479expression does. Also, clearly, @code{ARGth-kill-element} is being
19480set to be equal to some @sc{cdr} of the kill ring, using the
19481@code{nthcdr} function that is described in an earlier section.
19482(@xref{copy-region-as-kill}.) How does it do this?
19483
19484As we have seen before (@pxref{nthcdr}), the @code{nthcdr} function
19485works by repeatedly taking the @sc{cdr} of a list---it takes the
19486@sc{cdr} of the @sc{cdr} of the @sc{cdr} @dots{}
19487
19488@need 800
19489The two following expressions produce the same result:
19490
19491@smallexample
19492@group
19493(setq kill-ring-yank-pointer (cdr kill-ring))
19494
19495(setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
19496@end group
19497@end smallexample
19498
19499However, the @code{nthcdr} expression is more complicated. It uses
19500the @code{mod} function to determine which @sc{cdr} to select.
19501
19502(You will remember to look at inner functions first; indeed, we will
19503have to go inside the @code{mod}.)
19504
19505The @code{mod} function returns the value of its first argument modulo
19506the second; that is to say, it returns the remainder after dividing
19507the first argument by the second. The value returned has the same
19508sign as the second argument.
19509
19510@need 800
19511Thus,
19512
19513@smallexample
19514@group
19515(mod 12 4)
19516 @result{} 0 ;; @r{because there is no remainder}
19517(mod 13 4)
19518 @result{} 1
19519@end group
19520@end smallexample
19521
19522@need 1250
19523In this case, the first argument is often smaller than the second.
19524That is fine.
19525
19526@smallexample
19527@group
19528(mod 0 4)
19529 @result{} 0
19530(mod 1 4)
19531 @result{} 1
19532@end group
19533@end smallexample
19534
19535We can guess what the @code{-} function does. It is like @code{+} but
19536subtracts instead of adds; the @code{-} function subtracts its second
19537argument from its first. Also, we already know what the @code{length}
19538function does (@pxref{length}). It returns the length of a list.
19539
19540And @code{n} is the name of the required argument to the
19541@code{current-kill} function.
19542
19543@need 1250
19544So when the first argument to @code{nthcdr} is zero, the @code{nthcdr}
19545expression returns the whole list, as you can see by evaluating the
19546following:
19547
19548@smallexample
19549@group
19550;; kill-ring-yank-pointer @r{and} kill-ring @r{have a length of four}
19551;; @r{and} (mod (- 0 4) 4) @result{} 0
19552(nthcdr (mod (- 0 4) 4)
19553 '("fourth line of text"
19554 "third line"
19555 "second piece of text"
19556 "first some text"))
19557@end group
19558@end smallexample
19559
19560@need 1250
19561When the first argument to the @code{current-kill} function is one,
19562the @code{nthcdr} expression returns the list without its first
19563element.
19564
19565@smallexample
19566@group
19567(nthcdr (mod (- 1 4) 4)
19568 '("fourth line of text"
19569 "third line"
19570 "second piece of text"
19571 "first some text"))
19572@end group
19573@end smallexample
19574
19575@cindex @samp{global variable} defined
19576@cindex @samp{variable, global}, defined
19577Incidentally, both @code{kill-ring} and @code{kill-ring-yank-pointer}
19578are @dfn{global variables}. That means that any expression in Emacs
19579Lisp can access them. They are not like the local variables set by
19580@code{let} or like the symbols in an argument list.
19581Local variables can only be accessed
19582within the @code{let} that defines them or the function that specifies
19583them in an argument list (and within expressions called by them).
19584
19585@ignore
19586@c texi2dvi fails when the name of the section is within ifnottex ...
19587(@xref{Prevent confusion, , @code{let} Prevents Confusion}, and
19588@ref{defun, , The @code{defun} Special Form}.)
19589@end ignore
19590
19591@node yank, yank-pop, current-kill, Kill Ring
19592@comment node-name, next, previous, up
19593@appendixsec @code{yank}
19594@findex yank
19595
19596After learning about @code{current-kill}, the code for the
19597@code{yank} function is almost easy.
19598
19599The @code{yank} function does not use the
19600@code{kill-ring-yank-pointer} variable directly. It calls
19601@code{insert-for-yank} which calls @code{current-kill} which sets the
19602@code{kill-ring-yank-pointer} variable.
19603
19604@need 1250
19605The code looks like this:
19606
19607@c in GNU Emacs 22
19608@smallexample
19609@group
19610(defun yank (&optional arg)
19611 "Reinsert (\"paste\") the last stretch of killed text.
19612More precisely, reinsert the stretch of killed text most recently
19613killed OR yanked. Put point at end, and set mark at beginning.
19614With just \\[universal-argument] as argument, same but put point at
19615beginning (and mark at end). With argument N, reinsert the Nth most
19616recently killed stretch of killed text.
19617
19618When this command inserts killed text into the buffer, it honors
19619`yank-excluded-properties' and `yank-handler' as described in the
19620doc string for `insert-for-yank-1', which see.
19621
19622See also the command \\[yank-pop]."
19623@end group
19624@group
19625 (interactive "*P")
19626 (setq yank-window-start (window-start))
19627 ;; If we don't get all the way thru, make last-command indicate that
19628 ;; for the following command.
19629 (setq this-command t)
19630 (push-mark (point))
19631@end group
19632@group
19633 (insert-for-yank (current-kill (cond
19634 ((listp arg) 0)
19635 ((eq arg '-) -2)
19636 (t (1- arg)))))
19637 (if (consp arg)
19638 ;; This is like exchange-point-and-mark,
19639 ;; but doesn't activate the mark.
19640 ;; It is cleaner to avoid activation, even though the command
19641 ;; loop would deactivate the mark because we inserted text.
19642 (goto-char (prog1 (mark t)
19643 (set-marker (mark-marker) (point) (current-buffer)))))
19644@end group
19645@group
19646 ;; If we do get all the way thru, make this-command indicate that.
19647 (if (eq this-command t)
19648 (setq this-command 'yank))
19649 nil)
19650@end group
19651@end smallexample
19652
19653The key expression is @code{insert-for-yank}, which inserts the string
19654returned by @code{current-kill}, but removes some text properties from
19655it.
19656
19657However, before getting to that expression, the function sets the value
19658of @code{yank-window-start} to the position returned by the
19659@code{(window-start)} expression, the position at which the display
19660currently starts. The @code{yank} function also sets
19661@code{this-command} and pushes the mark.
19662
19663After it yanks the appropriate element, if the optional argument is a
19664@sc{cons} rather than a number or nothing, it puts point at beginning
19665of the yanked text and mark at its end.
19666
19667(The @code{prog1} function is like @code{progn} but returns the value
19668of its first argument rather than the value of its last argument. Its
19669first argument is forced to return the buffer's mark as an integer.
19670You can see the documentation for these functions by placing point
19671over them in this buffer and then typing @kbd{C-h f}
19672(@code{describe-function}) followed by a @kbd{RET}; the default is the
19673function.)
19674
19675The last part of the function tells what to do when it succeeds.
19676
19677@node yank-pop, ring file, yank, Kill Ring
19678@comment node-name, next, previous, up
19679@appendixsec @code{yank-pop}
19680@findex yank-pop
19681
19682After understanding @code{yank} and @code{current-kill}, you know how
19683to approach the @code{yank-pop} function. Leaving out the
19684documentation to save space, it looks like this:
19685
19686@c GNU Emacs 22
19687@smallexample
19688@group
19689(defun yank-pop (&optional arg)
19690 "@dots{}"
19691 (interactive "*p")
19692 (if (not (eq last-command 'yank))
19693 (error "Previous command was not a yank"))
19694@end group
19695@group
19696 (setq this-command 'yank)
19697 (unless arg (setq arg 1))
19698 (let ((inhibit-read-only t)
19699 (before (< (point) (mark t))))
19700@end group
19701@group
19702 (if before
19703 (funcall (or yank-undo-function 'delete-region) (point) (mark t))
19704 (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
19705 (setq yank-undo-function nil)
19706@end group
19707@group
19708 (set-marker (mark-marker) (point) (current-buffer))
19709 (insert-for-yank (current-kill arg))
19710 ;; Set the window start back where it was in the yank command,
19711 ;; if possible.
19712 (set-window-start (selected-window) yank-window-start t)
19713@end group
19714@group
19715 (if before
19716 ;; This is like exchange-point-and-mark,
19717 ;; but doesn't activate the mark.
19718 ;; It is cleaner to avoid activation, even though the command
19719 ;; loop would deactivate the mark because we inserted text.
19720 (goto-char (prog1 (mark t)
19721 (set-marker (mark-marker)
19722 (point)
19723 (current-buffer))))))
19724 nil)
19725@end group
19726@end smallexample
19727
19728The function is interactive with a small @samp{p} so the prefix
19729argument is processed and passed to the function. The command can
19730only be used after a previous yank; otherwise an error message is
19731sent. This check uses the variable @code{last-command} which is set
19732by @code{yank} and is discussed elsewhere.
19733(@xref{copy-region-as-kill}.)
19734
19735The @code{let} clause sets the variable @code{before} to true or false
19736depending whether point is before or after mark and then the region
19737between point and mark is deleted. This is the region that was just
19738inserted by the previous yank and it is this text that will be
19739replaced.
19740
19741@code{funcall} calls its first argument as a function, passing
19742remaining arguments to it. The first argument is whatever the
19743@code{or} expression returns. The two remaining arguments are the
19744positions of point and mark set by the preceding @code{yank} command.
19745
19746There is more, but that is the hardest part.
19747
19748@node ring file, , yank-pop, Kill Ring
19749@comment node-name, next, previous, up
19750@appendixsec The @file{ring.el} File
19751@cindex @file{ring.el} file
19752
19753Interestingly, GNU Emacs posses a file called @file{ring.el} that
19754provides many of the features we just discussed. But functions such
19755as @code{kill-ring-yank-pointer} do not use this library, possibly
19756because they were written earlier.
19757
19758@node Full Graph, Free Software and Free Manuals, Kill Ring, Top
19759@appendix A Graph with Labelled Axes
19760
19761Printed axes help you understand a graph. They convey scale. In an
19762earlier chapter (@pxref{Readying a Graph, , Readying a Graph}), we
19763wrote the code to print the body of a graph. Here we write the code
19764for printing and labelling vertical and horizontal axes, along with the
19765body itself.
19766
19767@menu
19768* Labelled Example::
19769* print-graph Varlist:: @code{let} expression in @code{print-graph}.
19770* print-Y-axis:: Print a label for the vertical axis.
19771* print-X-axis:: Print a horizontal label.
19772* Print Whole Graph:: The function to print a complete graph.
19773@end menu
19774
19775@node Labelled Example, print-graph Varlist, Full Graph, Full Graph
19776@ifnottex
19777@unnumberedsec Labelled Example Graph
19778@end ifnottex
19779
19780Since insertions fill a buffer to the right and below point, the new
19781graph printing function should first print the Y or vertical axis,
19782then the body of the graph, and finally the X or horizontal axis.
19783This sequence lays out for us the contents of the function:
19784
19785@enumerate
19786@item
19787Set up code.
19788
19789@item
19790Print Y axis.
19791
19792@item
19793Print body of graph.
19794
19795@item
19796Print X axis.
19797@end enumerate
19798
19799@need 800
19800Here is an example of how a finished graph should look:
19801
19802@smallexample
19803@group
19804 10 -
19805 *
19806 * *
19807 * **
19808 * ***
19809 5 - * *******
19810 * *** *******
19811 *************
19812 ***************
19813 1 - ****************
19814 | | | |
19815 1 5 10 15
19816@end group
19817@end smallexample
19818
19819@noindent
19820In this graph, both the vertical and the horizontal axes are labelled
19821with numbers. However, in some graphs, the horizontal axis is time
19822and would be better labelled with months, like this:
19823
19824@smallexample
19825@group
19826 5 - *
19827 * ** *
19828 *******
19829 ********** **
19830 1 - **************
19831 | ^ |
19832 Jan June Jan
19833@end group
19834@end smallexample
19835
19836Indeed, with a little thought, we can easily come up with a variety of
19837vertical and horizontal labelling schemes. Our task could become
19838complicated. But complications breed confusion. Rather than permit
19839this, it is better choose a simple labelling scheme for our first
19840effort, and to modify or replace it later.
19841
19842@need 1200
19843These considerations suggest the following outline for the
19844@code{print-graph} function:
19845
19846@smallexample
19847@group
19848(defun print-graph (numbers-list)
19849 "@var{documentation}@dots{}"
19850 (let ((height @dots{}
19851 @dots{}))
19852@end group
19853@group
19854 (print-Y-axis height @dots{} )
19855 (graph-body-print numbers-list)
19856 (print-X-axis @dots{} )))
19857@end group
19858@end smallexample
19859
19860We can work on each part of the @code{print-graph} function definition
19861in turn.
19862
19863@node print-graph Varlist, print-Y-axis, Labelled Example, Full Graph
19864@comment node-name, next, previous, up
19865@appendixsec The @code{print-graph} Varlist
19866@cindex @code{print-graph} varlist
19867
19868In writing the @code{print-graph} function, the first task is to write
19869the varlist in the @code{let} expression. (We will leave aside for the
19870moment any thoughts about making the function interactive or about the
19871contents of its documentation string.)
19872
19873The varlist should set several values. Clearly, the top of the label
19874for the vertical axis must be at least the height of the graph, which
19875means that we must obtain this information here. Note that the
19876@code{print-graph-body} function also requires this information. There
19877is no reason to calculate the height of the graph in two different
19878places, so we should change @code{print-graph-body} from the way we
19879defined it earlier to take advantage of the calculation.
19880
19881Similarly, both the function for printing the X axis labels and the
19882@code{print-graph-body} function need to learn the value of the width of
19883each symbol. We can perform the calculation here and change the
19884definition for @code{print-graph-body} from the way we defined it in the
19885previous chapter.
19886
19887The length of the label for the horizontal axis must be at least as long
19888as the graph. However, this information is used only in the function
19889that prints the horizontal axis, so it does not need to be calculated here.
19890
19891These thoughts lead us directly to the following form for the varlist
19892in the @code{let} for @code{print-graph}:
19893
19894@smallexample
19895@group
19896(let ((height (apply 'max numbers-list)) ; @r{First version.}
19897 (symbol-width (length graph-blank)))
19898@end group
19899@end smallexample
19900
19901@noindent
19902As we shall see, this expression is not quite right.
19903
19904@need 2000
19905@node print-Y-axis, print-X-axis, print-graph Varlist, Full Graph
19906@comment node-name, next, previous, up
19907@appendixsec The @code{print-Y-axis} Function
19908@cindex Axis, print vertical
19909@cindex Y axis printing
19910@cindex Vertical axis printing
19911@cindex Print vertical axis
19912
19913The job of the @code{print-Y-axis} function is to print a label for
19914the vertical axis that looks like this:
19915
19916@smallexample
19917@group
19918 10 -
19919
19920
19921
19922
19923 5 -
19924
19925
19926
19927 1 -
19928@end group
19929@end smallexample
19930
19931@noindent
19932The function should be passed the height of the graph, and then should
19933construct and insert the appropriate numbers and marks.
19934
19935@menu
19936* print-Y-axis in Detail::
19937* Height of label:: What height for the Y axis?
19938* Compute a Remainder:: How to compute the remainder of a division.
19939* Y Axis Element:: Construct a line for the Y axis.
19940* Y-axis-column:: Generate a list of Y axis labels.
19941* print-Y-axis Penultimate:: A not quite final version.
19942@end menu
19943
19944@node print-Y-axis in Detail, Height of label, print-Y-axis, print-Y-axis
19945@ifnottex
19946@unnumberedsubsec The @code{print-Y-axis} Function in Detail
19947@end ifnottex
19948
19949It is easy enough to see in the figure what the Y axis label should
19950look like; but to say in words, and then to write a function
19951definition to do the job is another matter. It is not quite true to
19952say that we want a number and a tic every five lines: there are only
19953three lines between the @samp{1} and the @samp{5} (lines 2, 3, and 4),
19954but four lines between the @samp{5} and the @samp{10} (lines 6, 7, 8,
19955and 9). It is better to say that we want a number and a tic mark on
19956the base line (number 1) and then that we want a number and a tic on
19957the fifth line from the bottom and on every line that is a multiple of
19958five.
19959
19960@node Height of label, Compute a Remainder, print-Y-axis in Detail, print-Y-axis
19961@ifnottex
19962@unnumberedsubsec What height should the label be?
19963@end ifnottex
19964
19965The next issue is what height the label should be? Suppose the maximum
19966height of tallest column of the graph is seven. Should the highest
19967label on the Y axis be @samp{5 -}, and should the graph stick up above
19968the label? Or should the highest label be @samp{7 -}, and mark the peak
19969of the graph? Or should the highest label be @code{10 -}, which is a
19970multiple of five, and be higher than the topmost value of the graph?
19971
19972The latter form is preferred. Most graphs are drawn within rectangles
19973whose sides are an integral number of steps long---5, 10, 15, and so
19974on for a step distance of five. But as soon as we decide to use a
19975step height for the vertical axis, we discover that the simple
19976expression in the varlist for computing the height is wrong. The
19977expression is @code{(apply 'max numbers-list)}. This returns the
19978precise height, not the maximum height plus whatever is necessary to
19979round up to the nearest multiple of five. A more complex expression
19980is required.
19981
19982As usual in cases like this, a complex problem becomes simpler if it is
19983divided into several smaller problems.
19984
19985First, consider the case when the highest value of the graph is an
19986integral multiple of five---when it is 5, 10, 15, or some higher
19987multiple of five. We can use this value as the Y axis height.
19988
19989A fairly simply way to determine whether a number is a multiple of
19990five is to divide it by five and see if the division results in a
19991remainder. If there is no remainder, the number is a multiple of
19992five. Thus, seven divided by five has a remainder of two, and seven
19993is not an integral multiple of five. Put in slightly different
19994language, more reminiscent of the classroom, five goes into seven
19995once, with a remainder of two. However, five goes into ten twice,
19996with no remainder: ten is an integral multiple of five.
19997
19998@node Compute a Remainder, Y Axis Element, Height of label, print-Y-axis
19999@appendixsubsec Side Trip: Compute a Remainder
20000
20001@findex % @r{(remainder function)}
20002@cindex Remainder function, @code{%}
20003In Lisp, the function for computing a remainder is @code{%}. The
20004function returns the remainder of its first argument divided by its
20005second argument. As it happens, @code{%} is a function in Emacs Lisp
20006that you cannot discover using @code{apropos}: you find nothing if you
20007type @kbd{M-x apropos @key{RET} remainder @key{RET}}. The only way to
20008learn of the existence of @code{%} is to read about it in a book such
20009as this or in the Emacs Lisp sources.
20010
20011You can try the @code{%} function by evaluating the following two
20012expressions:
20013
20014@smallexample
20015@group
20016(% 7 5)
20017
20018(% 10 5)
20019@end group
20020@end smallexample
20021
20022@noindent
20023The first expression returns 2 and the second expression returns 0.
20024
20025To test whether the returned value is zero or some other number, we
20026can use the @code{zerop} function. This function returns @code{t} if
20027its argument, which must be a number, is zero.
20028
20029@smallexample
20030@group
20031(zerop (% 7 5))
20032 @result{} nil
20033
20034(zerop (% 10 5))
20035 @result{} t
20036@end group
20037@end smallexample
20038
20039Thus, the following expression will return @code{t} if the height
20040of the graph is evenly divisible by five:
20041
20042@smallexample
20043(zerop (% height 5))
20044@end smallexample
20045
20046@noindent
20047(The value of @code{height}, of course, can be found from @code{(apply
20048'max numbers-list)}.)
20049
20050On the other hand, if the value of @code{height} is not a multiple of
20051five, we want to reset the value to the next higher multiple of five.
20052This is straightforward arithmetic using functions with which we are
20053already familiar. First, we divide the value of @code{height} by five
20054to determine how many times five goes into the number. Thus, five
20055goes into twelve twice. If we add one to this quotient and multiply by
20056five, we will obtain the value of the next multiple of five that is
20057larger than the height. Five goes into twelve twice. Add one to two,
20058and multiply by five; the result is fifteen, which is the next multiple
20059of five that is higher than twelve. The Lisp expression for this is:
20060
20061@smallexample
20062(* (1+ (/ height 5)) 5)
20063@end smallexample
20064
20065@noindent
20066For example, if you evaluate the following, the result is 15:
20067
20068@smallexample
20069(* (1+ (/ 12 5)) 5)
20070@end smallexample
20071
20072All through this discussion, we have been using `five' as the value
20073for spacing labels on the Y axis; but we may want to use some other
20074value. For generality, we should replace `five' with a variable to
20075which we can assign a value. The best name I can think of for this
20076variable is @code{Y-axis-label-spacing}.
20077
20078@need 1250
20079Using this term, and an @code{if} expression, we produce the
20080following:
20081
20082@smallexample
20083@group
20084(if (zerop (% height Y-axis-label-spacing))
20085 height
20086 ;; @r{else}
20087 (* (1+ (/ height Y-axis-label-spacing))
20088 Y-axis-label-spacing))
20089@end group
20090@end smallexample
20091
20092@noindent
20093This expression returns the value of @code{height} itself if the height
20094is an even multiple of the value of the @code{Y-axis-label-spacing} or
20095else it computes and returns a value of @code{height} that is equal to
20096the next higher multiple of the value of the @code{Y-axis-label-spacing}.
20097
20098We can now include this expression in the @code{let} expression of the
20099@code{print-graph} function (after first setting the value of
20100@code{Y-axis-label-spacing}):
20101@vindex Y-axis-label-spacing
20102
20103@smallexample
20104@group
20105(defvar Y-axis-label-spacing 5
20106 "Number of lines from one Y axis label to next.")
20107@end group
20108
20109@group
20110@dots{}
20111(let* ((height (apply 'max numbers-list))
20112 (height-of-top-line
20113 (if (zerop (% height Y-axis-label-spacing))
20114 height
20115@end group
20116@group
20117 ;; @r{else}
20118 (* (1+ (/ height Y-axis-label-spacing))
20119 Y-axis-label-spacing)))
20120 (symbol-width (length graph-blank))))
20121@dots{}
20122@end group
20123@end smallexample
20124
20125@noindent
20126(Note use of the @code{let*} function: the initial value of height is
20127computed once by the @code{(apply 'max numbers-list)} expression and
20128then the resulting value of @code{height} is used to compute its
20129final value. @xref{fwd-para let, , The @code{let*} expression}, for
20130more about @code{let*}.)
20131
20132@node Y Axis Element, Y-axis-column, Compute a Remainder, print-Y-axis
20133@appendixsubsec Construct a Y Axis Element
20134
20135When we print the vertical axis, we want to insert strings such as
20136@w{@samp{5 -}} and @w{@samp{10 - }} every five lines.
20137Moreover, we want the numbers and dashes to line up, so shorter
20138numbers must be padded with leading spaces. If some of the strings
20139use two digit numbers, the strings with single digit numbers must
20140include a leading blank space before the number.
20141
20142@findex number-to-string
20143To figure out the length of the number, the @code{length} function is
20144used. But the @code{length} function works only with a string, not with
20145a number. So the number has to be converted from being a number to
20146being a string. This is done with the @code{number-to-string} function.
20147For example,
20148
20149@smallexample
20150@group
20151(length (number-to-string 35))
20152 @result{} 2
20153
20154(length (number-to-string 100))
20155 @result{} 3
20156@end group
20157@end smallexample
20158
20159@noindent
20160(@code{number-to-string} is also called @code{int-to-string}; you will
20161see this alternative name in various sources.)
20162
20163In addition, in each label, each number is followed by a string such
20164as @w{@samp{ - }}, which we will call the @code{Y-axis-tic} marker.
20165This variable is defined with @code{defvar}:
20166
20167@vindex Y-axis-tic
20168@smallexample
20169@group
20170(defvar Y-axis-tic " - "
20171 "String that follows number in a Y axis label.")
20172@end group
20173@end smallexample
20174
20175The length of the Y label is the sum of the length of the Y axis tic
20176mark and the length of the number of the top of the graph.
20177
20178@smallexample
20179(length (concat (number-to-string height) Y-axis-tic)))
20180@end smallexample
20181
20182This value will be calculated by the @code{print-graph} function in
20183its varlist as @code{full-Y-label-width} and passed on. (Note that we
20184did not think to include this in the varlist when we first proposed it.)
20185
20186To make a complete vertical axis label, a tic mark is concatenated
20187with a number; and the two together may be preceded by one or more
20188spaces depending on how long the number is. The label consists of
20189three parts: the (optional) leading spaces, the number, and the tic
20190mark. The function is passed the value of the number for the specific
20191row, and the value of the width of the top line, which is calculated
20192(just once) by @code{print-graph}.
20193
20194@smallexample
20195@group
20196(defun Y-axis-element (number full-Y-label-width)
20197 "Construct a NUMBERed label element.
20198A numbered element looks like this ` 5 - ',
20199and is padded as needed so all line up with
20200the element for the largest number."
20201@end group
20202@group
20203 (let* ((leading-spaces
20204 (- full-Y-label-width
20205 (length
20206 (concat (number-to-string number)
20207 Y-axis-tic)))))
20208@end group
20209@group
20210 (concat
20211 (make-string leading-spaces ? )
20212 (number-to-string number)
20213 Y-axis-tic)))
20214@end group
20215@end smallexample
20216
20217The @code{Y-axis-element} function concatenates together the leading
20218spaces, if any; the number, as a string; and the tic mark.
20219
20220To figure out how many leading spaces the label will need, the
20221function subtracts the actual length of the label---the length of the
20222number plus the length of the tic mark---from the desired label width.
20223
20224@findex make-string
20225Blank spaces are inserted using the @code{make-string} function. This
20226function takes two arguments: the first tells it how long the string
20227will be and the second is a symbol for the character to insert, in a
20228special format. The format is a question mark followed by a blank
20229space, like this, @samp{? }. @xref{Character Type, , Character Type,
20230elisp, The GNU Emacs Lisp Reference Manual}, for a description of the
20231syntax for characters. (Of course, you might want to replace the
20232blank space by some other character @dots{} You know what to do.)
20233
20234The @code{number-to-string} function is used in the concatenation
20235expression, to convert the number to a string that is concatenated
20236with the leading spaces and the tic mark.
20237
20238@node Y-axis-column, print-Y-axis Penultimate, Y Axis Element, print-Y-axis
20239@appendixsubsec Create a Y Axis Column
20240
20241The preceding functions provide all the tools needed to construct a
20242function that generates a list of numbered and blank strings to insert
20243as the label for the vertical axis:
20244
20245@findex Y-axis-column
20246@smallexample
20247@group
20248(defun Y-axis-column (height width-of-label)
20249 "Construct list of Y axis labels and blank strings.
20250For HEIGHT of line above base and WIDTH-OF-LABEL."
20251 (let (Y-axis)
20252@group
20253@end group
20254 (while (> height 1)
20255 (if (zerop (% height Y-axis-label-spacing))
20256 ;; @r{Insert label.}
20257 (setq Y-axis
20258 (cons
20259 (Y-axis-element height width-of-label)
20260 Y-axis))
20261@group
20262@end group
20263 ;; @r{Else, insert blanks.}
20264 (setq Y-axis
20265 (cons
20266 (make-string width-of-label ? )
20267 Y-axis)))
20268 (setq height (1- height)))
20269 ;; @r{Insert base line.}
20270 (setq Y-axis
20271 (cons (Y-axis-element 1 width-of-label) Y-axis))
20272 (nreverse Y-axis)))
20273@end group
20274@end smallexample
20275
20276In this function, we start with the value of @code{height} and
20277repetitively subtract one from its value. After each subtraction, we
20278test to see whether the value is an integral multiple of the
20279@code{Y-axis-label-spacing}. If it is, we construct a numbered label
20280using the @code{Y-axis-element} function; if not, we construct a
20281blank label using the @code{make-string} function. The base line
20282consists of the number one followed by a tic mark.
20283
20284@need 2000
20285@node print-Y-axis Penultimate, , Y-axis-column, print-Y-axis
20286@appendixsubsec The Not Quite Final Version of @code{print-Y-axis}
20287
20288The list constructed by the @code{Y-axis-column} function is passed to
20289the @code{print-Y-axis} function, which inserts the list as a column.
20290
20291@findex print-Y-axis
20292@smallexample
20293@group
20294(defun print-Y-axis (height full-Y-label-width)
20295 "Insert Y axis using HEIGHT and FULL-Y-LABEL-WIDTH.
20296Height must be the maximum height of the graph.
20297Full width is the width of the highest label element."
20298;; Value of height and full-Y-label-width
20299;; are passed by `print-graph'.
20300@end group
20301@group
20302 (let ((start (point)))
20303 (insert-rectangle
20304 (Y-axis-column height full-Y-label-width))
20305 ;; @r{Place point ready for inserting graph.}
20306 (goto-char start)
20307 ;; @r{Move point forward by value of} full-Y-label-width
20308 (forward-char full-Y-label-width)))
20309@end group
20310@end smallexample
20311
20312The @code{print-Y-axis} uses the @code{insert-rectangle} function to
20313insert the Y axis labels created by the @code{Y-axis-column} function.
20314In addition, it places point at the correct position for printing the body of
20315the graph.
20316
20317You can test @code{print-Y-axis}:
20318
20319@enumerate
20320@item
20321Install
20322
20323@smallexample
20324@group
20325Y-axis-label-spacing
20326Y-axis-tic
20327Y-axis-element
20328Y-axis-column
20329print-Y-axis
20330@end group
20331@end smallexample
20332
20333@item
20334Copy the following expression:
20335
20336@smallexample
20337(print-Y-axis 12 5)
20338@end smallexample
20339
20340@item
20341Switch to the @file{*scratch*} buffer and place the cursor where you
20342want the axis labels to start.
20343
20344@item
20345Type @kbd{M-:} (@code{eval-expression}).
20346
20347@item
20348Yank the @code{graph-body-print} expression into the minibuffer
20349with @kbd{C-y} (@code{yank)}.
20350
20351@item
20352Press @key{RET} to evaluate the expression.
20353@end enumerate
20354
20355Emacs will print labels vertically, the top one being @w{@samp{10 -@w{
20356}}}. (The @code{print-graph} function will pass the value of
20357@code{height-of-top-line}, which in this case will end up as 15,
20358thereby getting rid of what might appear as a bug.)
20359
20360@need 2000
20361@node print-X-axis, Print Whole Graph, print-Y-axis, Full Graph
20362@appendixsec The @code{print-X-axis} Function
20363@cindex Axis, print horizontal
20364@cindex X axis printing
20365@cindex Print horizontal axis
20366@cindex Horizontal axis printing
20367
20368X axis labels are much like Y axis labels, except that the ticks are on a
20369line above the numbers. Labels should look like this:
20370
20371@smallexample
20372@group
20373 | | | |
20374 1 5 10 15
20375@end group
20376@end smallexample
20377
20378The first tic is under the first column of the graph and is preceded by
20379several blank spaces. These spaces provide room in rows above for the Y
20380axis labels. The second, third, fourth, and subsequent ticks are all
20381spaced equally, according to the value of @code{X-axis-label-spacing}.
20382
20383The second row of the X axis consists of numbers, preceded by several
20384blank spaces and also separated according to the value of the variable
20385@code{X-axis-label-spacing}.
20386
20387The value of the variable @code{X-axis-label-spacing} should itself be
20388measured in units of @code{symbol-width}, since you may want to change
20389the width of the symbols that you are using to print the body of the
20390graph without changing the ways the graph is labelled.
20391
20392@menu
20393* Similarities differences:: Much like @code{print-Y-axis}, but not exactly.
20394* X Axis Tic Marks:: Create tic marks for the horizontal axis.
20395@end menu
20396
20397@node Similarities differences, X Axis Tic Marks, print-X-axis, print-X-axis
20398@ifnottex
20399@unnumberedsubsec Similarities and differences
20400@end ifnottex
20401
20402The @code{print-X-axis} function is constructed in more or less the
20403same fashion as the @code{print-Y-axis} function except that it has
20404two lines: the line of tic marks and the numbers. We will write a
20405separate function to print each line and then combine them within the
20406@code{print-X-axis} function.
20407
20408This is a three step process:
20409
20410@enumerate
20411@item
20412Write a function to print the X axis tic marks, @code{print-X-axis-tic-line}.
20413
20414@item
20415Write a function to print the X numbers, @code{print-X-axis-numbered-line}.
20416
20417@item
20418Write a function to print both lines, the @code{print-X-axis} function,
20419using @code{print-X-axis-tic-line} and
20420@code{print-X-axis-numbered-line}.
20421@end enumerate
20422
20423@node X Axis Tic Marks, , Similarities differences, print-X-axis
20424@appendixsubsec X Axis Tic Marks
20425
20426The first function should print the X axis tic marks. We must specify
20427the tic marks themselves and their spacing:
20428
20429@smallexample
20430@group
20431(defvar X-axis-label-spacing
20432 (if (boundp 'graph-blank)
20433 (* 5 (length graph-blank)) 5)
20434 "Number of units from one X axis label to next.")
20435@end group
20436@end smallexample
20437
20438@noindent
20439(Note that the value of @code{graph-blank} is set by another
20440@code{defvar}. The @code{boundp} predicate checks whether it has
20441already been set; @code{boundp} returns @code{nil} if it has not. If
20442@code{graph-blank} were unbound and we did not use this conditional
20443construction, in a recent GNU Emacs, we would enter the debugger and
20444see an error message saying @samp{@w{Debugger entered--Lisp error:}
20445@w{(void-variable graph-blank)}}.)
20446
20447@need 1200
20448Here is the @code{defvar} for @code{X-axis-tic-symbol}:
20449
20450@smallexample
20451@group
20452(defvar X-axis-tic-symbol "|"
20453 "String to insert to point to a column in X axis.")
20454@end group
20455@end smallexample
20456
20457@need 1250
20458The goal is to make a line that looks like this:
20459
20460@smallexample
20461 | | | |
20462@end smallexample
20463
20464The first tic is indented so that it is under the first column, which is
20465indented to provide space for the Y axis labels.
20466
20467A tic element consists of the blank spaces that stretch from one tic to
20468the next plus a tic symbol. The number of blanks is determined by the
20469width of the tic symbol and the @code{X-axis-label-spacing}.
20470
20471@need 1250
20472The code looks like this:
20473
20474@smallexample
20475@group
20476;;; X-axis-tic-element
20477@dots{}
20478(concat
20479 (make-string
20480 ;; @r{Make a string of blanks.}
20481 (- (* symbol-width X-axis-label-spacing)
20482 (length X-axis-tic-symbol))
20483 ? )
20484 ;; @r{Concatenate blanks with tic symbol.}
20485 X-axis-tic-symbol)
20486@dots{}
20487@end group
20488@end smallexample
20489
20490Next, we determine how many blanks are needed to indent the first tic
20491mark to the first column of the graph. This uses the value of
20492@code{full-Y-label-width} passed it by the @code{print-graph} function.
20493
20494@need 1250
20495The code to make @code{X-axis-leading-spaces}
20496looks like this:
20497
20498@smallexample
20499@group
20500;; X-axis-leading-spaces
20501@dots{}
20502(make-string full-Y-label-width ? )
20503@dots{}
20504@end group
20505@end smallexample
20506
20507We also need to determine the length of the horizontal axis, which is
20508the length of the numbers list, and the number of ticks in the horizontal
20509axis:
20510
20511@smallexample
20512@group
20513;; X-length
20514@dots{}
20515(length numbers-list)
20516@end group
20517
20518@group
20519;; tic-width
20520@dots{}
20521(* symbol-width X-axis-label-spacing)
20522@end group
20523
20524@group
20525;; number-of-X-ticks
20526(if (zerop (% (X-length tic-width)))
20527 (/ (X-length tic-width))
20528 (1+ (/ (X-length tic-width))))
20529@end group
20530@end smallexample
20531
20532@need 1250
20533All this leads us directly to the function for printing the X axis tic line:
20534
20535@findex print-X-axis-tic-line
20536@smallexample
20537@group
20538(defun print-X-axis-tic-line
20539 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
20540 "Print ticks for X axis."
20541 (insert X-axis-leading-spaces)
20542 (insert X-axis-tic-symbol) ; @r{Under first column.}
20543@end group
20544@group
20545 ;; @r{Insert second tic in the right spot.}
20546 (insert (concat
20547 (make-string
20548 (- (* symbol-width X-axis-label-spacing)
20549 ;; @r{Insert white space up to second tic symbol.}
20550 (* 2 (length X-axis-tic-symbol)))
20551 ? )
20552 X-axis-tic-symbol))
20553@end group
20554@group
20555 ;; @r{Insert remaining ticks.}
20556 (while (> number-of-X-tics 1)
20557 (insert X-axis-tic-element)
20558 (setq number-of-X-tics (1- number-of-X-tics))))
20559@end group
20560@end smallexample
20561
20562The line of numbers is equally straightforward:
20563
20564@need 1250
20565First, we create a numbered element with blank spaces before each number:
20566
20567@findex X-axis-element
20568@smallexample
20569@group
20570(defun X-axis-element (number)
20571 "Construct a numbered X axis element."
20572 (let ((leading-spaces
20573 (- (* symbol-width X-axis-label-spacing)
20574 (length (number-to-string number)))))
20575 (concat (make-string leading-spaces ? )
20576 (number-to-string number))))
20577@end group
20578@end smallexample
20579
20580Next, we create the function to print the numbered line, starting with
20581the number ``1'' under the first column:
20582
20583@findex print-X-axis-numbered-line
20584@smallexample
20585@group
20586(defun print-X-axis-numbered-line
20587 (number-of-X-tics X-axis-leading-spaces)
20588 "Print line of X-axis numbers"
20589 (let ((number X-axis-label-spacing))
20590 (insert X-axis-leading-spaces)
20591 (insert "1")
20592@end group
20593@group
20594 (insert (concat
20595 (make-string
20596 ;; @r{Insert white space up to next number.}
20597 (- (* symbol-width X-axis-label-spacing) 2)
20598 ? )
20599 (number-to-string number)))
20600@end group
20601@group
20602 ;; @r{Insert remaining numbers.}
20603 (setq number (+ number X-axis-label-spacing))
20604 (while (> number-of-X-tics 1)
20605 (insert (X-axis-element number))
20606 (setq number (+ number X-axis-label-spacing))
20607 (setq number-of-X-tics (1- number-of-X-tics)))))
20608@end group
20609@end smallexample
20610
20611Finally, we need to write the @code{print-X-axis} that uses
20612@code{print-X-axis-tic-line} and
20613@code{print-X-axis-numbered-line}.
20614
20615The function must determine the local values of the variables used by both
20616@code{print-X-axis-tic-line} and @code{print-X-axis-numbered-line}, and
20617then it must call them. Also, it must print the carriage return that
20618separates the two lines.
20619
20620The function consists of a varlist that specifies five local variables,
20621and calls to each of the two line printing functions:
20622
20623@findex print-X-axis
20624@smallexample
20625@group
20626(defun print-X-axis (numbers-list)
20627 "Print X axis labels to length of NUMBERS-LIST."
20628 (let* ((leading-spaces
20629 (make-string full-Y-label-width ? ))
20630@end group
20631@group
20632 ;; symbol-width @r{is provided by} graph-body-print
20633 (tic-width (* symbol-width X-axis-label-spacing))
20634 (X-length (length numbers-list))
20635@end group
20636@group
20637 (X-tic
20638 (concat
20639 (make-string
20640@end group
20641@group
20642 ;; @r{Make a string of blanks.}
20643 (- (* symbol-width X-axis-label-spacing)
20644 (length X-axis-tic-symbol))
20645 ? )
20646@end group
20647@group
20648 ;; @r{Concatenate blanks with tic symbol.}
20649 X-axis-tic-symbol))
20650@end group
20651@group
20652 (tic-number
20653 (if (zerop (% X-length tic-width))
20654 (/ X-length tic-width)
20655 (1+ (/ X-length tic-width)))))
20656@end group
20657@group
20658 (print-X-axis-tic-line tic-number leading-spaces X-tic)
20659 (insert "\n")
20660 (print-X-axis-numbered-line tic-number leading-spaces)))
20661@end group
20662@end smallexample
20663
20664@need 1250
20665You can test @code{print-X-axis}:
20666
20667@enumerate
20668@item
20669Install @code{X-axis-tic-symbol}, @code{X-axis-label-spacing},
20670@code{print-X-axis-tic-line}, as well as @code{X-axis-element},
20671@code{print-X-axis-numbered-line}, and @code{print-X-axis}.
20672
20673@item
20674Copy the following expression:
20675
20676@smallexample
20677@group
20678(progn
20679 (let ((full-Y-label-width 5)
20680 (symbol-width 1))
20681 (print-X-axis
20682 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
20683@end group
20684@end smallexample
20685
20686@item
20687Switch to the @file{*scratch*} buffer and place the cursor where you
20688want the axis labels to start.
20689
20690@item
20691Type @kbd{M-:} (@code{eval-expression}).
20692
20693@item
20694Yank the test expression into the minibuffer
20695with @kbd{C-y} (@code{yank)}.
20696
20697@item
20698Press @key{RET} to evaluate the expression.
20699@end enumerate
20700
20701@need 1250
20702Emacs will print the horizontal axis like this:
20703@sp 1
20704
20705@smallexample
20706@group
20707 | | | | |
20708 1 5 10 15 20
20709@end group
20710@end smallexample
20711
20712@node Print Whole Graph, , print-X-axis, Full Graph
20713@appendixsec Printing the Whole Graph
20714@cindex Printing the whole graph
20715@cindex Whole graph printing
20716@cindex Graph, printing all
20717
20718Now we are nearly ready to print the whole graph.
20719
20720The function to print the graph with the proper labels follows the
20721outline we created earlier (@pxref{Full Graph, , A Graph with Labelled
20722Axes}), but with additions.
20723
20724@need 1250
20725Here is the outline:
20726
20727@smallexample
20728@group
20729(defun print-graph (numbers-list)
20730 "@var{documentation}@dots{}"
20731 (let ((height @dots{}
20732 @dots{}))
20733@end group
20734@group
20735 (print-Y-axis height @dots{} )
20736 (graph-body-print numbers-list)
20737 (print-X-axis @dots{} )))
20738@end group
20739@end smallexample
20740
20741@menu
20742* The final version:: A few changes.
20743* Test print-graph:: Run a short test.
20744* Graphing words in defuns:: Executing the final code.
20745* lambda:: How to write an anonymous function.
20746* mapcar:: Apply a function to elements of a list.
20747* Another Bug:: Yet another bug @dots{} most insidious.
20748* Final printed graph:: The graph itself!
20749@end menu
20750
20751@node The final version, Test print-graph, Print Whole Graph, Print Whole Graph
20752@ifnottex
20753@unnumberedsubsec Changes for the Final Version
20754@end ifnottex
20755
20756The final version is different from what we planned in two ways:
20757first, it contains additional values calculated once in the varlist;
20758second, it carries an option to specify the labels' increment per row.
20759This latter feature turns out to be essential; otherwise, a graph may
20760have more rows than fit on a display or on a sheet of paper.
20761
20762@need 1500
20763This new feature requires a change to the @code{Y-axis-column}
20764function, to add @code{vertical-step} to it. The function looks like
20765this:
20766
20767@findex Y-axis-column @r{Final version.}
20768@smallexample
20769@group
20770;;; @r{Final version.}
20771(defun Y-axis-column
20772 (height width-of-label &optional vertical-step)
20773 "Construct list of labels for Y axis.
20774HEIGHT is maximum height of graph.
20775WIDTH-OF-LABEL is maximum width of label.
20776VERTICAL-STEP, an option, is a positive integer
20777that specifies how much a Y axis label increments
20778for each line. For example, a step of 5 means
20779that each line is five units of the graph."
20780@end group
20781@group
20782 (let (Y-axis
20783 (number-per-line (or vertical-step 1)))
20784 (while (> height 1)
20785 (if (zerop (% height Y-axis-label-spacing))
20786@end group
20787@group
20788 ;; @r{Insert label.}
20789 (setq Y-axis
20790 (cons
20791 (Y-axis-element
20792 (* height number-per-line)
20793 width-of-label)
20794 Y-axis))
20795@end group
20796@group
20797 ;; @r{Else, insert blanks.}
20798 (setq Y-axis
20799 (cons
20800 (make-string width-of-label ? )
20801 Y-axis)))
20802 (setq height (1- height)))
20803@end group
20804@group
20805 ;; @r{Insert base line.}
20806 (setq Y-axis (cons (Y-axis-element
20807 (or vertical-step 1)
20808 width-of-label)
20809 Y-axis))
20810 (nreverse Y-axis)))
20811@end group
20812@end smallexample
20813
20814The values for the maximum height of graph and the width of a symbol
20815are computed by @code{print-graph} in its @code{let} expression; so
20816@code{graph-body-print} must be changed to accept them.
20817
20818@findex graph-body-print @r{Final version.}
20819@smallexample
20820@group
20821;;; @r{Final version.}
20822(defun graph-body-print (numbers-list height symbol-width)
20823 "Print a bar graph of the NUMBERS-LIST.
20824The numbers-list consists of the Y-axis values.
20825HEIGHT is maximum height of graph.
20826SYMBOL-WIDTH is number of each column."
20827@end group
20828@group
20829 (let (from-position)
20830 (while numbers-list
20831 (setq from-position (point))
20832 (insert-rectangle
20833 (column-of-graph height (car numbers-list)))
20834 (goto-char from-position)
20835 (forward-char symbol-width)
20836@end group
20837@group
20838 ;; @r{Draw graph column by column.}
20839 (sit-for 0)
20840 (setq numbers-list (cdr numbers-list)))
20841 ;; @r{Place point for X axis labels.}
20842 (forward-line height)
20843 (insert "\n")))
20844@end group
20845@end smallexample
20846
20847@need 1250
20848Finally, the code for the @code{print-graph} function:
20849
20850@findex print-graph @r{Final version.}
20851@smallexample
20852@group
20853;;; @r{Final version.}
20854(defun print-graph
20855 (numbers-list &optional vertical-step)
20856 "Print labelled bar graph of the NUMBERS-LIST.
20857The numbers-list consists of the Y-axis values.
20858@end group
20859
20860@group
20861Optionally, VERTICAL-STEP, a positive integer,
20862specifies how much a Y axis label increments for
20863each line. For example, a step of 5 means that
20864each row is five units."
20865@end group
20866@group
20867 (let* ((symbol-width (length graph-blank))
20868 ;; @code{height} @r{is both the largest number}
20869 ;; @r{and the number with the most digits.}
20870 (height (apply 'max numbers-list))
20871@end group
20872@group
20873 (height-of-top-line
20874 (if (zerop (% height Y-axis-label-spacing))
20875 height
20876 ;; @r{else}
20877 (* (1+ (/ height Y-axis-label-spacing))
20878 Y-axis-label-spacing)))
20879@end group
20880@group
20881 (vertical-step (or vertical-step 1))
20882 (full-Y-label-width
20883 (length
20884@end group
20885@group
20886 (concat
20887 (number-to-string
20888 (* height-of-top-line vertical-step))
20889 Y-axis-tic))))
20890@end group
20891
20892@group
20893 (print-Y-axis
20894 height-of-top-line full-Y-label-width vertical-step)
20895@end group
20896@group
20897 (graph-body-print
20898 numbers-list height-of-top-line symbol-width)
20899 (print-X-axis numbers-list)))
20900@end group
20901@end smallexample
20902
20903@node Test print-graph, Graphing words in defuns, The final version, Print Whole Graph
20904@appendixsubsec Testing @code{print-graph}
20905
20906@need 1250
20907We can test the @code{print-graph} function with a short list of numbers:
20908
20909@enumerate
20910@item
20911Install the final versions of @code{Y-axis-column},
20912@code{graph-body-print}, and @code{print-graph} (in addition to the
20913rest of the code.)
20914
20915@item
20916Copy the following expression:
20917
20918@smallexample
20919(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
20920@end smallexample
20921
20922@item
20923Switch to the @file{*scratch*} buffer and place the cursor where you
20924want the axis labels to start.
20925
20926@item
20927Type @kbd{M-:} (@code{eval-expression}).
20928
20929@item
20930Yank the test expression into the minibuffer
20931with @kbd{C-y} (@code{yank)}.
20932
20933@item
20934Press @key{RET} to evaluate the expression.
20935@end enumerate
20936
20937@need 1250
20938Emacs will print a graph that looks like this:
20939
20940@smallexample
20941@group
2094210 -
20943
20944
20945 *
20946 ** *
20947 5 - **** *
20948 **** ***
20949 * *********
20950 ************
20951 1 - *************
20952
20953 | | | |
20954 1 5 10 15
20955@end group
20956@end smallexample
20957
20958@need 1200
20959On the other hand, if you pass @code{print-graph} a
20960@code{vertical-step} value of 2, by evaluating this expression:
20961
20962@smallexample
20963(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
20964@end smallexample
20965
20966@need 1250
20967@noindent
20968The graph looks like this:
20969
20970@smallexample
20971@group
2097220 -
20973
20974
20975 *
20976 ** *
2097710 - **** *
20978 **** ***
20979 * *********
20980 ************
20981 2 - *************
20982
20983 | | | |
20984 1 5 10 15
20985@end group
20986@end smallexample
20987
20988@noindent
20989(A question: is the `2' on the bottom of the vertical axis a bug or a
20990feature? If you think it is a bug, and should be a `1' instead, (or
20991even a `0'), you can modify the sources.)
20992
20993@node Graphing words in defuns, lambda, Test print-graph, Print Whole Graph
20994@appendixsubsec Graphing Numbers of Words and Symbols
20995
20996Now for the graph for which all this code was written: a graph that
20997shows how many function definitions contain fewer than 10 words and
20998symbols, how many contain between 10 and 19 words and symbols, how
20999many contain between 20 and 29 words and symbols, and so on.
21000
21001This is a multi-step process. First make sure you have loaded all the
21002requisite code.
21003
21004@need 1500
21005It is a good idea to reset the value of @code{top-of-ranges} in case
21006you have set it to some different value. You can evaluate the
21007following:
21008
21009@smallexample
21010@group
21011(setq top-of-ranges
21012 '(10 20 30 40 50
21013 60 70 80 90 100
21014 110 120 130 140 150
21015 160 170 180 190 200
21016 210 220 230 240 250
21017 260 270 280 290 300)
21018@end group
21019@end smallexample
21020
21021@noindent
21022Next create a list of the number of words and symbols in each range.
21023
21024@need 1500
21025@noindent
21026Evaluate the following:
21027
21028@smallexample
21029@group
21030(setq list-for-graph
21031 (defuns-per-range
21032 (sort
21033 (recursive-lengths-list-many-files
21034 (directory-files "/usr/local/emacs/lisp"
21035 t ".+el$"))
21036 '<)
21037 top-of-ranges))
21038@end group
21039@end smallexample
21040
21041@noindent
21042On my old machine, this took about an hour. It looked though 303 Lisp
21043files in my copy of Emacs version 19.23. After all that computing,
21044the @code{list-for-graph} had this value:
21045
21046@smallexample
21047@group
21048(537 1027 955 785 594 483 349 292 224 199 166 120 116 99
2104990 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
21050@end group
21051@end smallexample
21052
21053@noindent
21054This means that my copy of Emacs had 537 function definitions with
21055fewer than 10 words or symbols in them, 1,027 function definitions
21056with 10 to 19 words or symbols in them, 955 function definitions with
2105720 to 29 words or symbols in them, and so on.
21058
21059Clearly, just by looking at this list we can see that most function
21060definitions contain ten to thirty words and symbols.
21061
21062Now for printing. We do @emph{not} want to print a graph that is
210631,030 lines high @dots{} Instead, we should print a graph that is
21064fewer than twenty-five lines high. A graph that height can be
21065displayed on almost any monitor, and easily printed on a sheet of paper.
21066
21067This means that each value in @code{list-for-graph} must be reduced to
21068one-fiftieth its present value.
21069
21070Here is a short function to do just that, using two functions we have
21071not yet seen, @code{mapcar} and @code{lambda}.
21072
21073@smallexample
21074@group
21075(defun one-fiftieth (full-range)
21076 "Return list, each number one-fiftieth of previous."
21077 (mapcar '(lambda (arg) (/ arg 50)) full-range))
21078@end group
21079@end smallexample
21080
21081@node lambda, mapcar, Graphing words in defuns, Print Whole Graph
21082@appendixsubsec A @code{lambda} Expression: Useful Anonymity
21083@cindex Anonymous function
21084@findex lambda
21085
21086@code{lambda} is the symbol for an anonymous function, a function
21087without a name. Every time you use an anonymous function, you need to
21088include its whole body.
21089
21090@need 1250
21091@noindent
21092Thus,
21093
21094@smallexample
21095(lambda (arg) (/ arg 50))
21096@end smallexample
21097
21098@noindent
21099is a function definition that says `return the value resulting from
21100dividing whatever is passed to me as @code{arg} by 50'.
21101
21102@need 1200
21103Earlier, for example, we had a function @code{multiply-by-seven}; it
21104multiplied its argument by 7. This function is similar, except it
21105divides its argument by 50; and, it has no name. The anonymous
21106equivalent of @code{multiply-by-seven} is:
21107
21108@smallexample
21109(lambda (number) (* 7 number))
21110@end smallexample
21111
21112@noindent
21113(@xref{defun, , The @code{defun} Special Form}.)
21114
21115@need 1250
21116@noindent
21117If we want to multiply 3 by 7, we can write:
21118
21119@c !!! Clear print-postscript-figures if the computer formatting this
21120@c document is too small and cannot handle all the diagrams and figures.
21121@c clear print-postscript-figures
21122@c set print-postscript-figures
21123@c lambda example diagram #1
21124@ifnottex
21125@smallexample
21126@group
21127(multiply-by-seven 3)
21128 \_______________/ ^
21129 | |
21130 function argument
21131@end group
21132@end smallexample
21133@end ifnottex
21134@ifset print-postscript-figures
21135@sp 1
21136@tex
21137@center @image{lambda-1}
21138%%%% old method of including an image
21139% \input /usr/local/lib/tex/inputs/psfig.tex
21140% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-1.eps}}
21141% \catcode`\@=0 %
21142@end tex
21143@sp 1
21144@end ifset
21145@ifclear print-postscript-figures
21146@iftex
21147@smallexample
21148@group
21149(multiply-by-seven 3)
21150 \_______________/ ^
21151 | |
21152 function argument
21153@end group
21154@end smallexample
21155@end iftex
21156@end ifclear
21157
21158@noindent
21159This expression returns 21.
21160
21161@need 1250
21162@noindent
21163Similarly, we can write:
21164
21165@c lambda example diagram #2
21166@ifnottex
21167@smallexample
21168@group
21169((lambda (number) (* 7 number)) 3)
21170 \____________________________/ ^
21171 | |
21172 anonymous function argument
21173@end group
21174@end smallexample
21175@end ifnottex
21176@ifset print-postscript-figures
21177@sp 1
21178@tex
21179@center @image{lambda-2}
21180%%%% old method of including an image
21181% \input /usr/local/lib/tex/inputs/psfig.tex
21182% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-2.eps}}
21183% \catcode`\@=0 %
21184@end tex
21185@sp 1
21186@end ifset
21187@ifclear print-postscript-figures
21188@iftex
21189@smallexample
21190@group
21191((lambda (number) (* 7 number)) 3)
21192 \____________________________/ ^
21193 | |
21194 anonymous function argument
21195@end group
21196@end smallexample
21197@end iftex
21198@end ifclear
21199
21200@need 1250
21201@noindent
21202If we want to divide 100 by 50, we can write:
21203
21204@c lambda example diagram #3
21205@ifnottex
21206@smallexample
21207@group
21208((lambda (arg) (/ arg 50)) 100)
21209 \______________________/ \_/
21210 | |
21211 anonymous function argument
21212@end group
21213@end smallexample
21214@end ifnottex
21215@ifset print-postscript-figures
21216@sp 1
21217@tex
21218@center @image{lambda-3}
21219%%%% old method of including an image
21220% \input /usr/local/lib/tex/inputs/psfig.tex
21221% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-3.eps}}
21222% \catcode`\@=0 %
21223@end tex
21224@sp 1
21225@end ifset
21226@ifclear print-postscript-figures
21227@iftex
21228@smallexample
21229@group
21230((lambda (arg) (/ arg 50)) 100)
21231 \______________________/ \_/
21232 | |
21233 anonymous function argument
21234@end group
21235@end smallexample
21236@end iftex
21237@end ifclear
21238
21239@noindent
21240This expression returns 2. The 100 is passed to the function, which
21241divides that number by 50.
21242
21243@xref{Lambda Expressions, , Lambda Expressions, elisp, The GNU Emacs
21244Lisp Reference Manual}, for more about @code{lambda}. Lisp and lambda
21245expressions derive from the Lambda Calculus.
21246
21247@node mapcar, Another Bug, lambda, Print Whole Graph
21248@appendixsubsec The @code{mapcar} Function
21249@findex mapcar
21250
21251@code{mapcar} is a function that calls its first argument with each
21252element of its second argument, in turn. The second argument must be
21253a sequence.
21254
21255The @samp{map} part of the name comes from the mathematical phrase,
21256`mapping over a domain', meaning to apply a function to each of the
21257elements in a domain. The mathematical phrase is based on the
21258metaphor of a surveyor walking, one step at a time, over an area he is
21259mapping. And @samp{car}, of course, comes from the Lisp notion of the
21260first of a list.
21261
21262@need 1250
21263@noindent
21264For example,
21265
21266@smallexample
21267@group
21268(mapcar '1+ '(2 4 6))
21269 @result{} (3 5 7)
21270@end group
21271@end smallexample
21272
21273@noindent
21274The function @code{1+} which adds one to its argument, is executed on
21275@emph{each} element of the list, and a new list is returned.
21276
21277Contrast this with @code{apply}, which applies its first argument to
21278all the remaining.
21279(@xref{Readying a Graph, , Readying a Graph}, for a explanation of
21280@code{apply}.)
21281
21282@need 1250
21283In the definition of @code{one-fiftieth}, the first argument is the
21284anonymous function:
21285
21286@smallexample
21287(lambda (arg) (/ arg 50))
21288@end smallexample
21289
21290@noindent
21291and the second argument is @code{full-range}, which will be bound to
21292@code{list-for-graph}.
21293
21294@need 1250
21295The whole expression looks like this:
21296
21297@smallexample
21298(mapcar '(lambda (arg) (/ arg 50)) full-range))
21299@end smallexample
21300
21301@xref{Mapping Functions, , Mapping Functions, elisp, The GNU Emacs
21302Lisp Reference Manual}, for more about @code{mapcar}.
21303
21304Using the @code{one-fiftieth} function, we can generate a list in
21305which each element is one-fiftieth the size of the corresponding
21306element in @code{list-for-graph}.
21307
21308@smallexample
21309@group
21310(setq fiftieth-list-for-graph
21311 (one-fiftieth list-for-graph))
21312@end group
21313@end smallexample
21314
21315@need 1250
21316The resulting list looks like this:
21317
21318@smallexample
21319@group
21320(10 20 19 15 11 9 6 5 4 3 3 2 2
213211 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
21322@end group
21323@end smallexample
21324
21325@noindent
21326This, we are almost ready to print! (We also notice the loss of
21327information: many of the higher ranges are 0, meaning that fewer than
2132850 defuns had that many words or symbols---but not necessarily meaning
21329that none had that many words or symbols.)
21330
21331@node Another Bug, Final printed graph, mapcar, Print Whole Graph
21332@appendixsubsec Another Bug @dots{} Most Insidious
21333@cindex Bug, most insidious type
21334@cindex Insidious type of bug
21335
21336I said `almost ready to print'! Of course, there is a bug in the
21337@code{print-graph} function @dots{} It has a @code{vertical-step}
21338option, but not a @code{horizontal-step} option. The
21339@code{top-of-range} scale goes from 10 to 300 by tens. But the
21340@code{print-graph} function will print only by ones.
21341
21342This is a classic example of what some consider the most insidious
21343type of bug, the bug of omission. This is not the kind of bug you can
21344find by studying the code, for it is not in the code; it is an omitted
21345feature. Your best actions are to try your program early and often;
21346and try to arrange, as much as you can, to write code that is easy to
21347understand and easy to change. Try to be aware, whenever you can,
21348that whatever you have written, @emph{will} be rewritten, if not soon,
21349eventually. A hard maxim to follow.
21350
21351It is the @code{print-X-axis-numbered-line} function that needs the
21352work; and then the @code{print-X-axis} and the @code{print-graph}
21353functions need to be adapted. Not much needs to be done; there is one
21354nicety: the numbers ought to line up under the tic marks. This takes
21355a little thought.
21356
21357@need 1250
21358Here is the corrected @code{print-X-axis-numbered-line}:
21359
21360@smallexample
21361@group
21362(defun print-X-axis-numbered-line
21363 (number-of-X-tics X-axis-leading-spaces
21364 &optional horizontal-step)
21365 "Print line of X-axis numbers"
21366 (let ((number X-axis-label-spacing)
21367 (horizontal-step (or horizontal-step 1)))
21368@end group
21369@group
21370 (insert X-axis-leading-spaces)
21371 ;; @r{Delete extra leading spaces.}
21372 (delete-char
21373 (- (1-
21374 (length (number-to-string horizontal-step)))))
21375 (insert (concat
21376 (make-string
21377@end group
21378@group
21379 ;; @r{Insert white space.}
21380 (- (* symbol-width
21381 X-axis-label-spacing)
21382 (1-
21383 (length
21384 (number-to-string horizontal-step)))
21385 2)
21386 ? )
21387 (number-to-string
21388 (* number horizontal-step))))
21389@end group
21390@group
21391 ;; @r{Insert remaining numbers.}
21392 (setq number (+ number X-axis-label-spacing))
21393 (while (> number-of-X-tics 1)
21394 (insert (X-axis-element
21395 (* number horizontal-step)))
21396 (setq number (+ number X-axis-label-spacing))
21397 (setq number-of-X-tics (1- number-of-X-tics)))))
21398@end group
21399@end smallexample
21400
21401@need 1500
21402If you are reading this in Info, you can see the new versions of
21403@code{print-X-axis} @code{print-graph} and evaluate them. If you are
21404reading this in a printed book, you can see the changed lines here
21405(the full text is too much to print).
21406
21407@iftex
21408@smallexample
21409@group
21410(defun print-X-axis (numbers-list horizontal-step)
21411 @dots{}
21412 (print-X-axis-numbered-line
21413 tic-number leading-spaces horizontal-step))
21414@end group
21415@end smallexample
21416
21417@smallexample
21418@group
21419(defun print-graph
21420 (numbers-list
21421 &optional vertical-step horizontal-step)
21422 @dots{}
21423 (print-X-axis numbers-list horizontal-step))
21424@end group
21425@end smallexample
21426@end iftex
21427
21428@ifnottex
21429@smallexample
21430@group
21431(defun print-X-axis (numbers-list horizontal-step)
21432 "Print X axis labels to length of NUMBERS-LIST.
21433Optionally, HORIZONTAL-STEP, a positive integer,
21434specifies how much an X axis label increments for
21435each column."
21436@end group
21437@group
21438;; Value of symbol-width and full-Y-label-width
21439;; are passed by `print-graph'.
21440 (let* ((leading-spaces
21441 (make-string full-Y-label-width ? ))
21442 ;; symbol-width @r{is provided by} graph-body-print
21443 (tic-width (* symbol-width X-axis-label-spacing))
21444 (X-length (length numbers-list))
21445@end group
21446@group
21447 (X-tic
21448 (concat
21449 (make-string
21450 ;; @r{Make a string of blanks.}
21451 (- (* symbol-width X-axis-label-spacing)
21452 (length X-axis-tic-symbol))
21453 ? )
21454@end group
21455@group
21456 ;; @r{Concatenate blanks with tic symbol.}
21457 X-axis-tic-symbol))
21458 (tic-number
21459 (if (zerop (% X-length tic-width))
21460 (/ X-length tic-width)
21461 (1+ (/ X-length tic-width)))))
21462@end group
21463
21464@group
21465 (print-X-axis-tic-line
21466 tic-number leading-spaces X-tic)
21467 (insert "\n")
21468 (print-X-axis-numbered-line
21469 tic-number leading-spaces horizontal-step)))
21470@end group
21471@end smallexample
21472
21473@smallexample
21474@group
21475(defun print-graph
21476 (numbers-list &optional vertical-step horizontal-step)
21477 "Print labelled bar graph of the NUMBERS-LIST.
21478The numbers-list consists of the Y-axis values.
21479@end group
21480
21481@group
21482Optionally, VERTICAL-STEP, a positive integer,
21483specifies how much a Y axis label increments for
21484each line. For example, a step of 5 means that
21485each row is five units.
21486@end group
21487
21488@group
21489Optionally, HORIZONTAL-STEP, a positive integer,
21490specifies how much an X axis label increments for
21491each column."
21492 (let* ((symbol-width (length graph-blank))
21493 ;; @code{height} @r{is both the largest number}
21494 ;; @r{and the number with the most digits.}
21495 (height (apply 'max numbers-list))
21496@end group
21497@group
21498 (height-of-top-line
21499 (if (zerop (% height Y-axis-label-spacing))
21500 height
21501 ;; @r{else}
21502 (* (1+ (/ height Y-axis-label-spacing))
21503 Y-axis-label-spacing)))
21504@end group
21505@group
21506 (vertical-step (or vertical-step 1))
21507 (full-Y-label-width
21508 (length
21509 (concat
21510 (number-to-string
21511 (* height-of-top-line vertical-step))
21512 Y-axis-tic))))
21513@end group
21514@group
21515 (print-Y-axis
21516 height-of-top-line full-Y-label-width vertical-step)
21517 (graph-body-print
21518 numbers-list height-of-top-line symbol-width)
21519 (print-X-axis numbers-list horizontal-step)))
21520@end group
21521@end smallexample
21522@end ifnottex
21523
21524@c qqq
21525@ignore
21526Graphing Definitions Re-listed
21527
21528@need 1250
21529Here are all the graphing definitions in their final form:
21530
21531@smallexample
21532@group
21533(defvar top-of-ranges
21534 '(10 20 30 40 50
21535 60 70 80 90 100
21536 110 120 130 140 150
21537 160 170 180 190 200
21538 210 220 230 240 250)
21539 "List specifying ranges for `defuns-per-range'.")
21540@end group
21541
21542@group
21543(defvar graph-symbol "*"
21544 "String used as symbol in graph, usually an asterisk.")
21545@end group
21546
21547@group
21548(defvar graph-blank " "
21549 "String used as blank in graph, usually a blank space.
21550graph-blank must be the same number of columns wide
21551as graph-symbol.")
21552@end group
21553
21554@group
21555(defvar Y-axis-tic " - "
21556 "String that follows number in a Y axis label.")
21557@end group
21558
21559@group
21560(defvar Y-axis-label-spacing 5
21561 "Number of lines from one Y axis label to next.")
21562@end group
21563
21564@group
21565(defvar X-axis-tic-symbol "|"
21566 "String to insert to point to a column in X axis.")
21567@end group
21568
21569@group
21570(defvar X-axis-label-spacing
21571 (if (boundp 'graph-blank)
21572 (* 5 (length graph-blank)) 5)
21573 "Number of units from one X axis label to next.")
21574@end group
21575@end smallexample
21576
21577@smallexample
21578@group
21579(defun count-words-in-defun ()
21580 "Return the number of words and symbols in a defun."
21581 (beginning-of-defun)
21582 (let ((count 0)
21583 (end (save-excursion (end-of-defun) (point))))
21584@end group
21585
21586@group
21587 (while
21588 (and (< (point) end)
21589 (re-search-forward
21590 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
21591 end t))
21592 (setq count (1+ count)))
21593 count))
21594@end group
21595@end smallexample
21596
21597@smallexample
21598@group
21599(defun lengths-list-file (filename)
21600 "Return list of definitions' lengths within FILE.
21601The returned list is a list of numbers.
21602Each number is the number of words or
21603symbols in one function definition."
21604@end group
21605
21606@group
21607 (message "Working on `%s' ... " filename)
21608 (save-excursion
21609 (let ((buffer (find-file-noselect filename))
21610 (lengths-list))
21611 (set-buffer buffer)
21612 (setq buffer-read-only t)
21613 (widen)
21614 (goto-char (point-min))
21615@end group
21616
21617@group
21618 (while (re-search-forward "^(defun" nil t)
21619 (setq lengths-list
21620 (cons (count-words-in-defun) lengths-list)))
21621 (kill-buffer buffer)
21622 lengths-list)))
21623@end group
21624@end smallexample
21625
21626@smallexample
21627@group
21628(defun lengths-list-many-files (list-of-files)
21629 "Return list of lengths of defuns in LIST-OF-FILES."
21630 (let (lengths-list)
21631;;; @r{true-or-false-test}
21632 (while list-of-files
21633 (setq lengths-list
21634 (append
21635 lengths-list
21636@end group
21637@group
21638;;; @r{Generate a lengths' list.}
21639 (lengths-list-file
21640 (expand-file-name (car list-of-files)))))
21641;;; @r{Make files' list shorter.}
21642 (setq list-of-files (cdr list-of-files)))
21643;;; @r{Return final value of lengths' list.}
21644 lengths-list))
21645@end group
21646@end smallexample
21647
21648@smallexample
21649@group
21650(defun defuns-per-range (sorted-lengths top-of-ranges)
21651 "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
21652 (let ((top-of-range (car top-of-ranges))
21653 (number-within-range 0)
21654 defuns-per-range-list)
21655@end group
21656
21657@group
21658 ;; @r{Outer loop.}
21659 (while top-of-ranges
21660
21661 ;; @r{Inner loop.}
21662 (while (and
21663 ;; @r{Need number for numeric test.}
21664 (car sorted-lengths)
21665 (< (car sorted-lengths) top-of-range))
21666
21667 ;; @r{Count number of definitions within current range.}
21668 (setq number-within-range (1+ number-within-range))
21669 (setq sorted-lengths (cdr sorted-lengths)))
21670@end group
21671
21672@group
21673 ;; @r{Exit inner loop but remain within outer loop.}
21674
21675 (setq defuns-per-range-list
21676 (cons number-within-range defuns-per-range-list))
21677 (setq number-within-range 0) ; @r{Reset count to zero.}
21678
21679 ;; @r{Move to next range.}
21680 (setq top-of-ranges (cdr top-of-ranges))
21681 ;; @r{Specify next top of range value.}
21682 (setq top-of-range (car top-of-ranges)))
21683@end group
21684
21685@group
21686 ;; @r{Exit outer loop and count the number of defuns larger than}
21687 ;; @r{ the largest top-of-range value.}
21688 (setq defuns-per-range-list
21689 (cons
21690 (length sorted-lengths)
21691 defuns-per-range-list))
21692
21693 ;; @r{Return a list of the number of definitions within each range,}
21694 ;; @r{ smallest to largest.}
21695 (nreverse defuns-per-range-list)))
21696@end group
21697@end smallexample
21698
21699@smallexample
21700@group
21701(defun column-of-graph (max-graph-height actual-height)
21702 "Return list of MAX-GRAPH-HEIGHT strings;
21703ACTUAL-HEIGHT are graph-symbols.
21704The graph-symbols are contiguous entries at the end
21705of the list.
21706The list will be inserted as one column of a graph.
21707The strings are either graph-blank or graph-symbol."
21708@end group
21709
21710@group
21711 (let ((insert-list nil)
21712 (number-of-top-blanks
21713 (- max-graph-height actual-height)))
21714
21715 ;; @r{Fill in @code{graph-symbols}.}
21716 (while (> actual-height 0)
21717 (setq insert-list (cons graph-symbol insert-list))
21718 (setq actual-height (1- actual-height)))
21719@end group
21720
21721@group
21722 ;; @r{Fill in @code{graph-blanks}.}
21723 (while (> number-of-top-blanks 0)
21724 (setq insert-list (cons graph-blank insert-list))
21725 (setq number-of-top-blanks
21726 (1- number-of-top-blanks)))
21727
21728 ;; @r{Return whole list.}
21729 insert-list))
21730@end group
21731@end smallexample
21732
21733@smallexample
21734@group
21735(defun Y-axis-element (number full-Y-label-width)
21736 "Construct a NUMBERed label element.
21737A numbered element looks like this ` 5 - ',
21738and is padded as needed so all line up with
21739the element for the largest number."
21740@end group
21741@group
21742 (let* ((leading-spaces
21743 (- full-Y-label-width
21744 (length
21745 (concat (number-to-string number)
21746 Y-axis-tic)))))
21747@end group
21748@group
21749 (concat
21750 (make-string leading-spaces ? )
21751 (number-to-string number)
21752 Y-axis-tic)))
21753@end group
21754@end smallexample
21755
21756@smallexample
21757@group
21758(defun print-Y-axis
21759 (height full-Y-label-width &optional vertical-step)
21760 "Insert Y axis by HEIGHT and FULL-Y-LABEL-WIDTH.
21761Height must be the maximum height of the graph.
21762Full width is the width of the highest label element.
21763Optionally, print according to VERTICAL-STEP."
21764@end group
21765@group
21766;; Value of height and full-Y-label-width
21767;; are passed by `print-graph'.
21768 (let ((start (point)))
21769 (insert-rectangle
21770 (Y-axis-column height full-Y-label-width vertical-step))
21771@end group
21772@group
21773 ;; @r{Place point ready for inserting graph.}
21774 (goto-char start)
21775 ;; @r{Move point forward by value of} full-Y-label-width
21776 (forward-char full-Y-label-width)))
21777@end group
21778@end smallexample
21779
21780@smallexample
21781@group
21782(defun print-X-axis-tic-line
21783 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
21784 "Print ticks for X axis."
21785 (insert X-axis-leading-spaces)
21786 (insert X-axis-tic-symbol) ; @r{Under first column.}
21787@end group
21788@group
21789 ;; @r{Insert second tic in the right spot.}
21790 (insert (concat
21791 (make-string
21792 (- (* symbol-width X-axis-label-spacing)
21793 ;; @r{Insert white space up to second tic symbol.}
21794 (* 2 (length X-axis-tic-symbol)))
21795 ? )
21796 X-axis-tic-symbol))
21797@end group
21798@group
21799 ;; @r{Insert remaining ticks.}
21800 (while (> number-of-X-tics 1)
21801 (insert X-axis-tic-element)
21802 (setq number-of-X-tics (1- number-of-X-tics))))
21803@end group
21804@end smallexample
21805
21806@smallexample
21807@group
21808(defun X-axis-element (number)
21809 "Construct a numbered X axis element."
21810 (let ((leading-spaces
21811 (- (* symbol-width X-axis-label-spacing)
21812 (length (number-to-string number)))))
21813 (concat (make-string leading-spaces ? )
21814 (number-to-string number))))
21815@end group
21816@end smallexample
21817
21818@smallexample
21819@group
21820(defun graph-body-print (numbers-list height symbol-width)
21821 "Print a bar graph of the NUMBERS-LIST.
21822The numbers-list consists of the Y-axis values.
21823HEIGHT is maximum height of graph.
21824SYMBOL-WIDTH is number of each column."
21825@end group
21826@group
21827 (let (from-position)
21828 (while numbers-list
21829 (setq from-position (point))
21830 (insert-rectangle
21831 (column-of-graph height (car numbers-list)))
21832 (goto-char from-position)
21833 (forward-char symbol-width)
21834@end group
21835@group
21836 ;; @r{Draw graph column by column.}
21837 (sit-for 0)
21838 (setq numbers-list (cdr numbers-list)))
21839 ;; @r{Place point for X axis labels.}
21840 (forward-line height)
21841 (insert "\n")))
21842@end group
21843@end smallexample
21844
21845@smallexample
21846@group
21847(defun Y-axis-column
21848 (height width-of-label &optional vertical-step)
21849 "Construct list of labels for Y axis.
21850HEIGHT is maximum height of graph.
21851WIDTH-OF-LABEL is maximum width of label.
21852@end group
21853@group
21854VERTICAL-STEP, an option, is a positive integer
21855that specifies how much a Y axis label increments
21856for each line. For example, a step of 5 means
21857that each line is five units of the graph."
21858 (let (Y-axis
21859 (number-per-line (or vertical-step 1)))
21860@end group
21861@group
21862 (while (> height 1)
21863 (if (zerop (% height Y-axis-label-spacing))
21864 ;; @r{Insert label.}
21865 (setq Y-axis
21866 (cons
21867 (Y-axis-element
21868 (* height number-per-line)
21869 width-of-label)
21870 Y-axis))
21871@end group
21872@group
21873 ;; @r{Else, insert blanks.}
21874 (setq Y-axis
21875 (cons
21876 (make-string width-of-label ? )
21877 Y-axis)))
21878 (setq height (1- height)))
21879@end group
21880@group
21881 ;; @r{Insert base line.}
21882 (setq Y-axis (cons (Y-axis-element
21883 (or vertical-step 1)
21884 width-of-label)
21885 Y-axis))
21886 (nreverse Y-axis)))
21887@end group
21888@end smallexample
21889
21890@smallexample
21891@group
21892(defun print-X-axis-numbered-line
21893 (number-of-X-tics X-axis-leading-spaces
21894 &optional horizontal-step)
21895 "Print line of X-axis numbers"
21896 (let ((number X-axis-label-spacing)
21897 (horizontal-step (or horizontal-step 1)))
21898@end group
21899@group
21900 (insert X-axis-leading-spaces)
21901 ;; line up number
21902 (delete-char (- (1- (length (number-to-string horizontal-step)))))
21903 (insert (concat
21904 (make-string
21905 ;; @r{Insert white space up to next number.}
21906 (- (* symbol-width X-axis-label-spacing)
21907 (1- (length (number-to-string horizontal-step)))
21908 2)
21909 ? )
21910 (number-to-string (* number horizontal-step))))
21911@end group
21912@group
21913 ;; @r{Insert remaining numbers.}
21914 (setq number (+ number X-axis-label-spacing))
21915 (while (> number-of-X-tics 1)
21916 (insert (X-axis-element (* number horizontal-step)))
21917 (setq number (+ number X-axis-label-spacing))
21918 (setq number-of-X-tics (1- number-of-X-tics)))))
21919@end group
21920@end smallexample
21921
21922@smallexample
21923@group
21924(defun print-X-axis (numbers-list horizontal-step)
21925 "Print X axis labels to length of NUMBERS-LIST.
21926Optionally, HORIZONTAL-STEP, a positive integer,
21927specifies how much an X axis label increments for
21928each column."
21929@end group
21930@group
21931;; Value of symbol-width and full-Y-label-width
21932;; are passed by `print-graph'.
21933 (let* ((leading-spaces
21934 (make-string full-Y-label-width ? ))
21935 ;; symbol-width @r{is provided by} graph-body-print
21936 (tic-width (* symbol-width X-axis-label-spacing))
21937 (X-length (length numbers-list))
21938@end group
21939@group
21940 (X-tic
21941 (concat
21942 (make-string
21943 ;; @r{Make a string of blanks.}
21944 (- (* symbol-width X-axis-label-spacing)
21945 (length X-axis-tic-symbol))
21946 ? )
21947@end group
21948@group
21949 ;; @r{Concatenate blanks with tic symbol.}
21950 X-axis-tic-symbol))
21951 (tic-number
21952 (if (zerop (% X-length tic-width))
21953 (/ X-length tic-width)
21954 (1+ (/ X-length tic-width)))))
21955@end group
21956
21957@group
21958 (print-X-axis-tic-line
21959 tic-number leading-spaces X-tic)
21960 (insert "\n")
21961 (print-X-axis-numbered-line
21962 tic-number leading-spaces horizontal-step)))
21963@end group
21964@end smallexample
21965
21966@smallexample
21967@group
21968(defun one-fiftieth (full-range)
21969 "Return list, each number of which is 1/50th previous."
21970 (mapcar '(lambda (arg) (/ arg 50)) full-range))
21971@end group
21972@end smallexample
21973
21974@smallexample
21975@group
21976(defun print-graph
21977 (numbers-list &optional vertical-step horizontal-step)
21978 "Print labelled bar graph of the NUMBERS-LIST.
21979The numbers-list consists of the Y-axis values.
21980@end group
21981
21982@group
21983Optionally, VERTICAL-STEP, a positive integer,
21984specifies how much a Y axis label increments for
21985each line. For example, a step of 5 means that
21986each row is five units.
21987@end group
21988
21989@group
21990Optionally, HORIZONTAL-STEP, a positive integer,
21991specifies how much an X axis label increments for
21992each column."
21993 (let* ((symbol-width (length graph-blank))
21994 ;; @code{height} @r{is both the largest number}
21995 ;; @r{and the number with the most digits.}
21996 (height (apply 'max numbers-list))
21997@end group
21998@group
21999 (height-of-top-line
22000 (if (zerop (% height Y-axis-label-spacing))
22001 height
22002 ;; @r{else}
22003 (* (1+ (/ height Y-axis-label-spacing))
22004 Y-axis-label-spacing)))
22005@end group
22006@group
22007 (vertical-step (or vertical-step 1))
22008 (full-Y-label-width
22009 (length
22010 (concat
22011 (number-to-string
22012 (* height-of-top-line vertical-step))
22013 Y-axis-tic))))
22014@end group
22015@group
22016
22017 (print-Y-axis
22018 height-of-top-line full-Y-label-width vertical-step)
22019 (graph-body-print
22020 numbers-list height-of-top-line symbol-width)
22021 (print-X-axis numbers-list horizontal-step)))
22022@end group
22023@end smallexample
22024@c qqq
22025@end ignore
22026
22027@page
22028@node Final printed graph, , Another Bug, Print Whole Graph
22029@appendixsubsec The Printed Graph
22030
22031When made and installed, you can call the @code{print-graph} command
22032like this:
22033@sp 1
22034
22035@smallexample
22036@group
22037(print-graph fiftieth-list-for-graph 50 10)
22038@end group
22039@end smallexample
22040@sp 1
22041
22042@noindent
22043Here is the graph:
22044@sp 2
22045
22046@smallexample
22047@group
220481000 - *
22049 **
22050 **
22051 **
22052 **
22053 750 - ***
22054 ***
22055 ***
22056 ***
22057 ****
22058 500 - *****
22059 ******
22060 ******
22061 ******
22062 *******
22063 250 - ********
22064 ********* *
22065 *********** *
22066 ************* *
22067 50 - ***************** * *
22068 | | | | | | | |
22069 10 50 100 150 200 250 300 350
22070@end group
22071@end smallexample
22072
22073@sp 2
22074
22075@noindent
22076The largest group of functions contain 10 -- 19 words and symbols each.
22077
22078@node Free Software and Free Manuals, GNU Free Documentation License, Full Graph, Top
22079@appendix Free Software and Free Manuals
22080
22081@strong{by Richard M. Stallman}
22082@sp 1
22083
22084The biggest deficiency in free operating systems is not in the
22085software---it is the lack of good free manuals that we can include in
22086these systems. Many of our most important programs do not come with
22087full manuals. Documentation is an essential part of any software
22088package; when an important free software package does not come with a
22089free manual, that is a major gap. We have many such gaps today.
22090
22091Once upon a time, many years ago, I thought I would learn Perl. I got
22092a copy of a free manual, but I found it hard to read. When I asked
22093Perl users about alternatives, they told me that there were better
22094introductory manuals---but those were not free.
22095
22096Why was this? The authors of the good manuals had written them for
22097O'Reilly Associates, which published them with restrictive terms---no
22098copying, no modification, source files not available---which exclude
22099them from the free software community.
22100
22101That wasn't the first time this sort of thing has happened, and (to
22102our community's great loss) it was far from the last. Proprietary
22103manual publishers have enticed a great many authors to restrict their
22104manuals since then. Many times I have heard a GNU user eagerly tell me
22105about a manual that he is writing, with which he expects to help the
22106GNU project---and then had my hopes dashed, as he proceeded to explain
22107that he had signed a contract with a publisher that would restrict it
22108so that we cannot use it.
22109
22110Given that writing good English is a rare skill among programmers, we
22111can ill afford to lose manuals this way.
22112
8cda6f8f
GM
22113Free documentation, like free software, is a matter of freedom, not
22114price. The problem with these manuals was not that O'Reilly Associates
31b62755
GM
22115charged a price for printed copies---that in itself is fine. The Free
22116Software Foundation @uref{http://shop.fsf.org, sells printed copies} of
22117free @uref{http://www.gnu.org/doc/doc.html, GNU manuals}, too.
8cda6f8f
GM
22118But GNU manuals are available in source code form, while these manuals
22119are available only on paper. GNU manuals come with permission to copy
22120and modify; the Perl manuals do not. These restrictions are the
22121problems.
22122
22123The criterion for a free manual is pretty much the same as for free
22124software: it is a matter of giving all users certain
22125freedoms. Redistribution (including commercial redistribution) must be
22126permitted, so that the manual can accompany every copy of the program,
22127on-line or on paper. Permission for modification is crucial too.
22128
22129As a general rule, I don't believe that it is essential for people to
22130have permission to modify all sorts of articles and books. The issues
22131for writings are not necessarily the same as those for software. For
22132example, I don't think you or I are obliged to give permission to
22133modify articles like this one, which describe our actions and our
22134views.
22135
22136But there is a particular reason why the freedom to modify is crucial
22137for documentation for free software. When people exercise their right
22138to modify the software, and add or change its features, if they are
22139conscientious they will change the manual too---so they can provide
22140accurate and usable documentation with the modified program. A manual
22141which forbids programmers to be conscientious and finish the job, or
22142more precisely requires them to write a new manual from scratch if
22143they change the program, does not fill our community's needs.
22144
22145While a blanket prohibition on modification is unacceptable, some
22146kinds of limits on the method of modification pose no problem. For
22147example, requirements to preserve the original author's copyright
22148notice, the distribution terms, or the list of authors, are ok. It is
22149also no problem to require modified versions to include notice that
22150they were modified, even to have entire sections that may not be
22151deleted or changed, as long as these sections deal with nontechnical
22152topics. (Some GNU manuals have them.)
22153
22154These kinds of restrictions are not a problem because, as a practical
22155matter, they don't stop the conscientious programmer from adapting the
22156manual to fit the modified program. In other words, they don't block
22157the free software community from making full use of the manual.
22158
22159However, it must be possible to modify all the technical content of
22160the manual, and then distribute the result in all the usual media,
22161through all the usual channels; otherwise, the restrictions do block
22162the community, the manual is not free, and so we need another manual.
22163
22164Unfortunately, it is often hard to find someone to write another
22165manual when a proprietary manual exists. The obstacle is that many
22166users think that a proprietary manual is good enough---so they don't
22167see the need to write a free manual. They do not see that the free
22168operating system has a gap that needs filling.
22169
22170Why do users think that proprietary manuals are good enough? Some have
22171not considered the issue. I hope this article will do something to
22172change that.
22173
22174Other users consider proprietary manuals acceptable for the same
22175reason so many people consider proprietary software acceptable: they
22176judge in purely practical terms, not using freedom as a
22177criterion. These people are entitled to their opinions, but since
22178those opinions spring from values which do not include freedom, they
22179are no guide for those of us who do value freedom.
22180
22181Please spread the word about this issue. We continue to lose manuals
22182to proprietary publishing. If we spread the word that proprietary
22183manuals are not sufficient, perhaps the next person who wants to help
22184GNU by writing documentation will realize, before it is too late, that
22185he must above all make it free.
22186
22187We can also encourage commercial publishers to sell free, copylefted
22188manuals instead of proprietary ones. One way you can help this is to
22189check the distribution terms of a manual before you buy it, and prefer
22190copylefted manuals to non-copylefted ones.
22191
22192@sp 2
22193@noindent
22194Note: The Free Software Foundation maintains a page on its Web site
22195that lists free books available from other publishers:@*
22196@uref{http://www.gnu.org/doc/other-free-books.html}
22197
22198@node GNU Free Documentation License, Index, Free Software and Free Manuals, Top
22199@appendix GNU Free Documentation License
22200
22201@cindex FDL, GNU Free Documentation License
e41dfb1e 22202@include doclicense.texi
8cda6f8f
GM
22203
22204@node Index, About the Author, GNU Free Documentation License, Top
22205@comment node-name, next, previous, up
22206@unnumbered Index
22207
22208@ignore
22209MENU ENTRY: NODE NAME.
22210@end ignore
22211
22212@printindex cp
22213
22214@iftex
22215@c Place biographical information on right-hand (verso) page
22216
22217@tex
a9097c6d 22218\par\vfill\supereject
8cda6f8f 22219\ifodd\pageno
8cda6f8f
GM
22220 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
22221 \global\oddheadline={\hfil} \global\oddfootline={\hfil}
a9097c6d 22222 %\page\hbox{}\page
8cda6f8f 22223\else
a9097c6d 22224% \par\vfill\supereject
8cda6f8f
GM
22225 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
22226 \global\oddheadline={\hfil} \global\oddfootline={\hfil}
a9097c6d
KB
22227 %\page\hbox{}%\page
22228 %\page\hbox{}%\page
8cda6f8f
GM
22229\fi
22230@end tex
22231
a9097c6d 22232@c page
8cda6f8f
GM
22233@w{ }
22234
22235@c ================ Biographical information ================
22236
22237@w{ }
22238@sp 8
22239@center About the Author
22240@sp 1
22241@end iftex
22242
22243@ifnottex
22244@node About the Author, , Index, Top
22245@unnumbered About the Author
22246@end ifnottex
22247
22248@quotation
22249Robert J. Chassell has worked with GNU Emacs since 1985. He writes
22250and edits, teaches Emacs and Emacs Lisp, and speaks throughout the
22251world on software freedom. Chassell was a founding Director and
22252Treasurer of the Free Software Foundation, Inc. He is co-author of
22253the @cite{Texinfo} manual, and has edited more than a dozen other
22254books. He graduated from Cambridge University, in England. He has an
22255abiding interest in social and economic history and flies his own
22256airplane.
22257@end quotation
22258
a9097c6d
KB
22259@c @page
22260@c @w{ }
22261@c
22262@c @c Prevent page number on blank verso, so eject it first.
22263@c @tex
22264@c \par\vfill\supereject
22265@c @end tex
22266
22267@c @iftex
22268@c @headings off
22269@c @evenheading @thispage @| @| @thistitle
22270@c @oddheading @| @| @thispage
22271@c @end iftex
8cda6f8f
GM
22272
22273@bye
22274
22275@ignore
22276 arch-tag: da1a2154-531f-43a8-8e33-fc7faad10acf
22277@end ignore